单片机

在单片机编程过程中,经常会使用到中断。那么,什么是单片机中断,它与CPU的轮询有什么区别?在本文中,单片机开发工程师将对单片机中断和CPU轮询做个简单的介绍。

“单片机中断与CPU的轮询有什么区别"

中断

中断是一种硬件机制,在这种机制中,设备会通知CPU它需要引起注意。中断可以随时发生。因此,当CPU通过指示中断请求线收到中断信号时,CPU停止当前进程并通过将控制权传递给服务设备的中断处理程序来响应该中断。

轮询

轮询不是一种硬件机制,它是一种协议,CPU会稳定地检查该设备是否需要注意。无论设备告诉处理单元它希望进行硬件处理的位置如何,在轮询过程中,处理单元都会不断询问I/O设备是否希望进行CPU处理。CPU不断检查连接到其上的每个设备,以侦查是否有任何设备需要硬件注意。

每个设备都有一个指示命令就绪的位,指示该设备的状态,即该命令是否被硬件终止。如果命令位已准备就绪,则该命令已失效;否则,如果该位为零,则该命令无效。

让我们看看中断和轮询之间的区别:

  • 在中断时,设备会通知CPU它需要引起注意。而在轮询中,CPU会稳定地检查设备是否需要注意。
  • 中断不是协议,而是一种硬件机制。轮询不是硬件机制,而是协议。
  • 在中断中,该设备由中断处理程序提供服务。轮询时,该设备由CPU维修。
  • 断可以随时发生。轮询时,CPU会以固定或适当的间隔稳定地对设备进行投票。
  • 在中断中,中断请求线用作指示设备需要维修的指示。在轮询时,命令就绪位用作指示,表明设备需要维修。
  • 在中断中,一旦任何设备将其中断,处理器就会受到干扰。相反,在轮询中,处理器通过重复检查每个设备的命令就绪位来浪费无数的处理器周期。

来源:网络
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:
cathy@eetrend.com)。

围观 180

如今,运行实时操作系统(RTOS)的大型32位单片机(MCU)和微处理器(MPU)日益普及。不过,如果使用一个大型单片机处理复杂的应用,可能会在执行小型后台处理任务时遇到CPU资源方面的问题,这些任务虽然并不复杂,但十分耗时。8位和16位MCU等小型器件可用于减轻32位器件的工作负荷。

试想一下这样一个示例:将一个32位MCU用于控制汽车的非安全功能,如娱乐系统、环境照明和空调。此32位器件必须对其资源进行分配,以便处理与这些功能相关的所有任务。这样的任务还包括测量驾驶室内多个点的温度、打开/关闭空调系统、更新图形显示、处理用户输入、调整照明条件和播放音乐。即使对于大型32位器件,这些工作量也过于繁重。

但是,如果32位器件将部分任务负荷转移给几乎不需要监控的子处理器,每个子处理器仅负责处理其中的1或2个任务,那么这些任务会更易于管理。这可以释放主处理器上的CPU资源,从而降低软件的复杂性,同时提高性能并缩短执行时间。

这种解决方案与单片机中的外设有异曲同工之妙。外设是专用硬件的小型模块,可以添加新功能(例如运算放大器或模数转换器),也可以减少执行给定功能时CPU必须承担的工作量。在某些情况下,初始化后,外设可独立于CPU运行。

为了说明外设的优势,我们以产生脉宽调制(PWM)信号为例。要在没有专用外设的情况下产生PWM,只需将I/O线设为高电平,等待一定数量的周期后,将其设为低电平,再等待一段时间,然后重复操作。这会占用大量CPU周期,并且对于某些功能(如RTOS)来说,难以可靠地执行。相比之下,PWM外设允许CPU在执行其他任务的同时设置所需的波形参数。

今天推荐专家技术文章《部署处理特定任务的单片机来简化复杂设计》将介绍两个示例。第一个示例说明了减轻CPU密集型任务负荷的优势。在该案例中,使用了一个8位MCU来创建I/O扩展器。I/O扩展器并不复杂;然而,由于需要频繁处理中断,因此它们会占用大量的CPU时间。通过使用专用MCU来完成这项任务,大型32位器件可以减少I/O使用和需要处理的中断次数。此外,I/O扩展器的功能集可在软件中设置,因此支持针对应用进行定制和调整。

