ATmega128内核采用了哈佛(Harvard)结构,如图1.2所示。它具有独立的数据和程序总线,程序指令通过流水线运行,在执行一条指令的同时读取下一条指令,这种方式实现了指令的单时钟周期运行。
图1.2 ATmega128单片机内核的结构
ATmega128单片机的程序存储器是可以在线编程的Flash内存,其快速访问寄存器由32个8位通用寄存器组成,访问时间为一个时钟周期。因此,ATmega128单片机可以实现单时钟周期的运算器操作。在典型的运算器操作中,两个分别位于不同通用寄存器中的操作数被同时访问,然后执行运算,结果再被送回到通用寄存器,整个指令执行过程仅需一个时钟周期。
ATmega128单片机的32个通用寄存器里有6个寄存器可以联合起来构成3个16位的X、Y、Z间接寻址寄存器,可以用来寻址数据空间以实现高效的地址运算,其中一个指针还可以作为程序存储器查询表的地址指针。
ATmega128单片机的算术与逻辑运算器(ALU)支持通用寄存器之间及通用寄存器和常数之间的算术与逻辑运算,ALU也可以执行单寄存器操作,当运算完成之后更新相应的状态寄存器的内容,以反映操作结果。ATmega128单片机通过有条件或无条件的跳转指令和调用指令来控制程序的工作流程,从而可以直接寻址整个地址空间。
ATmega128单片机的存储器空间为线性的平面结构,其程序存储器空间分为两个区:引导程序区和应用程序区。其I/O存储器空间中包含64个可以直接寻址的地址,作为ATmega128单片机外部设备的控制寄存器、SPI和其他I/O功能的控制地址,映射到数据空间,即寄存器文件之后的地址为0x20~0x5F;另外,ATmega128单片机在SRAM中还有可扩展的I/O空间,对应的地址为0x60~0xFF。
在ATmega128单片机响应中断时间和进入中断服务子程序时,其返回地址的程序计数器(PC)被保存于堆栈之中,堆栈位于通用数据SRAM中,因此其深度受限于SRAM的大小。在复位相关代码中,首先要初始化堆栈指针SP,这个指针位于I/O空间,可以进行读/写访问。ATmega128可以通过5种不同的寻址方式访问数据SRAM。
ATmega128单片机内置一个灵活的中断模块,其控制寄存器位于I/O空间内,并且有一个位于状态寄存器SREG中的全局中断使能位。每个中断在中断向量表里都有独立的中断向量,其优先级与该中断向量在中断向量表的位置有关,中断向量地址越低,其优先级越高。
ATmega128单片机的内核由算术逻辑单元ALU、状态寄存器SREG、通用寄存器、堆栈、RAM页码选择寄存器RAMPZ、中断和复位处理模块等构成。
算术逻辑单元(ALU)是ATmega128单片机内核中执行各种算术和逻辑运算操作的部件,其基本操作包括加、减、乘、除四则运算(算术运算),与、或、非、异或等逻辑操作(逻辑预算),以及移位、比较和传送等操作。ALU与32个通用工作寄存器直接相连,ATmega128单片机的寄存器与寄存器之间、寄存器与立即数之间的ALU运算只需要一个时钟周期。ALU的操作分为3类:算术、逻辑和位操作。此外,ALU还能支持有符号数和分数乘法。
ATmega128单片机的状态寄存器包含了最近执行的算术指令的相关结果信息,用户可以根据这些信息来实现条件操作,状态寄存器内部结构如表1.1所示。
注意
在进入中断服务程序时,状态寄存器不会自动保存;在中断返回时,也不会自动恢复,这些工作需要中断服务子程序的用户代码来处理。
表1.1 ATmega128单片机状态寄存器SREG的内部结构
● I:全局中断使能位。当I被置位时,使能全局中断,单独的中断使能由其他独立的控制寄存器控制;如果I被清零,则不论单独中断标志置位与否,都不会产生中断。任意一个中断发生后,I将被清零。而执行RETI(中断服务程序退出)指令后,I恢复置位,以使能中断。I也可以通过SEI(置位全局中断使能位)和CLI(清除全局中断使能位)指令来置位和清零。
● T:位复制存储位。位复制指令BLD和BST利用T作为目的地址或源地址,BST指令把寄存器的的某一位复制到T,而BLD把T复制到寄存器的某一位。
● H:半进位标志位。H被置位时,表示算术操作发生了半进位,此标志对于BCD运算非常有用。
● S:负数标志位,用于存放N与2的补码和溢出标志V的异或结果。
● V:补码溢出标志位,支持二进制补码运算。
● N:负数标志位,表明算术或逻辑操作结果为负。
● Z:零标志位,表明算术或逻辑操作结果为零。
● C:进位标志位,表明算术或逻辑操作发生了进位。
ATmega128单片机有32个通用寄存器,其针对ATmega128单片机的指令集进行了优化,支持以下的输入/输出方案。
● 输入为一个8位操作数,输出一个8位结果。
● 输入为两个8位操作数,输出一个8位结果。
● 输入为两个8位操作数,输出一个16位结果。
● 输入为一个16位操作数,输出一个16位结果。
图1.3所示为ATmega128单片机的通用寄存器结构示意图。每个通用寄存器都有一个对应的地址,将它们直接映射到用户数据空间的头32个地址。X、Y、Z寄存器可以设置为指向任意寄存器的指针。
通用寄存器R26~R31除了用作通用寄存器外,还可以作为数据间接寻址用的地址指针X、Y、Z,如图1.4所示。在不同的寻址模式中,这些地址寄存器可以实现固定偏移量、自动加1和自动减1功能。
图1.3 ATmega128单片机的通用寄存器结构示意图
图1.4 X、Y、Z寄存器
ATmega128单片机的堆栈主要用来保存临时数据、局部变量、子程序和中断子程序的返回地址,堆栈指针总是指向堆栈的顶部。
注意
ATmega128单片机的堆栈是向下生长的,即当有新数据被推入堆栈时,堆栈指针的数值将减小。
ATmega128单片机的堆栈指针指向位于SRAM的函数或中断堆栈,在调用子程序和使能中断之前必须先初始化堆栈,并且堆栈指针必须指向高于0x60的地址空间。
● 当使用PUSH指令将数据推入堆栈时,堆栈指针减1。
● 当子程序或中断返回地址被推入堆栈时,堆栈指针将减2。
● 使用POP指令将数据弹出堆栈时,堆栈指针加1。
● 使用RET或RETI指令从子程序或中断返回时,堆栈指针加2。
ATmega128单片机的堆栈指针实质上是I/O空间中的两个8位寄存器,如表1.2所示。
表1.2 ATmega128单片机的堆栈指针寄存器
ATmega128单片机支持不超过64KB的数据存储器空间,页面选择寄存器RAMPZ用于选择ATmega128单片机访问的是哪一个数据存储器空间,其内部结构如表1.3所示。
表1.3 ATmega128单片机的页面选择寄存器RAMPZ内部结构
● BIT7~BIT1:保留位。
● RAMPZ0:RAM页面扩展选择指针,当RAMPZ0=0时,ELPM/SPM指令用于访问ATmega128寄存器的低64KB地址空间0x0000~0x7FFF;当RAMPZ0=1时,ELPM/SPM指令用于访问ATmega128寄存器的高64KB地址空间0x7FFF~0xFFFF。
说明
LPM指令不受RAMPZ位设置的影响。
ATmega128单片机的中断事件都在程序空间对应独立的中断向量,所有的中断模块都有自己的使能位。当使能位被置位,并且状态寄存器的全局中断使能位I也被置位时,可以产生中断事件。根据程序计数器PC的不同,在引导锁定位BLB02或BLB12被编程的情况下,中断可能被自动禁止,这个特性提高了软件的安全性。
ATmega128单片机的程序存储区的最低地址默认为复位向量和中断向量,向量列表列出了不同中断的优先级,向量所在的地址越低,优先级越高。RESET具有最高的优先级,第2个为INT0(外部中断请求0)。通过置位通用中断控制寄存器(GICR)的IVSEL,中断向量可以移至引导Flash的起始处,编程熔丝位BOOTRST也可以将复位向量移至引导Flash的起始处。
在任一中断发生时,全局中断使能位I被清零,从而禁止了所有其他的中断,用户软件可以在中断程序里置位I来实现中断嵌套。此时,所有的中断都可以中断当前的中断服务程序,在执行RETI指令后,I自动置位。
ATmega128单片机有两种类型的中断。第1种由中断事件触发并置位中断标志位。对于这些中断,程序计数器跳转到实际的中断向量,以执行中断处理程序,同时硬件将清除相应的中断标志。中断标志位也可以通过对其写“1”的方式来清除。当中断发生后,如果相应的中断使能位为“0”,则中断标志位置位,并一直保持到中断执行,或者被软件清除。类似的,如果全局中断标志被清零,则所有已发生的中断都不会被执行,直到I被置位。然后挂起的各个中断按中断优先级依次执行。
对于第2种类型的中断,只要中断条件满足,就会一直触发。这些中断不需要中断标志位,若中断条件在中断使能之前就消失了,中断不会被触发。
ATmega128单片机在退出中断后,总是回到主程序后并至少执行一条指令,才可以去执行其他被挂起的中断。
注意
进入中断服务程序时,状态寄存器不会自动保存,中断返回时也不会自动恢复,这些工作必须由用户通过软件来完成;当使用CLI指令来禁止中断时,中断禁止立即生效,没有中断可以在执行CLI指令后发生,即使它是在执CLI指令的同时发生的。
【例1.1】 利用CLI指令来防止中断发生,以避免在对E 2 PROM进行写操作时,对E 2 PROM内容的破坏。
注意
当使用SEI指令使能中断时,在执行任何中断之前一定会先执行完SEI指令之后的那一条指令。
ATmega128单片机的中断响应操作最少为4个时钟周期。在4个时钟周期后,程序跳转到实际的中断处理例程。在这4个时钟期期间,PC将自动入栈。在通常情况下,中断向量为一个跳转指令,此跳转需要3个时钟周期。如果中断在一个多时钟周期指令执行期间发生,则在此多周期指令执行完毕后,ATmega128单片机才会执行中断程序。若中断发生时ATmega128单片机处于休眠模式,中断响应时间还需增加4个时钟周期。此外,还要考虑到不同的休眠模式所需要的启动时间。
ATmega128单片机的中断返回操作也需要4个时钟周期,在此期间PC (两个字节)将被弹出栈,堆栈指针加2,状态寄存器SREG的I位被置位。
ATmega128单片机的存储器体系由程序存储器Flash、数据存储器SRAM和E 2 PROM存储器组成,这3个存储器空间都是线性的。
ATmega128单片机具有128KB内部Flash,用于存放程序指令代码,支持在线编程(ISP)和在应用编程(IAP)。因为ATmega128单片机的所有的指令均为16位或32位,所以Flash被组织成64KB×16位的形式,并且被分为引导程序区(BOOT)和应用程序区两个不同的区,如图1.5所示。
ATmega128单片机内部有一个4KB的内置SRAM,它还支持使用外部SRAM扩展到64KB。ATmega128单片机的SRAM存储器构成如图1.6所示。前4352字节包含了32个通用寄存器和64字节I/O寄存器,然后是160字节的扩展I/O寄存器,最后是4096字节的内部SARM。
图1.5 ATmega128单片机的Flash程序存储器空间
图1.6 ATmega128单片机的SRAM数据存储器构成
ATmega128单片机对于SARM的寻址方式有5种:直接寻址、带偏移量的间接寻址、间接寻址、带预减量的间接寻址和带后增量的间接寻址。通用寄存器中的寄存器R26~R31为间接寻址的指针寄存器;直接寻址范围可达整个数据区;带偏移量的间接寻址模式则能够寻址到由寄存器Y和Z给定的基址附近的63个地址;在自动预减和后加的间接寻址模式中,寄存器X、Y和Z自动增加或减少。
ATmega128单片机的全部32个通用寄存器、64个I/O寄存器和4096字节的内部数据SRAM可以通过这5种寻址模式进行访问。
ATmega128单片机的E 2 PROM存储器常常用来存放一些需要掉电后保存的数据。
图1.7所示为ATmega128单片机的系统时钟构成。在实际工作中,使用这些时钟的不同选择和组合来驱动ATmega128工作。
图1.7 ATmega128单片机的系统时钟构成
ATmega128单片机的系统时钟由以下5个部分构成。
● CPU时钟:clk CPU 与ATmega128单片机的内核各个模块相连接,如通用寄存器、状态寄存器及保存堆栈指针的数据存储器,终止CPU时钟将使内核停止工作。
● I/O时钟:clk I/O 用于驱动主要的I/O模块,如定时/计数器模块、SPI总线接口模块和USART模块等,I/O时钟还用于驱动外部中断模块。但是,有些外部中断由异步逻辑检测,因此即使I/O时钟停止了,这些中断仍然可以得到监控。另外,TWI(I 2 C)总线接口模块的启动检测在没有clk I/O 的情况下也是使用异步逻辑来检测的,所以该数据总线模块在ATmega128单片机的任何睡眠模式下都可以正常工作。
● Flash时钟:clk Flash 用于控制Flash存储器接口的操作,此时钟通常与CPU时钟同时挂起或激活。
● 异步定时器时钟:clk ASY 异步定时器时钟允许定时/计数器由外部32kHz时钟晶体驱动,使得这些定时/计数器即使在ATmega128的睡眠模式下仍然可以正常工作。
● ADC时钟:clk ADC 是ADC模块的专用时钟,这样可以在ADC工作时停止CPU和I/O时钟,以降低数字电路产生的噪声,从而提高ADC转换精度。
ATmega128单片机可以通过对熔丝位的配置来选择时钟源,如表1.4所示。
表1.4 使用熔丝位配置时钟源
当ATmega128单片机从自掉电模式或省电模式被唤醒后,被选择的时钟源用来为启动过程定时,以保证振荡器在开始执行指令之前进入稳定状态。当ATmega128单片机从复位开始工作时,还能提供额外的延迟时间,以保证其开始正常工作之前电源达到稳定电平,这个启动时间的定时工作由看门狗振荡器完成。看门狗溢出时间所对应的WDT振荡器周期数如表1.5所示,其频率由工作电压决定。
表1.5 看门狗溢出时间所对应的WDT振荡器周期数
说明
1.在ATmega128出厂时,CKSEL=“0001”,SUT=“10”,默认设置的时钟源是内部RC振荡器,启动时间最长,这种设置可以保证用户能够通过ISP或并行编程器得到所需的时钟源。
2.熔丝位是用于对ATmega128单片机进行配置的一系列位,可以在编程时使用编程/下载工具写入ATmega128单片机,从而控制ATmega128单片机进行相应的工作。
ATmega128单片机使用晶体振荡器电路如图1.8所示。引脚XTAL1与XTAL2分别用作片内振荡器的反向放大器的输入和输出。
图1.8 ATmega128单片机使用晶体振荡器电路
晶体振荡器可以使用石英晶体,也可以使用陶瓷谐振器。
熔丝位CKOPT用来选择这两种放大器模式的其中之一。当CKOPT被编程时,振荡器在输出引脚产生满幅度的振荡,这种模式适合于噪声环境,以及需要通过XTAL2驱动第2个时钟缓冲器的情况,而且这种模式的频率范围比较宽。当保持CKOPT为未编程状态时,振荡器的输出信号幅度比较小。其优点是大大降低了功耗,但是频率范围比较窄,而且不能驱动其他时钟缓冲器。
对于谐振器,CKOPT未编程时的最大频率为8MHz,CKOPT编程时的最大频率为16MHz。电容C1和C2的数值要一样,不管使用的是石英晶体还是陶瓷谐振器。最佳的数值与使用的石英晶体或陶瓷谐振器有关,还与杂散电容和环境的电磁噪声有关。
振荡器可以工作于3种不同的模式,每一种都有一个优化的频率范围。工作模式通过熔丝位CKSEL3~CKSEL1来选择,如表1.6所示。
表1.6 晶体振荡器的相关参数选择
说明
CKPOT=1,CKSEL3~CKSEL0=101的选项不适用于晶体,只适用于陶瓷谐振器。
熔丝位CKSEL0和SUT1~SUT0决定了ATmega128单片机的启动时间,如表1.7所示。
表1.7 ATmega128单片机的启动时间
ATmega128单片机可以使用32.768kHz的钟表晶体作为器件的时钟源。此时,必须将熔丝位CKSEL设置为“1001”,以选择低频晶体振荡器,该晶体的连接方式和使用晶体振荡器相同。通过对熔丝位CKOPT的编程,用户可以使能XTAL1和XTAL2的内部电容,从而节省外部电容,内部电容容量的标称值为36pF。使用低频晶体振荡器之后,启动时间由熔丝位SUT确定,如表1.8所示。
表1.8 低频晶体振荡器的启动时间
如果ATmega128单片机的应用系统不需要特别精确的定时,则可以使用图1.9所示的外部RC振荡器作为时钟源,其频率可以通过公式:
图1.9 外部RC振荡器
进行大略的计算。其中,C至少要22pF。通过对熔丝位CKOPT的编程,用户可以使能XTAL1和GND之间的片内36pF电容,从而无须外加电容。
RC振荡器可以工作于4个不同的模式,每个模式有相应的优化频率范围,工作模式通过对熔丝位CKSEL3~CKSEL0的编程来决定,如表1.9所示。
表1.9 RC 振荡器的工作模式
RC振荡器的启动时间由熔丝位SUT决定,如表1.10所示。
表1.10 RC振荡器启动时间
ATmega128单片机有一个经过校准的片内RC振荡器,可以给ATmega128单片机提供固定的1.0、2.0、4.0或8.0MHz的时钟频率(这些频率都是5V、25℃下的标称值)。校准片内时钟源使用熔丝位CKSEL进行控制,如表1.11所示。当使用这个时钟(此时不能对CK OPT进行编程)时,无须外部振荡器件。当ATmega128单片机复位时,硬件将标定字节加载到OSCCAL寄存器中,自动完成对内部RC振荡器的标定。在5V、25℃和频率为1.0MHz时,这种标定可以提供标称频率±3%的时钟精度。在使用这个振荡器作为系统时钟时,看门狗仍然使用自己的看门狗定时器作为溢出复位的依据。
表1.11 使用校准片内RC时钟源
注意
芯片出厂默认设置为1.0MHz。
当使用RC时钟源时,ATmega128单片机的启动时间由熔丝位SUT决定,如表1.12所示。
表1.12 校准片内RC振荡器启动时间
振荡器标定寄存器OSCCAL的内部结构如表1.13所示。将标定数据写入OSCCAL寄存器,可以对内部振荡器进行调节,以消除由于生产工艺所带来的振荡器频率偏差。复位时,1MHz的标定数据(标定数据的高字节,地址为0x00)自动加载到OSCCAL寄存器。
表1.13 OSCCAL寄存器
如果需要内部RC振荡器工作于其他频率,其标定数据必须人工加载。首先通过编程器读取标定数据,然后将标定数据保存到Flash或E 2 PROM之中。这些数据可以通过软件读取,然后加载到OSCCAL寄存器。当OSCCAL为零时,振荡器以最低频率工作;当对其写入不为零的数据时,内部振荡器的频率将增加,写入0xFF,即得到最高频率。标定的振荡器将用来为访问E 2 PROM和Flash定时。需要注意的是,有写E 2 PROM和Flash的操作时,不要将频率标定到超过标称频率的10%;否则,写操作有可能失败,如表1.14所示。
注意
振荡器只对1.0、2.0、4.0和8.0MHz 4种频率进行了标定;对于其他频率,则无法保证。
表1.14 内部校准RC时钟源范围
ATmega128单片机可以使用外部时钟源作为芯片驱动。这时,XTAL1引脚必须按图1.10所示进行连接,同时熔丝位CKSEL必须编程为“0000”。若熔丝位CKOPT也被编程,用户就可以使用内部的XTAL1和GND之间的36pF电容,此时不需要外加电容。
图1.10 外部时钟源电路图
当选择了外部时钟源之后,ATmega128单片机的启动时间由熔丝位SUT确定,如表1.15所示。为了保证ATmega128单片机能够稳定工作,不能突然改变外部时钟源的振荡频率。当工作频率突变超过2%,将会产生异常现象。所以,应该在ATmega128单片机保持复位状态时,改变外部时钟的振荡频率。晶体可以直接与XTAL1和GND引脚连接,无须外部电容器。此振荡器针对32.768kHz的钟表晶体作了优化,不建议在TOSC1引脚输入振荡信号。
表1.15 外部时钟源启动时间
通过对控制寄存器MCUCR的设置可以控制ATmega128单片机进入不同的电源管理模式,MCUCR寄存器的内部结构如表1.16所示。其中只有4位和ATmega128单片机的电源管理相关。
表1.16 ATmega128单片机的控制寄存器MCUCR
● SE:睡眠使能控制位。当SE被置位时,ATmega128单片机进入睡眠模式。
● SM2~SM0:电源模式选择位。用于控制ATmega128单片机的具体电源模式,如表1.17所示。
表1.17 ATmega128单片机电源模式控制选择
说明
只有在使用外部晶体或谐振器时,StandBy模式与扩展StandBy模式才可用。
● 空闲模式:当SM2~SM0=“000”时,SLEEP指令使ATmega128单片机进入空闲模式。在此模式下,CPU停止运行,而SPI、USART、模拟比较器、ADC、两线串行接口、定时/计数器、看门狗和中断系统继续工作。此模式只停止CPU时钟和Flash时钟,其他时钟继续工作。类似定时器溢出与USART传输完成等内外部中断都可以唤醒ATmega128单片机,如果不需要从模拟比较器中断唤醒,为了减少功耗,可以切断比较器的电源,方法是置位模拟比较器控制和状态寄存器ACSR的ACD位,如果ADC通道被使能,进入此模式后将自动启动一次转换。
● ADC噪声抑制模式:当SM2~SM0=“001”时,SLEEP指令使ATmega128单片机进入噪声抑制模式。在此模式下,CPU停止运行,而ADC、外部中断、两线串行接口、定时/计数器2和看门狗继续工作。此模式只停止了I/O时钟、CPU时钟和Flash时钟,其他时钟继续工作。此模式改善了ADC的噪声环境,使得转换精度更高,当ADC被使能时,进入此模式将自动启动一次A/D转换。此后,每次ADC的转换结束中断、外部复位、看门狗复位、BOD复位、两线串行接口地址匹配中断、定时/计数器0中断、SPM/E 2 PROM准备就绪中断、外部电平中断INT7~INT4或外部中断INT3~INT0可以将单片机从ADC噪声抑制模式唤醒。
● 掉电模式:当SM2~SM0=“010”时,SLEEP指令使ATmega128单片机进入掉电模式。在此模式下,外部晶体停振,而外部中断、两线串行接口、看门狗(如果使能的话)继续工作。只有外部复位、看门狗复位、BOD复位、两线串行接口地址匹配中断、外部电平中断INT7~INT4或外部中断INT3~INT0可以使ATmega128单片机脱离掉电模式。此模式下ATmega128单片机停止了所有的时钟,只有异步模块可以继续工作。
注意
当使用外部电平中断方式将ATmega128单片机从掉电模式唤醒时,必须保持外部电平一定的时间,并且从施加掉电唤醒条件到真正唤醒有一个延迟时间,此时间用于时钟重新启动并稳定下来,唤醒周期与由熔丝位CKSEL定义的复位周期是一样的。
● 省电模式:当SM2~SM0=“011”时,SLEEP指令将使ATmega128单片机进入省电模式。该模式与掉电模式只有一点不同:如果定时计数器2为异步驱动,则定时计数器2在睡眠时将继续运行。除了掉电模式的唤醒模式,定时计数器2的溢出中断和比较匹配中断也可以将ATmega128单片机从睡眠模式唤醒。只要TIMSK使能了这些中断,并且SREG的全局中断使能位I被置位,此模式停止了除ASY时钟以外所有的时钟,只有异步模块可以继续工作。
说明
如果异步定时器不是异步驱动的,建议使用掉电模式,而不是省电模式。
● StandBy模式:当SM2~SM0=“110”时,SLEEP指令使ATmega128进入StandBy模式,该模式与掉电模式唯一的不同之处在于振荡器继续工作。其唤醒时间只需要6个时钟周期。
● 扩展StandBy模式:当SM2~SM0=“111”时,SLEEP指令将使ATmega128单片机进入扩展的StandBy模式。
为了减少ATmega128单片机应用系统的功耗,一般要尽可能利用睡眠模式且使尽可能少的模块继续工作,不需要的功能必须禁止。下面的模块需要特殊考虑以达到尽可能低的功耗。
● 模/数转换器:被使能时,ADC在睡眠模式下继续工作,为了降低功耗,在进入睡眠模式之前需要禁止ADC通道。
● 模拟比较器:在空闲模式时,如果没有使用模拟比较器,可以将其关闭,在ADC噪声抑制模式下也是如此。在其他模式下,模拟比较器是自动关闭的。如果模拟比较器使用了内部电压基准源,则不论在什么模式下都需要关闭它;否则,内部电压基准源将一直被使能。
● 掉电检测BOD:如果系统没有使用掉电检测器BOD,那么这个模块也可以关闭;如果熔丝位BODEN被编程,从而使能了BOD功能,则其将在各种模式下继续工作,这个电流将占总电流的很大比重。
● 片内基准电压:当使用BOD、模拟比较器和ADC时,可能需要内部电压基准源。若这些模块都被禁止了,则基准源也可以被禁止。但是,重新使能后,用户必须等待基准源稳定之后才可以使用它。如果基准源在休眠过程中是使能的,其输出则立即可以使用。
● 看门狗定时器:如果系统无须使用看门狗,这个模块也可以关闭;若使能,则在任何模式下都将持续工作从而消耗电流。
● I/O端口引脚:进入睡眠模式时,所有的端口引脚都应该配置为只消耗最小的功耗。最重要的是避免驱动电阻性负载。在睡眠模式下,I/O时钟和ADC时钟都被停止,输入缓冲器也被禁止,从而保证输入电路不会消耗电流。而在某些情况下,输入逻辑是使能的,用来检测唤醒条件。如果输入缓冲器是使能的,此时输入不能悬空,信号电平也不应该接近V CC /2;否则,输入缓冲器会消耗额外的电流。
● JTAG接口与片上调试系统:如果通过熔丝位OCDEN使能了片上调试系统,当AT mega128单片机进入掉电或省电模式时,主时钟将保持运行,可以使用不编程OCDEN、不编程JTAGEN、置位MCUCSR寄存器的JTD位的方法来减少功耗。当JTAG接口被使能而JTAGTAP控制器没有进行数据交换时,引脚TDO将悬空。如果与TDO引脚连接的硬件电路没有上拉电阻,系统功耗将增加,而ATmega128单片机的引脚TDI包含一个上拉电阻,因此在扫描链中无须为下一个芯片的TDO引脚设置上拉电阻。通过置位MCUCSR寄存器的JTD或不对JTAG熔丝位编程,可以禁止JTAG接口。
当ATmega128单片机复位之后,所有的I/O寄存器都被恢复为初始值,程序从复位向量处开始执行。复位向量处存放的指令必须是绝对跳转指令JMP,以使程序跳转到对应复位处理代码。如果用户代码不使用中断,中断向量的存储位置可以由一般的程序代码所覆盖。这个处理方法同样适用于当复位向量位于应用程序区,中断向量位于程序存储器的Boot区的状况。
当复位发生时,ATmega128单片机的I/O端口立即被复位为初始值。此时不要求任何时钟处于正常运行状态。当所有的复位信号消失之后,ATmega128单片机内部的一个延迟计数器被激活,将内部复位的时间延长,从而能使ATmega128单片机在正常工作之前有一定的时间让电源达到稳定的电平,该延迟计数器的溢出时间通过熔丝位SUT与CKSEL设定。
ATmega128单片机有5个复位源。
● 上电复位:当电源电压低于上电复位门限V POT 时,ATmega128单片机复位。
● 外部复位:当外加在RESET引脚上的低电平持续时间大于最小脉冲宽度时,AT mega128单片机复位。
● 掉电检测复位:当掉电检测复位功能使能,并且电源电压低于掉电检测复位门限电压V BOT 时,ATmega128单片机复位。
● 看门狗复位:当看门狗使能,并且看门狗定时器溢出时,ATmega128单片机复位。
● JTAG复位:当复位寄存器被置位时,ATmega128单片机复位。
在上电复位(POR)过程中,其复位脉冲由片内检测电路产生,当VCC引脚上的电平低于检测电平POR时,发生上电复位事件。POR电路可以用来触发启动复位,或者用来检测电源故障。
POR电路可以保证ATmega128单片机在上电时复位,当VCC达到上电门限电压后触发延迟计数器,在计数器溢出之前器件一直保持为复位状态,当VCC下降时,只要低于检测门限,RESET信号立即生效。
图1.11和图1.12所示为ATmega128单片机在上电复位时 引脚不同连接方式下的信号时序图。
图1.11 RESET引脚连接到VCC的信号时序图
图1.12 RESET由外部电路控制的信号时序图
外部复位由外加于ATmega128单片机的RESET引脚上的低电平产生。当复位低电平持续时间大于最小脉冲宽度(1.5μs)时触发复位过程,即使此时并没有时钟信号在运行。当外加信号达到复位门限电压V RST (上升沿)时,t TOUT 延时周期开始。在延时结束后,AT mega128单片机启动信号时序图如图1.13所示。
图1.13 外部复位的信号时序图
ATmega128单片机具有片内BOD (Brown-out Detection)电路,该电路通过与固定触发电平的对比来检测工作过程中VCC的变化。触发电平通过熔丝位BODLEVEL来设定,可以设定为2.7V或4.0V。BOD的触发电平具有迟滞功能,以消除电源尖峰的影响。BOD电路的开关由熔丝位BODEN来控制。当BOD被使能后,一旦VCC下降到触发电平以下,BOD复位立即被激发。当VCC上升到触发电平以上时,延时计数器开始计数,一旦超过溢出时间t TOUT ,ATmega128单片机即恢复工作。如果VCC一直低于触发电平并保持时间t BOD (2μs),BOD电路将只检测电压跌落。图1.14所示为掉电检测复位示意图。
图1.14 掉电检测复位示意图
当看门狗定时器溢出时,将产生持续时间为1个时钟周期的复位脉冲,在脉冲的下降沿,延时定时器开始对t TOUT 计数,计数完成之后,ATmega128单片机即完成复位,如图1.15所示。
ATmega128单片机使用一个复位控制寄存器来对复位进行管理,该寄存器的内部结构如表1.18所示。其中后5位和ATmega128单片机的复位控制相关。
图1.15 看门狗复位时序图
表1.18 ATmega128单片机的复位控制寄存器MCUCSR
● JTRF:JTAG复位标志位。通过JTAG指令AVR_RESET可以使JTAG复位寄存器置位,引发ATmega128单片机复位,并使JTRF置位;上电复位后,该位被自动清零,也可以通过对该位写“0”来清除。
● WDRF:看门狗复位标志位。当看门狗复位发生时,该位被置位;上电复位后,该位被自动清零,也可以通过向该位写“0”来清除。
● BORF:掉电检测复位标志位。在掉电检测复位发生时被置位;上电复位后该位被自动清零,也可以通过写“0”来清除。
● EXTRF:外部复位标志位。当外部复位发生时被置位;上电复位后该位被自动清零,也可以通过写“0”来清除。
● PORF:上电复位标志位。上电复位发生时被置位;只能通过写“0”来清除。
ATmega128单片机具有片内基准电压源,用于掉电检测,或者作为模拟比较器或ADC模块的输入电源。ADC模块的2.56V基准电压也由此片内基准电压源产生。电压基准的启动时间可能影响其工作方式,其启动时间如表1.19所示。为了降低功耗,在不使用基准源时将关闭。该基准源仅在如下情况打开:
● BOD使能,即熔丝位BODEN被编程。
● 能隙基准源连接到模拟比较器,ACSR寄存器的ACBG位被置位。
● ADC模块被使能。
因此,当BOD被禁止时,置位ACBG或使能ADC后会启动基准源,为了降低掉电模式的功耗,可以禁止上述3种条件,并在进入掉电模式之前关闭基准源。
表1.19 内部电压基准源特性
表1.20列出了ATmega128单片机的中断向量列表。ATmega128单片机共35个中断向量。
表1.20 ATmega128的中断向量列表
说明
1.当熔丝位BOOTRST被编程时,ATmega128单片机复位后程序将跳转到Boot Loader。
2.当寄存器MCUCR的IVSEL位被置位时,中断向量将转移到Boot区的起始地址,此时各个中断向量的实际地址为表中地址与Boot区起始地址之和。
表1.21给出了不同的BOOTRST、IVSEL位设置下的复位和中断向量的位置。如果程序永远不使能中断,中断向量就没有意义,用户则可以在此直接写程序。同样,如果复位向量位于应用区,而其他中断向量位于Boot区,则复位向量之后可以直接写程序,反之亦如此。
表1.21 复位和中断向量的位置
可以使用MCU控制寄存器MCUCR来控制ATmega128单片机的相关中断。表1.22列出了MCUCR寄存器的内部结构。其中,IVSEL和IVCE位用于对ATmega128单片机的通用中断进行控制。
表1.22 ATmega128的MCU控制寄存器MCUCR
(1)IVSEL:中断向量选择位。当IVSEL为“0”时,中断向量位于Flash存储器的起始地址;当IVSEL为“1”时,中断向量转移到Boot区的起始地址。实际的Boot区起始地址由熔丝位BOOTSZ确定。
为了防止无意识地改变中断向量表,修改IVSEL位时需要遵照如下过程。
● 置位中断向量,修改使能位IVCE。
● 在接下来的4个时钟周期里将修改IVSEL位,同时对IVCE写“0”。
● 执行上述序列时,中断自动被禁止。在置位IVCE时,中断就被禁止了,并一直保持到写IVSEL操作之后的下一条语句。如果没有IVSEL写操作,则中断在置位IVCE之后的4个时钟周期保持禁止。需要注意的是,虽然中断被自动禁止,但状态寄存器的位I的值并不受此操作的影响。
说明
若中断向量位于Boot区且Boot锁定位BLB02被编程,则执行应用区的程序时中断被禁止;若中断向量位于应用区且Boot锁定位BLB12被编程,则执行Boot区的程序时中断被禁止。
(2)IVCE:中断向量修改使能位。在修改IVSEL时,IVCE必须置位。在IVCE或IVSEL写操作4个时钟周期后,IVCE位被硬件清零。