为什么在avr中寻址DDRx、PORTx时要加Offset?

Why do we add an Offset when addressing DDRx ,PORTx in avr?

我最近开始使用 AVR 对我的 Arduino (ATmega328p) 进行编程,并获得了足够的关于使用 avr lib 的知识,而不是 arduino IDE.I 从一个闪烁的 LED 示例开始。

然后我尝试了同样的方法,例如,但是这次我没有 包含 io.h 或任何其他库,而是使用指向端口的指针,例如 DDRB或PORTB

根据atmega328p数据表,DDRB在0x04,PORTB在0x05。

然而,将它们设置为高电平以用于我闪烁的 LED 灯(例如)不起作用。 相反,在它完美运行后,我不得不向两个地址添加偏移量 0x20。 即,DDRB=0x24 和 PORTB=0x25 这个偏移量(0x20)来自哪里?

如果你查看datasheet第19页的内存映射,你会发现前32个字节地址是寄存器,I/O寄存器在这些之后开始。这就是为什么您需要添加一个 32 (0x20) 偏移量来获取 SRAM 地址。