第二个示例以创建独立于CPU运行的电压频率(V/F)转换器为例,展示了独立于内核的外设的性能。在这个示例中,CPU的唯一功能是初始化外设并将调试打印消息发送到UART。在大型系统中,当V/F在后台运行时,CPU可以执行另一个简单的任务。

详阅请点击下载《部署处理特定任务的单片机来简化复杂设计》

来源:Microchip微芯
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 30

HMI(Human Machine Interface,人机接口)技术的发展要求产品更加设计精良和操作方便,以提高附加价值。因此,对于电容式触控传感器的需求越来越多,这种电容式触控传感器不仅需要能够根据外壳设计理念灵活采用木材或透明亚克力等各种材料作为操作面板,还需要能够通过LED显示屏引导用户操作等来实现良好的易用性。然而,有些用户即便想要引入电容式触控传感器,也难免会在着手评测时感到束手无措。

为此,瑞萨为RX系列单片机配套了Renesas Solution Starter Kit和Renesas Starter Kit等主板,以便广大用户能够快速评测电容式触控传感器。在本期文章中,我将为大家介绍一下如何使用最廉价和最基本的目标板,以简单的方式对电容式触控传感器进行初步评测。

目标板可以访问单片机的所有信号引脚且售价仅为3,000日元,简直是用于早期决策的最佳评测主板。传统目标板的规格无法安装触控传感器工作所需的LPF电容,因此很难对其进行评测,但是安装有最新RX140单片机的RX140目标板提供了用于连接LPF电容的切割图案,并做了一些改进,以方便进行触控传感器初步评测。

点击查看RX140 MCU的更多信息

点击查看RX140目标板的更多信息

首先,按照本主板线路图和用户手册中的说明,拆下与RX140单片机TSCAP端子连接的GPIO用0Ω电阻,安装触控传感器用电容和0Ω电阻。然后将排针安装到主板的通孔上,连接触控传感器用电极。有关电极制作方法,请参阅应用指南“*电容式触控电极设计指南”。

“最新型32位单片机RX140帮您轻松实现电容式触控传感器的初步评测"

*关于电容式触控电极设计指南的更多信息,请访问:

https://www2.renesas.cn/us/zh/document/apn/capacitive-sensor-microcontrollers-ctsu-capacitive-touch-electrode-design-guide

准备好主板后,启动瑞萨提供的集成开发环境e2 studio,创建新项目。项目创建时,选中“Use Smart Configurator”,即可轻松地配置单片机的时钟、端子、周边功能和下载驱动程序。此外,将电容式触控传感器开发辅助工具“*QE for Capacitive Touch”作为插件添加到项目中,即可在GUI中轻松地进行触控检测程序自动生成、测量值监测和参数调整等操作。有关使用电容式触控传感器编写程序的详细信息,请参阅应用指南“*使用QE和FIT进行电容式触控应用的开发”。

*关于QE for Capacitive Touch的更多信息,请访问:

https://www2.renesas.cn/cn/zh/software-tool/qe-capacitive-touch-development-assistance-tool-capacitive-touch-sensors

*关于使用QE和FIT进行电容式触控应用的开发的更多信息,请访问:

https://www2.renesas.cn/cn/zh/document/apn/rx-family-using-qe-and-fit-develop-capacitive-touch-applications-rev100

将程序写入RX140单片机后,开始调试时,可以通过QE for Capacitive Touch的监视窗口,实时直观地查看触控检测的状态。

“最新型32位单片机RX140帮您轻松实现电容式触控传感器的初步评测"

“最新型32位单片机RX140帮您轻松实现电容式触控传感器的初步评测"

瑞萨提供有丰富的软件和功能强大且易于使用的开发工具,助力用户开发工作。利用这些功能,任何人员都可以通过Target Board for RX140轻松地对电容式触控传感器进行评测。心动不如行动,快来一试吧!

来源:恩智浦MCU加油站
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 28

在2022年,随着智能手机、自动驾驶汽车和5G无线连接主导嵌入式设计市场,Microchip的8位PIC®和AVR®单片机(MCU)系列市场份额不断扩大。在过去50年里,8位MCU市场一直在稳步增长,Microchip每年的销量相当于西半球人手一件。为了支持持续的增长趋势,Microchip Technology Inc.(美国微芯科技公司)近日宣布推出5个新产品系列和60多款新独立器件,为嵌入式设计人员提供最常见问题的简单解决方案。

