通用寄存器组与I/O寄存器

2010天前 · AVR单片机 · 272次阅读

通用寄存器组

所有的通用寄存器操作指令均带有方向,并能在单一时钟周期中访问所有的寄存器。
32个通用寄存器的功能还是有一定的区别,R16~R31能实现的操作比R0~R15要多。
如SBCI、SUBI、CPI、ANDI、ORI及直接装入常数到寄存器LDI,而且乘法指令仅适用于寄存器组中后半部分的寄存器(R16~R31)
另外,R26~R31还构成了3个16位地址指针寄存器X、Y、Z,所以一般情况下不要作为它用。

每个通用寄存器还被分配在AVR单片机的数据存储器空间中,它们直接映射到数据空间的前32个地址,因此也可以使用访问SRAM的指令对这些寄存器进行访问,但此时指令中应使用寄存器在SRAM空间的映射地址。

I/O寄存器

AVR系列单片机所有I/O口及外围接口的功能和配置均通过I/O寄存器进行设置和使用。CPU访问I/O寄存器可以使用两种不同发方法:使用对I/O寄存器访问的IN、OUT专用指令和使用对SRAM访问的指令。
所有的I/O寄存器可以通过IN(I/O口输入)和OUT(I/O口输出)指令访问,这些指令是在32个通用寄存器与I/O寄存器空间之间传输交换数据,指令周期为1个时钟周期。

  • I/O寄存器地址范围在$00~$1F之间的寄存器(前32个)还可以通过指令实现位操作和位判断跳转。
  • SBI(I/O寄存器中指定位置1)CBI(I/O寄存器指定位为清0)指令可直接对I/O寄存器中的每一位进行位操作。
  • 使用SBIS(I/O寄存器指定位为1跳行)SBIC(I/O寄存器指定位为0跳行)指令能够对这些I/O寄存器中每一位的值进行校验判断,实现跳过一条指令执行下条一指令的跳转。

在I/O寄存器专用指令IN、OUT、SBI、CBI、SBIS和SBIC中使用I/O寄存器地址$00~$3F。
当以SRAM方式寻址I/O寄存器时,必须将该寄存器在I/O空间地址加上$0020,映射成在数据存储器空间的地址。

状态寄存器和堆栈指针寄存器

状态寄存器SREG

状态寄存器SREG是一个8位标志寄存器,用来存放指令执行后的有关状态和结果的标志。SREG中各位状态通常是在指令的执行过程中自动形成,但也可以由用户根据需要用专用指令加以改变。
**与SREG中位操作有关的指令有置位、清0、为“1”转移、为“0”转移等$3F($005F),其各标志位的意义如下:

  • 位7——I:全局中断使能位。
该标志位为AVR中断总控制开关,当I位置位时表示CPU可以响应中断请求;而当I位清0时,表示所有的中断禁止,CPU不响应任何中断请求。
除了该标志位用于AVR中断的总控制,各个单独的中断触发控制还可由其所在的中断屏蔽寄存器(如GICR、TIMMSK等)控制。
如果全局中断使能位清0,则全局(所有的)中断禁止,但单独的中断触发控制(如GICR、TIMMSK中)的值保持不变。
当响应中断后,I位由硬件清0,并由RETI(中断返回)指令置位,从而允许子序列的中断响应。
  • 位6——T:位复制存储。
位复制指令BLD和BST使用T标志位作为源和目标。
通用寄存器组中的任何一个寄存器中的一位可通过BST指令复制到T中,而用BLD指令则可将T中的位值复制到通用寄存器组中的任何一个寄存器的一位中。
  • 位5——H:半进位标志位。
半进位标志位H表示在一些运算操作过程中有无半进位(低4位向高4位进位、借位)的产生,该标志位对于BCD码的运算和处理非常有用。
  • 位4——S:符号位标志位。
S=N⊕V。S位是负数标志位N和2的补码溢出标志位V两者异或值。
在正常运算条件下(V=0,不溢出),S=N,即运算结果作为最高位作为符号是正确的。
而当产生溢出时,V=1,此时N已不能正确指示运算结果的正负,但S=N⊕V还是正确的。
对于单(或多)字节有符号数据,执行减法或比较操作后,S标志能正确指示参与相减或比较的两个数的大小。
  • 位3——V:2的补码溢出标志位。
2的补码溢出标志位V支持2的补码运算,为模2补码加、减运算溢出标志。
溢出表示运算结果超过了正数(或负数)所能表示的范围。
加法溢出表现为正+正=负,或负+负=正;减法溢出表现为正-负=负或负-正=正。
溢出时,运算结果最高位(N)取反才是真正的结果符号。
  • 位2——N:负数标志位。
负数标志位直接取自运算结果的最高位,N=1时表示运算结果为负;否则为正。
但发生溢出时不能表示真实的结果。
  • 位1——Z:零值标志位。
零值标志位表明在CPU运算和逻辑操作后,其结果是否为0.当Z=1时,表示结果为0.
  • 为0——C:进/借位标志位。
进位标志位表明在CPU运算和逻辑操作过程中有无发生进/借位。

堆栈指针寄存器SP

堆栈是由一块连续的SRAM空间和一个堆栈指针寄存器组成,主要应用于快速、便捷地保存临时数据、局部变量和中断调用或子程序调用的返回地址。

堆栈在系统程序设计和运行中起着非常重要的作用,只要程序中使用了中断和子程序调用,就必须正确地设置堆栈指针寄存器SP,并在SRAM空间建立堆栈区。

堆栈是一种特殊的线性数据结构,数据的进出在堆栈的顶部进行,并遵循后进先出(LIFO)的原则。堆栈指针实际上就是堆栈顶部的地址,它随堆栈中数据的进出而变化。堆栈指针寄存器SP中保存着堆栈指针,即堆栈顶部的地址。

处在I/O地址空间的$3E($005E)和$3D($005D)的两个8位寄存器SPH和SPL构成了AVR单片机的16位堆栈指针寄存器SP。AVR单片机复位后,堆栈寄存器的初始值为SPH=$00,SPL=$00。因此,建议用户程序必须首先对堆栈指针寄存器SP进行初始化设置。

堆栈区应该避开寄存器区域所对应的SRAM空间,防止堆栈操作时改变寄存器的设置。
由于AVR的堆栈是向下增长的,即新数据进入堆栈时栈顶指针的数据将减小,所以尽管原则上堆栈可以在SRAM的任何区域中,但通常初始化时将SP的指针设在SRAM最高处。

对于具体的ATmega16芯片,堆栈指针必须指向高于$0060的SRAM地址空间。
ATmega16片内集成有1KB的 SRAM、不支持外部扩展SRAM,所以堆栈指针寄存器SP的初始值应设在SRAM的最高端,即$045F处。

👍 0

none

最后修改于2010天前

评论

贴吧 狗头 原神 小黄脸
收起

贴吧

狗头

原神

小黄脸

目录

avatar

未末

迷失

126

文章数

275

评论数

7

分类