AVR单片机快速入门
上QQ阅读APP看书,第一时间看更新

2.6 ATmega16单片机的工作状态

对采用单片机所构成的嵌入式电子系统来讲,单片机芯片构成了嵌入式系统的“心脏”,整个系统的正常工作是由单片机来控制、指挥和协调的。可以这样简单地理解:将一块单片机,加上必要的外围电路(如发光二极管、显示器、继电器、按键键盘等),以及根据一定功能要求和硬件电路编写的系统运行程序,三者有机的结合,就能组成各种类型、各种功能、千姿百态的电子系统和产品。如果把电子产品比喻为人,那么单片机就是人的大脑和心脏,外围电路就如同人的五官和四肢,电路板上的路线如同人的神经系统,而系统运行程序就代表人的知识、思维、判断和反应。外围电路通过各种不同的传感器,测量和获取到现实世界的状态(如温度、转速、压力),这些状态值经过线路传送到单片机中,由单片机中的程序进行计算和判断,然后再发出控制信号到外围电路,外围的控制机构产生正确的动作。

AVR单片机的工作状态通常包括:复位状态、正常程序执行工作状态、休眠节电工作状态、程序运行代码下载的编程,以及熔丝位的配置。用户必须非常熟悉和了解AVR单片机的这些工作状态和它们之间的转换关系。

2.6.1 AVR单片机最小系统

一个单片嵌入式系统的核心,其实就是一个单片机最小系统。它仅仅由一片单片机芯片、两个电阻、一个石英晶体和两个电容构成,如图2-13所示。

图2-13所示的几个器件所构成的最小系统,就是一颗单片嵌入式系统完整的“心脏”和“大脑”,已经可以工作了。学过51单片机的读者可能会发现,这个最小系统里没有复位电路和晶振。是的,在前文中已经讲到,AVR单片机出厂熔丝配置成内部RC 1MHz时钟,当然AVR单片机内部还带有上电复位电路,所以最小系统才会这么简单。

978-7-111-36320-0-Chapter02-17.jpg

图2-13 ATmega16最小系统电路图

2.6.2 AVR单片机的复位源和复位方式

复位是单片机芯片本身的硬件初始化操作,例如,单片机在上电开机时都需要复位,以便CPU以及其他内部功能部件都处于一个确定的初始状态,并从这个初始状态开始工作。

除了系统上电的正常复位初始化之外,当系统程序在运行中出现错误或受到电源的干扰出现错误时,也可通过外部引脚RESET进行人工复位,或由芯片内部看门狗定时器(WDT)自动复位,或由芯片内部掉电检测(BOD)来使系统自动进入复位初始化操作。

图2-14所示的电路给出了ATmega16系统的复位逻辑,表2-2给出了复位电特性的参考值。

978-7-111-36320-0-Chapter02-18.jpg

图2-14 ATmega16系统复位逻辑图

ATmega16单片机共有5个复位源,如下所示:

1)上电复位。当系统电源电压低于上电复位门限VPOT时,MCU复位。

2)外部复位。当外部引脚RESET为低电平,且低电平持续时间大于1.5μs时,MCU复位。

3)掉电检测(BOD)复位。BOD使能时,且电源电压低于掉电检测复位门限(4.0V或2.7V)时,MCU复位。

4)看门狗复位。WDT使能时,并且WDT超时溢出时,MCU复位。

5)JTAG AVR复位。当使用JTAG接口时,可由JTAG口控制MCU复位。

表2-2 系统复位电参数

978-7-111-36320-0-Chapter02-19.jpg

当任何一个复位信号产生时,AVR单片机将进行复位操作。复位操作过程并不需要时钟源处于运行工作状态(AVR单片机采用异步复位方式,提高了可靠性)。在MCU复位过程中,所有的I/O寄存器被设为初始值,程序计数器(PC)置0。当系统电压高于上电复位门限VPOT(或BOD复位门限电压)时,复位信号撤销,硬件系统Delay Counters将启动一个可设置的计数延时过程(延时时间为tTOUT,由一组熔丝位SUT、CKSEL确定)。经过一定的延时后,AVR单片机才进行系统内部真正的复位启动。采用这种形式的复位启动过程,能够保证电源电压在达到稳定后单片机才进入正常的指令操作。

