学单片机那么久了,感觉想要深化,还得看汇编语言,至少得了解单片机内部结构。
下面就以ATmega16为例,介绍一下AVR单片机结构和汇编语言。
AVR单片机的CPU内核结构
如上两图,左图是虚线框内AVR CPU的内核结构,右图是AVR单片机内核结构的方框图,能够看出AVR单片机的数据总线(CPU字长)是8位的,也就说它是8位单片机。
AVR采用了Harvard结构,具有独立的数据和程序总线,CPU在履行一条指令的一起,就将PC中指定的下一条指令取出,构成了一级流水线运转方法,完成了一个时钟周期履行一条指令,数据吞吐量高达1MIPS/MHz。
AVR CPU内核由几个重要的部分组成,它们别离是:
A.管用逻辑单元ALU(ArithmeTIc Logic Unit)
AVR ALU与32个通用作业寄存器直接相连。寄存器与寄存器之间、寄存器与当即数之间的ALU运算只需求一个时钟周期。ALU操作分为3类:算术、逻辑和位操作,此外还供给了支撑无/有符号数和分数乘法的乘法器,操作成果的状况将影响到状况寄存器SREG(Status Register)。
B.程序计数器PC、指令寄存器和指令译码器
程序计数器PC用来寄存下一条需求履行指令在程序存储器(ROM)空间的地址(指向FlashROM空间),取出的指令寄存在指令寄存器中,然后送入指令译码器中发生各种操控信号,操控CPU的运转(履行指令)。
AVR一条指令的长度大多数为16位,还有少部分为32位,因而AVR的程序存储器结构实际上是以字(16位)为一个存储单元的。
ATmega16单片机的程序计数器为13位,正好满意了对片内8K字(及16K字节)的Flash程序存储器空间直接寻址的需求。
C.通用寄存器General Purpose Registers
在AVR中,由命名为R0~R31的32个8位通用作业寄存器构成一个“通用快速作业寄存器组”,为ALU供给操作数。它们的在RAM的映射空间地址是$0000~$001F,其中有6个寄存器($001A-$001F)能够合并为3个16位直接寻址寄存器指针,别离被称为X寄存器,Y寄存器,和Z寄存器,用于对数据存储器(SRAM)进行直接寻址。
D.状况寄存器-SREG
状况寄存器SREG是一个8位标志寄存器,用来寄存指令履行后的有关状况和成果的标志,各位状况一般是在指令履行过程中主动发生的,但也能够由用户依据需求用专用指令加以改动。
位7-I:大局中止使能位
当I位被置位时,标明CPU能够呼应中止请求,反之,则一切中止被制止。I位能够经过SEI和CLI指令来置位和清零,在中止发生后,I位由硬件铲除,并由RETI(中止回来)指令置位。
位6-T:位复制存储
位复制指令BLD和BST运用T作为意图或源地址。BST把寄存器的某一位复制到T,而BLD把T复制到寄存器的某一位。
位5-H:半进位标志半进位标志H标明算术操作发生了半进位,此标志关于BCD运算十分有用。
位4-S:符号位S=N⊕V,S为负数标志N与2的补码溢出标志V的异或
位3-V:2的补码溢出标志,支撑2的补码运算
位2-N:负数标志 标明算术或逻辑操作成果为负
位1-Z:零标志 标明算术或逻辑操作成果为零
位0-C:进位标志 标明算术或逻辑操作发生了进位
E.仓库指针寄存器SP(Stack Point)
仓库指针首要用来保存暂时数据、局部变量和中止/子程序的回来地址。仓库指针总是指向仓库的顶部,AVR的仓库是向下成长的,即新的数据推入仓库时,仓库指针的数值将减小。
仓库指针指向数据SRAM仓库区,有必要指向高于0x60的地址空间,所以一般初始化时将SP的指针设在SRAM最高处。
运用PUSH指令将数据推入仓库时指针减一;而子程序或中止回来地址推入仓库时指针将减二。
运用POP指令将数据弹出仓库时,仓库指针加一;而用RET或RETI指令从子程序或中止回来时仓库指针加二。