“Microchip发布多款应用于当今主流嵌入式设计的PIC®和AVR®单片机产品"

寻求创新设计的设计人员正转向利用Microchip的PIC和AVR单片机系列新产品。这些新产品拥有强大的处理能力,能够与其他芯片和模拟外设轻松通信,在构建时无需对印刷电路板(PCB)进行改动,就能实现超强配置。这些器件将类似ASIC的功能与简单的开发经验相结合,扩展了传统MCU的功能,并允许它们被配置为智能外设芯片。类似PIC16F171系列中的软件控制运算放大器、多电压输入/输出(MVIO)和带计算功能的模数转换器(ADCC)的智能外设,为原本不使用传统MCU的应用带来了新的价值。

使用不同电源电压芯片的系统经常需要跨越多个电压域(例如,将5V的 MCU连接到1.8V的传感器)。此类系统通常需要电平转换硬件,从而增加了成本。Microchip最新的8位MCU(包括AVR DD系列)中的MVIO外设允许MCU上的单个端口在与MCU其他部分不同的电压域中工作,从而无需额外的外部元件。

有些系统要求一定水平的速度和响应时间,这是基于软件的处理难以达到的。Microchip PIC和AVR产品系列的独立于内核的外设(CIP)可以用MPLAB®代码配置器(MCC)进行编程,以方便连接形成硬件处理链。这使得创建定制外设成为可能,从而消除了软件处理的周期时间。例如,通过配置一个由脉宽调制器(PWM)、SPI接口和可配置逻辑单元(CLC)组成的超级外设,即可轻松控制一个需要独特时序才能正确驱动的WS2812 LED阵列。

随着8位PIC和AVR MCU器件市场的持续增长,Microchip通过坚持其产品组合和支持结构中的强大基本功能,持续响应客户的长期需求。PIC和AVR MCU非常容易用于设计,其支持网络使Microchip的客户能缩短实现收益的时间。8位MCU产品组合是引脚(pin-to-pin)兼容的,当需要更高性能或客户希望最大限度地提高产品供货,同时尽量减少重新设计的要求时,可以选择替代的PIC或AVR MCU。

Microchip 8位单片机业务部营销副总裁Greg Robinson表示:“PIC和AVR MCU非常受欢迎,它们的设计能够满足我们客户对当前以及未来应用的要求。我们还为8位PIC和AVR MCU建立了强大的供应链,绝大部分都在Microchip自有工厂中生产。这使我们能够以业内不常有的方式控制生产过程。”

开发工具

Microchip提供由硬件和软件工具组成的完整开发生态系统,包括MPLAB® X和MPLAB® Xpress集成开发环境(IDE)以及MPLAB®代码配置器(MCC),后者提供直观的图形界面,为基于8位MCU的项目生成生产就绪的安装和应用代码。

供货

所有5个产品系列目前都已提供样片,如需了解更多信息,请点击此处

Microchip Technology Inc. 简介

Microchip Technology Inc.是致力于智能、互联和安全的嵌入式控制解决方案的领先供应商。 其易于使用的开发工具和丰富的产品组合让客户能够创建最佳设计,从而在降低风险的同时减少系统总成本,缩短上市时间。Microchip的解决方案为工业、汽车、消费、航天和国防、通信以及计算市场中12万多家客户提供服务。Microchip总部位于美国亚利桑那州Chandler市,提供出色的技术支持、可靠的产品交付和卓越的质量。详情请访问公司网站www.microchip.com

来源:Microchip
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 39

摘 要

本文介绍了RA6M1单片机在电动汽车交流充电桩的应用及快速开发过程。

电动汽车交流充电桩

交流充电桩俗称“慢充”,交流单相充电桩(一般最大额定功率为7kW),充电桩一般与交流电网(市电)连接。交流充电桩主要适用于为小型纯电动汽车或可插电混合动力电动汽车充电,为电动汽车车载充电机提供交流电源的供电装置,相当于只是起了一个控制电源的作用。

根据不同车辆电池容量,车辆充满电的时间一般需要3至8个小时。根据交流充电桩系统实际需求,一般会搭配两颗ARM Cortex M4内核以上的MCU,其中一颗为主要核心MCU,用于整桩控制,包含充电控制、电能计量、计费单元控制和通信传输;另一颗MCU用于在无网络状态使用,可搭配射频卡或Wi-Fi使用,一般应用于个体使用或企业内部使用。