AVR单片机复位启动后,由于程序计数器(PC)置为$0000,因此CPU取出的第一条指令就是在Flash存储器空间的$0000处,即复位后系统程序从地址$0000处开始执行(指非BOOT LOAD方式启动)。通常在$0000地址中放置的指令为一条相对转移指令RJMP或JMP,跳到主程序的开始。这样,系统复位启动后,首先执行$0000处的跳转指令,然后转到执行主程序的指令。

由此可见,AVR单片机的复位过程考虑得非常周到,也是非常可靠的。AVR单片机采用5个复位源,异步复位操作,以及内部可设置的延时启动,大大提高了芯片的抗干扰能力和整个系统的可靠性,这在工业控制中非常重要,同时也是AVR单片机的优点之一。与此同时,AVR单片机内部的MCU控制和状态寄存器MCUCSR还将引起复位的复位源进行了记录,用户程序启动后,可以读取MCUCSR中的标记,查看复位是由于何种情况造成的,是正常复位还是异常复位,从而根据实际情况执行不同的程序,实现不同的处理。这对于实现高可靠的系统控制、掉电保护处理、故障处理等应用非常有用,具体请参考AVR单片机的器件手册说明。

1.上电复位

AVR单片机内部含有上电复位(Power On Reset,POR)电路。POR电路确保了只有当VCC超过一个安全电平时,器件才开始工作,如图2-15、图2-16所示。

无论何时,只要VCC低于检测电平VPOT时,器件进入复位状态。一旦当VCC超过门限电压VPOT,而RESET电压也达到VRST时,将启动芯片内部的一个可设置的延时计数器。在延时计数器溢出之前,器件一直保持复位状态(保持高电平)。经过tTOUT时间后,延时计数器溢出,将内部复位信号拉低,CPU才开始正式工作。

2.外部复位

外部复位是由外加在RESET引脚上的低电平产生的。当RESET引脚被拉低于VRST的时间大于1.5μs时即触发复位过程,如图2-17所示。当RESET引脚电平高于VRST后,将启动内部可设置的延时计数器。在延时计数器溢出之前,器件一直保持复位状态(保持高电平)。经过tTOUT时间后,延时计数器溢出,将内部复位信号拉低,CPU才开始正式工作。

978-7-111-36320-0-Chapter02-20.jpg

图2-16 MCU上电复位启动,RESET由外部控制

978-7-111-36320-0-Chapter02-21.jpg

图2-17 外部RESET复位

3.掉电检测(BOD)复位

ATmega16有一个片内的BOD(Brown Out Detection)电源检测电路,用于在系统运行时对系统电压VCC的检测,并与一个固定的阈值电压相比较。BOD检测阈值电压可以通过BODLEVEL熔丝位设定为2.7V或4.0V。BOD检测阈值电压有迟滞效应,以避免系统电源的尖峰毛刺误触发BOD检测器。阈值电平的迟滞效应可以理解为上阈值电压VBOT+=VBOT+VHYST/2,下阈值电压VBOT-=VBOT-VHYST/2。

BOD检测电路可以通过编程BODEN熔丝位来置成有效或者无效。当BOD被置成有效,并且VCC电压跌到下阈值电压VBOT-(见图2-18)以下时即触发复位过程,CPU进入复位状态。当VCC回升,而且超过上阈值电压VBOT+后,再经过设定的启动延时时间,CPU重新启动运行。注意,只有当VCC电压低于阈值电压并且持续tBOD后,BOD电路才启动延时计数器计数。

978-7-111-36320-0-Chapter02-22.jpg

图2-18 掉电检测(BOD)复位

4.看门狗复位

