AVR的通用寄存器和IO寄存器是映射到SRAM的0x0 - 0x5F地址,这样就实现统一的编址。那就说明它有自己的编址,即有两个不同的地址。刚学AVR时认为是在哪里有个寄存器可以设置来实现切换,就把这点先记在笔记本上。今天早上翻笔记本时发现了这个问题,AVR已经做了几个项目但是想想还真没在哪里有看到是怎么设置的。随便下了几行初始化代码编译后查看汇编,发现在操作IO寄存器和通用RAM的指令是不同的,那么应该就是通过不同的操作指令来区别这两个地址的(和8051用不同的寻址方式区分重叠地址的方式相似,但是AVR并不是用不同的寻址方式)。查了指令集发现用位操作、OUT、IN等指令时是按原有的地址,使用LDS、STS指令时是用映射地址。简单写了下面几句代码验证下:
void main(void)
{
asm("ldi R16,0x1");
asm("STS 0x31,R16");//DDRD的原有地址是0x31,映射地址是0x11
IO_SET_HIGH(D,0);
while(1)
{
if(IO_READ(D,0))
{
IO_SET_LOW(D,0);
}
else
{
IO_SET_HIGH(D,0);
}
delay_ms(500);
}
} 编译后烧写到单片机中,看到LED闪烁,证明想法是对的。
我不知道手册有没有注明这点,也没有把手册全部认真看完。
|