整体交流充电桩使用的外设及资源包含:GPIO、ADC、PWM、IIC、UART和USB等资源。Renesas RA6M1 MCU,性能非常适合本设计的要求。

RA6M1

  • 100Pin的QFP封装

  • ARM Cortex M4内核的MCU带有DSP等功能

  • 丰富的GPIO和外设资源;

  • 120MZH的主频

  • 带有512kB Flash和256kB SRAM,可以减少片外FLASH的需求,可以将关键数据存储在内部Data Flash中。

交流充电桩的设计框图如图1及部分硬件原理图如图2所示:

“图1
图1 交流充电桩原理图

模块功能介绍

  • GPIO和光耦控制继电器的开合

  • PWM监测汽车的CP信号

  • ADC采集高压信号

  • UART用于射频非接卡和LCD等通讯

  • 温湿度监测和4G模组

  • Data Flash 使用

  • PWM监测电动汽车的CP信号模块介绍

交流充电桩的CP信号是用于监控电动汽车和充电桩交互的功能的信号,它是由MCU发出的PWM信号。CP信号的幅值范围是±12V,PWM信号的占空比表示当前充电桩为电动汽车提供的最大充电电流数据,当PWM为1kHz,53%占空比的时候,可以为电动汽车提供32A的充电电流。

● UART用于射频非接卡和LCD等通讯模块介绍

LCD选用迪文的触摸液晶屏,主要用于人机界面显示和急停按钮反馈,LCD屏幕输出充电桩当前的信息,包含输出电压、电流、充电量和费用清单等。

射频非接卡是预留的交互接口,为交流充电桩可配置选型,当交流充电桩的终端用户为个体或企业内部使用时候,无需计费单元和联网功能,可使用射频非接卡可以进行自助充电,完全可以脱离网络对电动汽车进行充电。

● GPIO和光耦控制继电器的开合

由于整个系统采用交流220V供电,为了提高系统的稳定性GPIO的输出控制全部带有光耦,同时使用MOS和继电器控制电源的通断。

● 温湿度监测和4G模组

板级温湿度监测, 主要用于监测PCB的板载温度,由于整板采用交流220V电源供电,同时后续电路有多颗LDO,使用温湿度传感器监测整板温度异常和安装环境的湿度异常,当发生异常后MCU将关闭充电功能,保证系统的稳定性和安全性。

● Data Flash

Data Flash主要用于记录在断网状态下充电桩的结算数据和异常数据记录,保证客户在使用过程中即便发生无网络连接状态客户的充电数据信息都可以记录。

“图2
图2 交流充电桩部分原理图

在硬件设计完成后,开始进行软件程序编写,Renesas IDE是e2 studio,调试器是E2-lite,官方文档很详细,基本上熟悉一天的话,底层的驱动及应用就可以上手了,同时Renesas给出了很多例程都可以快速的导入到IDE里面,在新建工程时建议将编译工具链选择最新版本,不仅编译速度快而且电脑不卡。在不到60天的时间内,我完成了样机的Demo调试,性能完全满足要求。

在使用过Renesas的MCU后,感觉Renesas基于ARM Cortex M内核的MCU在功能和IDE方面非常好用,无论在硬件软件上Renesas MCU都是值得选择的单片机,从此开始了我的Renesas MCU开发之路。

来源: 瑞萨MCU小百科
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 353

大小端及字节序在嵌入式软件开发过程中经常会遇到,数据传输、存储、通信等这些地方都会牵涉到,下面就来给大家分享一下相关知识。

回顾字节序

字节序,即字节在电脑中存放时的序列与输入(输出)时的序列是先到的在前还是后到的在前。
---来自百度百科

拿数据 0x01020304为例:

在大端CPU中:数据将存储为0x01(address + 0),0x02(address + 1),0x03(address + 2),0x04(address + 3)。

在小端CPU中:数据将存储为0x04(address + 0),0x03(address + 1),0x02(address + 2),0x01(address + 3)。

“单片机大小端转换的几点小技巧"

如果你的程序使用简单的数据结构(例如“ int”和“ short”),则没有什么麻烦。但是,如果数据结构类似于以下示例,则可能会遇到问题。

union {
 unsigned int dat;
 unsigned char c[4]; 
}X;