ATmega16片内还集成一个独立的看门狗定时器(WDT)。该WDT由片内独立的1MHz振荡器提供时钟信号,并且可用专用的熔丝位或由用户通过指令控制WDT的启动和关闭,以及设置和清零计数值。当WDT启动计数后,一旦发生计数溢出,它将触发产生一个时钟周期宽度的复位脉冲。脉冲的上升沿将使器件进入复位状态,脉冲的下降沿启动延时计数器计数,经过设定的启动延时时间,CPU重新开始运行(见图2-19)。使用WDT功能,可以防止系统受到干扰而引起的程序运行紊乱和跑飞,提高了系统的可靠性。

978-7-111-36320-0-Chapter02-23.jpg

图2-19 WDT溢出复位

2.6.3 对AVR单片机的编程下载

现在,单片机系统程序的编写、开发和调试都是借助于个人计算机(PC)完成的。用户首先在PC上通过使用专用单片机开发软件平台,编写由汇编语言或高级语言构成的系统程序(源程序),再由编译系统将源程序编译成单片机能够识别和执行的运行代码(目标代码)。运行代码的本身是一组二进制的数据,在PC中对于纯二进制码的数据文件一般是采用BIN格式保存的,以“bin”作为文件的扩展名。但是实际使用中,通常使用的是一种带定位格式的二进制文件(HEX格式的文件),一般以“hex”作为文件的扩展名。

对单片机的编程操作,通常也称为程序下载,是指以特殊手段和软硬件工具,对单片机进行特殊的操作,以实现下面的3种功能:

1)将在PC上生成的该单片机系统程序的运行代码写入单片机的程序存储器中。

2)用于对片内的Flash、EEPROM进行擦除、数据的写入(包括运行代码)和数据的读出。

3)实现对AVR单片机配置熔丝位的设置、芯片型号的读取、加密位的锁定等。

AVR单片机支持多种形式的编程下载方式:

(1)高压并行编程方式

对于外围引脚数大于20的AVR单片机芯片,一般都支持这种高压并行编程方式。这种编程方式也是最传统的单片机的程序下载方式,其优点是编程速度快。但使用这种编程方式需要占用芯片众多的引脚和12V的电压,所以必须采用专用的编程器单独对芯片操作。这样AVR单片机芯片必须从PCB上取下来,不可以实现芯片在线(板)的编程操作,因此这种方式不适合系统调试过程以及产品的批量生产需要。

(2)串行编程方式(ISP)

串行编程方式是通过AVR单片机芯片本身的SPI或JTAG串行口实现的,由于编程时只需要占用比较少的外围引脚,所以可以实现芯片的在系统编程(In System Programmable,ISP),不需要将芯片从PCB上取下来,所以串行编程方式也是最方便和最常用的编程方式。

串行编程方式还细分成SPI、JTAG方式,前者表示通过芯片的SPI串口实现对AVR单片机芯片的编程操作,后者则是通过JTAG串口来实现的。AVR单片机的许多芯片都同时集成有SPI和JTAG两种串口,因此可以同时支持SPI和JTAG的编程。使用JTAG方式编程的优点是,通过JTAG串口还可以实现系统的在片实时仿真调试(On Chip Debug),缺点是需要占用AVR单片机的4个I/O引脚。而采用SPI方式编程,只需要一根简单的编程电缆,同时可以方便地实现I/O口的共用,因此是最常使用的方式。其不足之处是不能实现系统的在片实时仿真调试。

(3)其他编程方式

一些型号的AVR单片机还支持串行高压编程方式和IAP(In Application Programmable,在应用编程)方式。串行高压编程是替代并行高压编程的一种方式,主要针对8个引脚的Tiny系列的AVR单片机使用。IAP方式则是采用了ATMEL公司称为自引导加载(Boot Load)技术实现的,往往在一些需要进行远程修改更新系统程序,或动态改变系统程序的应用中才采用。

