打印
[AVR单片机]

AVR地址映射的问题

[复制链接]
831|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
秉烛良宵|  楼主 | 2016-3-17 15:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
        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闪烁,证明想法是对的。
我不知道手册有没有注明这点,也没有把手册全部认真看完。

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

163

帖子

7

粉丝