通过将端口的偏移量添加到基地址来访问端口组合。这将如何运作?

Eri*_*mer 2 embedded port base-address offset memory-address

背景:我正在学习嵌入式系统课程https://www.edx.org/course/embedded-systems-shape-the-world-microcontroller-i

在有关位特定寻址的讲座中,他们展示了以下有关“花生酱和果冻端口”的示例。

给定一个基地址为 0x40005000 的端口 PB,您希望从 PB 访问端口 4 和端口 6,分别为 PB6 和 PB4。可以将端口 4 (0x40) 和端口 6 (0x100) 的偏移量添加到基地址 (0x40005000) 并将其定义为新地址 0x40005140。

这就是我感到困惑的地方。如果我想定义 PB6 的地址,它将是基址(0x40005000)+ 偏移量(0x100)= 0x40005100,PB4 的地址将是基址(0x40005000)+ 偏移量(0x40)= 0x40005040。那么,要访问它们,我可以使用 base(0x40005000) + offset(0x40) + offset(0x100) = 0x40005140 吗?对于他们各自来说,这不是一个完全不同的内存位置吗?

另外为什么位 0 表示为 0x004。在二进制中,这将是 0000 0100。我想如果你忽略前两个二进制位,它会代表位 0,但为什么我们要忽略它们呢?

关于位特定寻址的讲义: 在此输入图像描述

Tom*_*m V 5

对于基于 ARM 的微控制器上的任何普通外设,您对内存映射寄存器如何寻址的解释是相当合理的。

但是,如果您阅读TM4C123GH6PM 数据表第 662 页上的 GPIODATA 寄存器定义,您会发现该“寄存器”的行为非常不同。

它们将一大块地址空间(1024 字节)映射到单个 32 位寄存器。这意味着不需要地址总线的位[9:2],并且实际上数据已过载。它们包含要更新的位的掩码。这就是您复制的“偏移”计算试图描述的内容。

就我个人而言,我认为这个硬件接口可能是一种非常聪明的方法,可以让您使用单个原子写入仅设置存储体中的一些输出,但这使得它成为用于教学的设备的非常糟糕的选择,因为这不是事情正常进行的方式。