ATmega16片内集成了16KB的支持系统在系统编程(ISP)和在应用编程(IAP)的Flash程序存储器,以及512B的EEPROM数据存储器。另外,在它的内部,还有一些专用的可编程单元熔丝位,用于加密锁定和对芯片的配置等。对ATmega16编程下载操作,就是在片外对上述的存储器和熔丝单元进行读/写(烧入)以及擦除的操作。

由于ATmega16片内含有SPI和JTAG串口,所以对ATmega16能使用3种编程的方式:高压并行编程、串行SPI编程、串行JTAG编程。在本书中将主要介绍和采用串行SPI编程方式。

2.6.4 ATmega16的熔丝位

在AVR单片机内部有多组与器件配置和运行环境相关的熔丝位,这些熔丝位非常重要,用户可以通过设定和配置熔丝位,使AVR单片机具备不同的特性,以更加适合实际的应用。下面只介绍在开始学习和使用ATmega16时,需要特别注意和关心的重要熔丝位的使用配置。

ATmega16单片机在售出时,片内的Flash存储器和EEPROM存储器阵列是处在擦除的状态(即内容为$FF),且可被编程。同时其器件配置熔丝位的默认值为使用内部1MHz的RC振荡源作为系统时钟。

1.存储器加密锁定位

ATmega16有2个加密锁定位LB1和LB2,用于设定对片内存储器的加密方式,用户可在编程方式下,对LB1、LB2不编程(1),或编程(0),从而获得对片内存储器不同的加密保护方式,见表2-3。

表2-3 加密锁定位保护方式

978-7-111-36320-0-Chapter02-24.jpg

需要进一步说明的是:

1)在AVR单片机的器件手册中,使用已编程(Programmed)和未编程(Unpro-grammed)定义加密位和熔丝位的状态。“Unprogrammed”表示熔丝状态为“1”(禁止),“Programmed”表示熔丝状态为“0”(允许),即1:未编程;0:编程。

2)AVR单片机的加密位和熔丝位可多次编程,不是OPT熔丝。

3)AVR单片机芯片加密锁定后(LB2/LB1=1/0,0/0),在外部不能通过任何方式读取芯片内部Flash和EEPROM中的数据,但熔丝位的状态仍然可以读取,不能修改配置。

4)需要重新下载程序时,或芯片被加密锁定后,或发现熔丝位配置不对,都必须先在编程状态使用芯片擦除命令,清除芯片内部存储器中的数据,同时解除加密锁定。然后重新下载运行代码和数据,修改和配置相关的熔丝位,最后再次配置芯片的加密锁定位。

5)编程状态的芯片擦除命令是将Flash和EEPROM中的数据清除,并同时将两位锁定位状态配置成无锁定状态(LB2/LB1=1/1)。但芯片擦除命令并不改变其他熔丝位的状态。

6)下载编程的正确的操作程序是:在芯片无锁定状态下,下载运行代码和数据,配置相关的熔丝位,最后配置芯片的加密锁定位。

2.系统时钟类型的配置

ATmega16可以使用多种类型的系统时钟源,最常用的为2种:使用内部的RC振荡源(1MHz/2MHz/4MHz/8MHz)和外接晶体(晶体可在0~16MHz之间选择)配合内部振荡放大器构成的振荡源。具体系统时钟类型的配置由CKOPT和CKSEL 3..0共5个熔丝设定,表2-4、表2-5给出了具体的配置值。用户在使用中,首先要根据实际使用情况进行正确的设置,而且千万注意不要对这些熔丝位误操作。

表2-4 系统时钟类型为使用内部RC振荡源

978-7-111-36320-0-Chapter02-25.jpg

AVR单片机提供了用户更多的灵活选择系统时钟的可能性,以满足和适合实际产品的需要。

ATmega16在片内集成有内部可校准的RC振荡器,能提供固定的1MHz/2MHz/4MHz/8MHz的系统时钟,这些频率是在5V、25℃时的标称数值。CKOPT和CKSEL熔丝按表2-4编程配置时,可以选择4种内部RC振荡源之一作为系统时钟使用,此时将不需要外部的元件。

