为啥我们在 avr 中寻址 DDRx ,PORTx 时要添加偏移量?

Posted

技术标签:

【中文标题】为啥我们在 avr 中寻址 DDRx ,PORTx 时要添加偏移量?【英文标题】:Why do we add an Offset when addressing DDRx ,PORTx in avr?为什么我们在 avr 中寻址 DDRx ,PORTx 时要添加偏移量? 【发布时间】:2015-08-24 07:19:03 【问题描述】:

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

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

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

但是,为我的闪烁 LED 设置高电平不起作用。 相反,我必须在两个地址都添加一个 0x20 的偏移量,因为它运行良好。 即,DDRB=0x24 和 PORTB=0x25 这个偏移量(0x20)来自哪里?

【问题讨论】:

【参考方案1】:

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

【讨论】:

@darth 如果你使用 sbicbi 指令,但是,你不使用偏移量——例如sbi 0x05, 3 将 PORTB3 设置为高电平,而不是 0x25。

以上是关于为啥我们在 avr 中寻址 DDRx ,PORTx 时要添加偏移量?的主要内容,如果未能解决你的问题,请参考以下文章

arduino IO口

ATmega8仿真——LED 数码管的学习

AVR单片机教程——数码管

AVR--I/O端口寄存器

为啥要在 AVR 编程中校准振荡器

哈希表:为啥在开放寻址方案中难以删除