void foo( ) {
 int t0;
 X.dat = 0x01020304;
 t0 = X.c[0];
 ・・・
}

在大端 CPU 中编译并执行此代码时, t0”的值为0x01。在小端CPU中, t0”的值为0x04。

那么问题来了:要想使存储顺序从大端,变为小端,怎么办呢?

方法其实有很多种,这里讲讲针对IAR的两种方法:

  • 使用__big_endian关键字。

  • 使用__REV, __REV16, __REVSH, RBIT函数。

使用__big_endian关键字

IAR中__big_endian关键字提供了一种方便的方式来将应用程序从big-endian移植到little-endian。

__big_endian关键字用于访问以big-endian字节顺序存储的变量,而与应用程序其余部分使用的字节顺序无关。在ARMv6或更高版本进行编译时,可以使用__big_endian关键字。

只需添加__big_endian关键字即可,如:

____big_endian union {
 unsigned int dat;
 unsigned char c[4]; 
}X;

void foo( ) {
int t0;
X.dat = 0x01020304;
t0 = X.c[0];
・・・
}

修改后的代码在低位字节CPU中编译和执行,变量“ t0”为0x01。

注意:此关键字不能用于指针。同样,此属性不能在数组上使用。

同时,关键字__big_endian插入REV指令以交换字节数据,REV指令的插入会影响代码大小和执行时间。

“单片机大小端转换的几点小技巧"

关键字具有限制,不能应用于复杂的数据结构,比如以下代码会生成错误:

__big_endian
union {
 unsigned long dat;
 unsigned char c[4];
 struct {
 unsigned long a0: 1;
 unsigned long a1: 1;
 unsigned long a2: 2;
 unsigned long a3: 4;
 unsigned long a4: 8;
 unsigned long a5: 16;
 }s;
} f1_dat2;

使用__REV, __REV16, __REVSH, RBIT函数

大端和小端之间的字节顺序差异只是顺序,因此我们需要做的是更改字节顺序,我们再次以变量0x01020304为例:

“单片机大小端转换的几点小技巧"

我们可以通过代码实现交换功能,比如:

typedef unsigned long uint32_t;
uint32_t bswap_32(uint32_t x) {
  uint32_t t = x;
  uint32_t s;
  s = ( (((uint32_t)(t) & (uint32_t)0x000000ffUL) << 24) |
    (((uint32_t)(t) & (uint32_t)0x0000ff00UL) << 8) | 
     (((uint32_t)(t) & (uint32_t)0x00ff0000UL) >> 8) | 
 (((uint32_t)(t) & (uint32_t)0xff000000UL) >> 24) );
 return s; 
}

通过这种方式实现,将导致消耗更多时间和代码大小。

在C代码中,我们通常编写内联汇编代码实现交换。IAR有种内部函数可以实现该功能。

比如下面交换功能:

“单片机大小端转换的几点小技巧"

代码如下:

#include <intrinsics.h>
void x1( void ) {
s2 = __REV(s1);
s3 = __REV16(s1);
s4 = __REVSH(s1);
}

以上就是在IAR中实现大小端字节序的迁移方法,感兴趣的读者可以在IAR中编码测试一下。

来源:嵌入式专栏
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 729

作者:安西拓也(IoT Product Engineer)

近年来,工业和民用设备的控制器部分开始重视用户界面(UI)的操作卫生性。空调遥控器也不例外,开发人员正逐步考虑加入易于维护的触控式按键、非接触式控制设备的语音识别、云端远程控制等功能。估计今后将会有越来越多的开发人员从事配备有上述功能的产品开发。

另一方面,现有工业和民用设备主系统部分采用的单片机往往未配备用于实现上述UI(例如触控式按键和语音识别)的周边功能,而要实现这些功能需要额外的部件。

如果有一款单片机,其性能超越了当前采用的单片机,并且能够通过单个芯片实现上述功能,这将无疑是解决上述问题的不二选择。针对此,瑞萨推出了一系列32位单片机RX671。

RX671配备了用于触控式按键和语音识别的周边功能,且具有可实现云连接的性能(RXv3内核120MHz运行,闪存:2MB,SRAM:384KB),单个芯片即可实现这些功能。因此,与多芯片配置相比,可通过减少部件数量和简化系统缩短开发周期。

参考示例