当产品对系统时钟的精度要求比较高,或需要使用一些特殊频率的系统时钟场合时,如使用了USART通信接口,系统时钟频率需要使用4.6080MHz/7.3728MHz/11.0592MHz时,就要采用第2种方式来组成系统时钟源:使用外接晶体(晶体可在0~16MHz之间选择)配合内部振荡放大器构成振荡源,具体连接电路如图2-6a所示。此时需要将CKOPT和CKSEL熔丝按表2-5编程配置。

表2-5 使用外部晶体与片内振荡放大器构成的振荡源

978-7-111-36320-0-Chapter02-26.jpg

在表2-5中,当CKOPT=0时,振荡器的输出振幅较大,容易起振,适合在干扰大的场合以及使用的晶体超过8MHz时的情况下使用。而CKOPT=1时,振荡器的输出振幅较小,这样可以减小对电源的消耗,对外的电磁辐射也较小。

2.6.5 AVR单片机的工作状态

当AVR单片机芯片的VCC与系统电源接通后,根据RESET引脚的电平值的不同,单片机将进入不同的状态:复位状态、常规工作状态、编程状态。

1.RESET引脚电平为高

在通常情况下,RESET引脚通过一个上拉电阻接系统电源,为高电平“1”。在此条件下,一旦接通电源,AVR单片机将进入上电复位状态。经过短暂的内部复位操作后,芯片便进入了常规的工作状态(BOD和WDT引起的复位类同)。

AVR单片机处在常规工作状态时,有两种工作方式:正常程序执行工作方式和休眠节电工作方式。

(1)正常程序执行工作方式

正常程序执行工作方式是单片机的基本工作方式。由于硬件的复位操作将程序计数器置为零(PC=$0000),因此程序的执行总是从Flash地址的$0000开始的(指非BOOT LOAD方式启动)。

对于ATmega16来讲,Flash地址的$0002~$0028是中断向量区,所以真正实际要开始运行的程序代码一般放在从$002A以后的程序地址空间中。标准的做法是在Flash的$0000单元中放置一条转移指令JMP或RJMP,使得CPU在复位重新启动后,首先执行该转移指令,跳过中断向量区,转到执行实际程序的开始处。典型的程序结构如下:

Flash空间地址 指令字 说明

$0000 JMP RESET ;复位中断向量

978-7-111-36320-0-Chapter02-27.jpg

(2)休眠节电工作方式

休眠节电工作方式是使单片机处于低功耗节电的一种工作方式。当单片机需要处于长时间等待外部触发信号,待有外部触发后才做相应的处理,或每隔一段时间才需要做处理的情况时,可以使用休眠节电工作方式,以减小对电源的消耗。CPU处于等待的时候(待机状态)可进入休眠节电工作方式,此时CPU暂停工作,不执行任何指令。在休眠节电工作方式中,只有部分单片机的电路处于工作状态,而其他的电路停止工作,这样就可节省单片机对电源消耗,形成系统的省电待机状态。一旦有外部的触发信号,或等待时间到,CPU从休眠状态中被唤醒,重新进入正常程序执行工作方式。

ATmega16有6种不同的休眠模式,每一种模式对应的电源消耗也不同,被唤醒的方式也有多种类型,用户可以根据实际的需要进行选择。

休眠节电工作方式对使用电池供电的系统非常重要,AVR单片机提供了更多的休眠模式,更加符合和适应实际的需要。如ATmega16处在掉电休眠模式状态,其本身的耗电量小于1μA。

2.RESET引脚电平为低

AVR单片机通电后,如果RESET引脚的电平被外部拉为低电平“0”,则芯片将进入和处在复位状态,如图2-16和图2-17所示。通常情况下,该复位状态一直延续到RESET引脚的低电平被撤销。一旦RESET恢复了高电平,AVR单片机将重新启动,进入常规工作状态。利用该特点可以实现对AVR单片机系统的人工复位或外部强制复位操作。

