1.4 ATmega 16 单片机的中央处理器
ATmega 16单片机的中央处理器由32个8位通用寄存器、1个算术逻辑运算单元及状态和控制逻辑单元组成,如图1-2所示。
图1-2 ATmega 16单片机的中央处理器结构
为了获得最高的性能及并行性,AVR采用了哈佛结构,具有独立的程序总线和数据总线,程序存储器里的指令通过一级流水线运行。CPU在执行一条指令的同时读取下一条指令,即指令预取,这样保证了指令的单周期运行。
快速访问寄存器文件包括32个8位通用寄存器,访问时间为一个时钟周期,从而获得单周期的ALU操作。在典型的ALU操作中,两个位于寄存器文件中的操作数同时被访问,然后执行运算,结果再被送回寄存器文件中。整个过程只需要一个时钟周期的时间。
寄存器文件里面有6个寄存器可以用做3个16位的间接寄存器寻址指针以寻址数据空间,实现高效的地址运算。其中一个指针还可以作为程序存储器查询表的地址指针。这里的附加功能寄存器即为16位的X、Y、Z寄存器。
ALU支持寄存器之间及存储器和常数之间的算术和逻辑运算,也可以执行单周期寄存器操作,运算完成之后状态寄存器的内容得到更新以反映操作结果。
程序流程通过有条件和无条件的跳转指令和调用指令来控制,从而直接寻址整个地址空间,大多数指令长度为16位。
当执行中断和子程序调用时,返回地址存储于堆栈中。堆栈分布于通用数据SRAM中,堆栈大小只受SRAM数量的限制。堆栈放在SRAM最高地址处,进栈减1。在AVR单片机上电时,堆栈指针初始化为0x00,故用户应该注意在程序开始时就初始化16位堆栈指针寄存器SP指向SRAM的高位地址。
1.状态寄存器SREG
状态寄存器包含了最近执行的算术指令的结果信息。在进入中断服务程序时,CPU不会自动保存状态寄存器,在中断返回时也不会自动恢复,这些工作需要软件来完成。
SREG寄存器的定义如下:
● 位7-I:全局中断使能位。置位时使能全局中断,单独的中断使能由其他独立的寄存器控制。如果I被清零,则不论单独中断标识位置位与否,都不会产生中断。任意一个中断发生之后,I都将被清零,而执行RETI指令后I被置位以重新使能中断。I也可以通过SEI指令和CLI指令来置位和清零。
● 位6-T:位复制存储位。位复制指令BLD和BST利用T来作为目的或者源地址。BST把寄存器的某一位复制到T,而BLD把T复制到寄存器的某一位。
● 位5-H:半进位标识位。半进位标志H表示算术操作发生了半进位,此标志对于BCD运算非常有用。
● 位4-S:符号位。S为负数标识位N与2的补码溢出标识位V的异或。
● 位3-V:2的补码溢出标识位。
● 位2-N:负数标识位。表明算术或者逻辑运算的结果为负数。
● 位1-Z:零标识位。表明算术或者逻辑运算的结果为零。
● 位0-C:进位标识位。表明算术或者逻辑运算发生了进位。
2.堆栈指针SP
堆栈指针主要用来保存临时数据、局部变量和中断及子程序的返回地址。堆栈指针总是指向堆栈的顶部。AVR的堆栈是向下生长的,即数据被推入堆栈时,堆栈指针值变小。堆栈指针指向数据SRAM堆栈区,在此聚集了子程序堆栈和中断堆栈。调用子程序和使能中断之前必须定义堆栈空间,且堆栈指针必须指向高于0x60的地址空间。使用PUSH指令将数据推入堆栈时SP减1,而子程序或者中断返回地址推入堆栈时SP减2;使用POP指令将数据弹出堆栈时,SP加1,而使用RET或者RETI指令弹出子程序或者中断返回地址时SP加2。
AVR的堆栈指针由I/O空间的两个8位寄存器实现。实际使用的位数与具体器件的SRAM大小有关。