接下来我将为大家介绍的是可帮助您实际评估这些功能的参考示例。本示例以实现空调控制的遥控功能为模型,可通过语音或触控式按键进行送风启动、模式更改和温度设定。此外,还可以与AWS合作,在云端查看设定温度,或者从云端更改设定温度。

使用本示例的最大好处是,您可以看到将多个功能合并到一个项目中的参考例子,而这恰恰是容易出错的地方。例如,语音识别要求在特定时间内执行语音处理任务,但配备多个功能时,其周期管理就是一个比较容易出错的地方。

本演示例将多个功能封装在一个项目中供大家测评。因此,通过参考该方法,可以快速解决上述课题,并缩短PoC开发和产品开发周期,降低工时。

另外,本示例还使用了市面上可购得的评测套件Renesas Starter Kit+ for RX671和云连接评测用Wi-Fi Pmod扩展板。

“32位单片机RX671评测参考示例:以单芯片实现触控式按键、语音识别和云连接功能"

诚如大家所见,以空调遥控器为代表的工业和民用设备的UI正逐渐从机械式按键转向触控式按键、语音识别,甚至是使用云连接的远程控制。为满足这一社会需求瑞萨特为大家准备了本示例以供测评,欢迎大家前来体验。

此外,在之前我们曾发布过一篇介绍RX671的文章,欢迎大家点击下方链接跳转查看。

工程师说 | 新型RX671微控制器, 满足物联网设备不断变化的需求​

来源:瑞萨电子
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 20

单片机运行时需要调用某个程序/函数/固定数据时就需要读取ROM,然后在RAM中执行这些程序/函数的功能,所产生的临时数据也都存在RAM内,断电后这些临时数据就丢失了。

ROM:(Read Only Memory)

程序存储器在单片机中用来存储程序数据及常量数据或变量数据。

凡是c文件及h文件中所有代码、全局变量、局部变量、const’限定符定义的常量数据、startup.asm文件中的代码通通都存储在ROM中。

RAM:(Random Access Memory)

随机访问存储器用来存储程序中用到的变量。

凡是整个程序中,所用到的需要被改写的量,都存储在RAM中,“被改变的量”包括全局变量、局部变量、堆栈段。

程序经过编译、汇编、链接后,生成hex文件。

用专用的烧录软件,通过烧录器将hex文件烧录到ROM中。

究竟是怎样将hex文件传输到MCU内部的ROM中的呢?

因此,这个时候的ROM中,包含所有的程序内容。

无论是一行一行的程序代码,函数中用到的局部变量,头文件中所声明的全局变量,const声明的只读常量,都被生成了二进制数据,包含在hex文件中,全部烧录到了ROM里面。

此时的ROM,包含了程序的所有信息,正是由于这些信息,“指导”了CPU的所有动作。

可能有人会有疑问,既然所有的数据在ROM中,那RAM中的数据从哪里来?

什么时候CPU将数据加载到RAM中?

会不会是在烧录的时候,已经将需要放在RAM中数据烧录到了RAM中?

要回答这个问题,首先必须明确一条:ROM是只读存储器,CPU只能从里面读数据,而不能往里面写数据,掉电后数据依然保存在存储器中;

RAM是随机存储器,CPU既可以从里面读出数据,又可以往里面写入数据,掉电后数据不保存,这是条永恒的真理,始终记挂在心。

清楚了上面的问题,那么就很容易想到,RAM中的数据不是在烧录的时候写入的。

因为烧录完毕后,拔掉电源,当再给MCU上电后,CPU能正常执行动作,RAM中照样有数据。

这就说明:RAM中的数据不是在烧录的时候写入的,同时也说明,在CPU运行时,RAM中已经写入了数据。

关键就在这里:这个数据不是人为写入的,CPU写入的,那CPU又是什么时候写入的呢?

听我娓娓道来,上面说到,ROM中包含所有的程序内容,在MCU上电时,CPU开始从第1行代码处执行指令。

这里所做的工作是为整个程序的顺利运行做好准备,或者说是对RAM的初始化(注:ROM是只读不写的),工作任务有几项:

1、为全局变量分配地址空间---à如果全局变量已赋初值,则将初始值从ROM中拷贝到RAM中。

如果没有赋初值,则这个全局变量所对应的地址下的初值为0或者是不确定的。

当然,如果已经指定了变量的地址空间,则直接定位到对应的地址就行,那么这里分配地址及定位地址的任务由“连接器”完成。