尤其需要说明的是,一旦RESET引脚的电平被外部拉低,当满足某些特殊条件后,芯片将进入编程状态。例如,如果芯片带有SPI接口,支持SPI串行编程,则通过以下方式将使芯片进入SPI编程状态:

1)外部将SPI口的SCK引脚拉低,然后外部在RESET引脚上施加一个至少为2个系统周期以上低电平的脉冲;

2)延时等待20ms后,由外部通过AVR单片机的SPI口向芯片下发允许SPI编程的指令。

在AVR单片机的器件手册的存储器编程(Memory Programming)一章中串行下载(Ser-ial Downloading)一节里,详细介绍了利用AVR单片机的SPI接口实现ISP编程的硬件连接、编程方式状态的进入过程和串行编程的命令等。

一旦芯片进入编程状态,就可以通过SPI口将运行代码写入AVR单片机的程序存储器,对片内的Flash、EEPROM进行擦除、数据的写入(包括运行代码)和数据的读出,以及实现对AVR单片机配置熔丝位的设置、芯片型号的读取和加密位的锁定等操作了。

2.6.6 支持ISP编程的最小系统设计

在本节中给出一个最基本的、典型的支持ISP编程的AVR单片机最小系统硬件图。尽管ATmega16的SPI和JTAG口都可以实现ISP在线编程,但采用SPI口实现ISP在线编程是常用的方式,因为这样不会造成AVR单片机的I/O口浪费。

如图2-13以ATmega16芯片构成的AVR单片机最小系统中,并没有考虑如何实现对AVR单片机的编程。如果完全按图2-13完成硬件系统后,要对AVR单片机编程时,就必须将芯片从PCB上取下,放到专用的编程设备上才能将系统的执行代码下载到芯片中,然后再将芯片插回到PCB上,对于系统调试和生产都非常不方便。

图2-20上增加了一个ISP编程下载口,该口的2、3、4、5脚与芯片SPI口的MOSI(PB5)、MISO(PB6)、SCK(PB7)和RESET引脚连接。当需要改动AVR单片机的熔丝位配置,或将编译好的运行代码烧入AVR单片机的FlashROM中时,就不需要将芯片从PCB上取下了。只要将一根简单的编程线插在该编程下载口上,利用PC就可以方便地实现上面的操作了。

如2.6.5中所介绍的,当PC对AVR单片机编程时,需要先将SCK和RESET引脚拉低,使AVR单片机芯片进入SPI编程状态,然后通过SPI口进行下载操作。所以,在设计AVR单片机系统硬件时,可考虑使用SPI口实现ISP的功能。

AVR单片机的PB5、PB6、PB7与编程下载口连接,在编程状态时这3个引脚用于下载操作。编程完成拔掉下载线,芯片进入正常工作后,PB5、PB6、PB7仍可作为普通的I/O口或AVR单片机的SPI口使用,受AVR单片机的控制,这是使用SPI口实现ISP功能的优点之一。需要注意的是,如果系统中使用了这3个引脚,PCB上这3个引脚已经与外围器件连接在一起的情况下,就需要对外围的连接情况进行分析。如果外围连接在上电情况时表现为强上拉或强下拉(最极端的情况为接高电平或GND),那么为了保证AVR单片机的SPI功能正常工作,应该如图2-20所示,串入3个隔离电阻,阻值在2kΩ左右。

978-7-111-36320-0-Chapter02-28.jpg

图2-20支持ISP编程的最小系统设计

对于不同的AVR单片机芯片,使用SPI方式进行下载编程的硬件连接口,操作命令和时序请参考与该器件相关器件手册中的详细说明,会有所变化(如ATmega128),但基本方式相同。与使用其他类型的单片机(如8051)一样,可以采用专用的写入设备进行编程下载,但AVR单片机提供了更方便的在线(ISP)串行下载的方法,用户只要制作一个简单的带隔离电路的下载线,就可直接使用PC的打印机口实现AVR单片机的Flash、EEPROM以及熔丝配置位进行编程操作。