地址和寄存器(MCU地址)之间的差异以及相关问题



我对STM32的MCU有了更深入的探索,我开始了裸机。我使用的是STM32F103C8T6 BluePill。

只是为了确保我完全理解发生了什么,MCU地址的性质是什么?我的意思是,对于我的板,RCC边界地址是0x4002 1000-0x4002 13FF,通过创建一个指向该地址的自定义命名指针并键入大小写this";0x40021000";要被编译器视为实际地址,这是实际寄存器的地址吗?

我的意思是,我所理解的是MCU有32位寄存器,这些寄存器有地址,这些地址是寄存器的地址,MCU中的每个32位寄存器都有一个唯一的地址,一个物理地址!因此,为了操作特定的寄存器,我们创建一个指向该寄存器地址的指针,然后取消指针的引用并更改它所指向的寄存器

例如,RCC地址从"0"开始;0x40021000";这个地址是寄存器0x0000XX83的(根据参考手册,X是未定义的),我说得对吗?这些寄存器在MCU中是否真的有地址,以便可以访问和操作?如果是这样的话,这些寄存器位只是晶体管吗?当将寄存器中的位设置为1时,晶体管就会导通?

此外,如果我所理解的是正确的,这是否意味着重置值是具有地址的实际寄存器值(因为寄存器中的地址类似于变量,如x、y等)。参考手册中有地址,如RCC address = 0x40021000中的地址,取消引用该地址会给我们0x0000XX83??

我知道我可能把你弄糊涂了,但这是我能解释的最好的解释!提前谢谢。

地址是总线上的地址*。当编译器为处理器生成读取地址(LDR)的指令时,它会要求总线获取该地址的内容。类似地,写指令(STR)告诉总线地址是什么,以及它想放在那里的数据是什么。

总线的另一端可以是任何东西,但在大多数情况下,它将是内存或内存映射的外围寄存器。它可以有任何数量的比特,但一次最多可以访问32个。这是因为总线的宽度是32位。数据表列出了每个外设使用的地址范围,参考手册说明了每个外设寄存器的用途

在您的示例中,RCC是一个外围设备,其地址范围为0x40021000-0x400213FF。RCC中的第一个寄存器是RCC_CR,其地址偏移量为0x00,使其地址等于0x40021000。0x0000XX83是启动时RCC_CR寄存器的

还有另一组寄存器,指令可以直接访问。这些是处理器核心寄存器。因为它们不是通过总线访问的,所以它们没有地址。大多数处理器核心寄存器都有32位,这就是为什么STM32被称为32位微控制器的原因。

(*在像STM32F1中使用的Cortex-M3这样的哈佛架构部分中,实际上有几条总线共享一个地址空间,但作为初学者,我建议您可以忽略这一点。)

就晶体管而言,寄存器中的每个位通常由一个以上的晶体管组成。通常,6个晶体管被连接在一起以形成代表单个比特的触发器。

最新更新