2、设置堆栈段的长度及地址---à用C语言开发的单片机程序里面,普遍都没有涉及到堆栈段长度的设置,但这不意味着不用设置。

栈段主要是用来在中断处理时起“保存现场”及“现场还原”的作用,其重要性不言而喻。

而这么重要的内容,也包含在了编译器预设的内容里面,确实省事,可并不一定省心。

3、分配数据段data,常量段const,代码段code的起始地址。

代码段与常量段的地址可以不管,它们都是固定在ROM里面的,无论它们怎么排列,都不会对程序产生影响。

但是数据段的地址就必须得关心。

数据段的数据时要从ROM拷贝到RAM中去的,而在RAM中,既有数据段data,也有堆栈段stack,还有通用的工作寄存器组。

通常,工作寄存器组的地址是固定的,这就要求在绝对定址数据段时,不能使数据段覆盖所有的工作寄存器组的地址。

必须引起严重关注!

这里所说的“第一行代码处”,并不一定是你自己写的程序代码,绝大部分都是编译器代劳的,或者是编译器自带的demo程序文件。

因为,你自己写的程序(C语言程序)里面,并不包含这些内容。

高级一点的单片机,这些内容,都是在startup的文件里面,仔细阅读,有好处的。

通常的做法是:普通的flashMCU是在上电时或复位时,PC指针里面的存放的是“0000”,表示CPU从ROM的0000地址开始执行指令,在该地址处放一条跳转指令,使程序跳转到_main函数中。

然后根据不同的指令,一条一条的执行,当中断发生时(中断数量也很有限,2~5个中断),按照系统分配的中断向量表地址,在中断向量里面,放置一条跳转到中断服务程序的指令,如此如此,整个程序就跑起来了。

决定CPU这样做,是这种ROM结构所造成的。

其实,这里面,C语言编译器作了很多的工作,只是,你不知道而已。

如果你仔细阅读编译器自带的help文件就会知道很多的事情,这是对编译器了解最好的途径。

I/O口寄存器:也是可以被改变的量,它被安排在一个特别的RAM地址,为系统所访问,而不能将其他变量定义在这些位置。

中断向量表:中断向量表是被固定在MCU内部的ROM地址中,不同的地址对应不同的中断。

每次中断产生时,直接调用对应的中断服务子程序,将程序的入口地址放在中断向量表中。

ROM的大小问题:对于flash类型的MCU,ROM空间的大小通常都是整字节的,即为ak*8bits。

这很好理解,一眼就知道,ROM的空间为aK。

但是,对于某些OTP类型的单片机,比如holtek或者sonix公司的单片机,经常看到数据手册上写的是“OTP progarming ROM 2k*15bit。。。。。”。

可能会产生疑惑,这个“15bit”认为是1个字节有余,2个字节又不足,那这个ROM空间究竟是2k,多于2k,还是4k但是少了一点点呢?

这里要明确两个概念:一个是指令的位宽,另一个是指令的长度。

指令的位宽是指一条指令所占的数据位的宽度;有些是8位位宽,有些是15位位宽。

指令长度是指每条指令所占的存储空间,有1个字节,有2个字节的,也有3个字节甚至4个字节的指令。

这个可以打个形象的比方:我们做广播体操时,有很多动作要做,但是每个复杂的动作都可以分解为几个简单的动作。

例如,当做伸展运动时,我们只听到广播里面喊“2、2、3、4、5、6、7、8”。

而这里每一个数字都代表一个指令。

听到“3”这个指令后,我们的头、手、腰、腿、脚分别作出不同的动作:两眼目视前方,左手叉腰,右手往上抬起,五指伸直自然并拢打开,右腿伸直,左腿成弓步······等等一系列的分解动作。

而要做完这些动作的指令只有一个“3”,要执行的动作却又很多,于是将多个分解动作合并成一个指令,而每个分解动作的“位宽”为15bits。

实事上也确实如此,当在反汇编或者汇编时,可以看到,复合指令的确是有简单的指令组合起来的。

到此,回答前面那个问题,这个OTP的ROM空间应该是2K,指令位宽为15位。

一般的,当指令位宽不是8的倍数时,则说明该MCU的大部分指令长度是一个字节(注:该字节宽度为15位,不是8位),极少数为2个或多个字节,虽然其总的空间少,但是其能容下的空间数据并不少。

来源:巧学模电数电单片机
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 103

