地址和寄存器MCU 地址的区别及相关问题

问题描述

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

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

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

例如,RCC 地址从“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 这样的哈佛架构部分中,实际上有多条总线共享一个地址空间,但作为初学者,我建议您可以忽略这一点。)

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