目前常用的单片机中往往都配备了定时器/计数器。在AT89S52芯片内包含有三个16位的定时器/计数器:T0、T1和T2,其核心是加1计数器。我们主要要求掌握T0和T1的结构和功能。学习中要注意从电路结构上来理解功能的实现。定时器/计数器方式寄存器TMOD和定时器/计数器控制寄存器TCON是用以设定定时器/计数器的工作方式、定时或计数功能,控制启动或停止以及产生溢出中断的重要模块,应该对这两个寄存器中的逐位的定义和功能进行学习和掌握。

“图1:T0和T1的基本构成"
图1:T0和T1的基本构成

一、定时器/计数器的功能

AT89S52单片机定时器/计数器的基本部件是两个8位的计数器(T1计数器分为高8位TH1和低8位TL1,T0计数器的高8位是TH0,低8位是TL0)。如图1所示。

定时器/计数器的核心是一个加1计数器,在作定时器使用时,它对机器周期进行计数,每过一个机器周期计数器加1,直到计数器计满溢出。

当它用作对外部事件计数时,计数器接相应的外部输入引脚T0(P3.4)或T1(P3.5)并在每个机器周期的S5P2时采样,当采样到1—0的负跳变时,计数器加1。

二、定时器/计数器的结构

AT89S52单片机内部的定时/计数器的结构如图2所示。定时器T0由特殊功能寄存器TL0(低8位)和TH0(高8位)构成,定时器T1由特殊功能寄存器TL1(低8位)和TH1(高8位)构成。每个寄存器均可单独访问。

“图2
图2 定时器/计数器的内部结构

1、定时/计数的基本概念

定时和计数是日常生活和生产中最常见和最普遍的问题。

定时器和计数器功能基本上都是使用相同的逻辑实现的,而且这两个功能都包含输入的计数信号,本质上都是对脉冲计数。计数器用来计数并指示在任意间隔内输入信号(事件)的个数,而定时器则对规定间隔内输入的信号个数进行计数,用来指示经历的时间。

在单片机中,定时/计数器作定时功能用时,对机器周期计数(由单片机的晶体振荡器经过12分频后得到),因每次计数的周期是固定的,所以根据它计数的多少就可以很方便的计算出它计数的时间。如图3所示。

“图3
图3 计数与定时

2、溢出的基本概念

从一个生活中的例程看起:一个水盆在水龙头下,水龙头没关紧,水一滴滴地滴入盆中。盆的容量是有限的,水滴持续落下,盆中的水持续变满,最终有一滴水使得盆中的水满了,这就是“溢出”。

如果一个空的盆要1万滴水滴进去才会满,开始滴水之前可以先放入一部分水,叫做计数初值。如果现在要计数9000,那么可以先放入1000滴水,也就是计数初值为1000,再计数9000就可以溢出产生中断。

单片机中通常采用计数初值的办法,如果每个脉冲是1微秒,则计满256个脉冲需时256微秒,如果现在要定时100微妙,只要在计数器里面先放进156,然后计数100就可以就可以溢出产生中断了。如图4所示。

“图4
图4 定时器/计数器的溢出

3、定时/计数的主要方法

实现定时或计数,主要有三种方法。

(1)软件延时

软件延时利用微处理器执行一个延时程序段实现。因为微处理器执行每条指令都需要一定时间,通过指令的循环实现软件延时。软件定时具有不使用硬件的特点,但却占用了大量CPU时间。另外,软件定时精度不高,在不同系统时钟频率下,执行一条指令的时间不同,同一个软件延时程序的定时时间也会不同。

(2)硬件定时

硬件定时采用数字电路中的分频器将系统时钟进行适当分频产生需要的定时信号,也可以采用单稳电路或简易定时电路(如常用的555定时器)由外接RC(电阻、电容)电路控制定时时间。这样的定时电路较简单,利用不同分频倍数或改变电阻阻值、电容容值使定时时间在一定范围内改变。

(3)可编程的硬件定时

可编程定时器/计数器最大特点是可以通过软件编程来实现定时时间的改变,通过中断或查询方法来完成定时功能或计数功能。这种电路不仅定时值和定时范围可用程序改变,而且具有多种工作方式,可以输出多种控制信号,具备较强的功能。

来源:网络
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:
cathy@eetrend.com)。

围观 242

页面

订阅 RSS - 单片机