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

Pointers 地址和寄存器(MCU地址)之间的差异及相关问题,pointers,microcontroller,cpu-registers,Pointers,Microcontroller,Cpu Registers,我对STM32的MCU有了更深入的了解,于是我就开始裸机了。我使用的是STM32F103C8T6蓝色药丸 为了确保我完全理解正在发生的事情,MCU地址的性质是什么?我的意思是,对于我的电路板,RCC边界地址是0x4002 1000-0x4002 13FF,通过创建一个指向该地址的自定义命名指针,并键入要被编译器视为实际地址的“0x40021000”,这是实际寄存器的地址吗 我的意思是,我理解的是,MCU有32位寄存器,这些寄存器有地址,这些地址是寄存器的地址,MCU中的每个32位寄存器都有一个唯

我对STM32的MCU有了更深入的了解,于是我就开始裸机了。我使用的是STM32F103C8T6蓝色药丸

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

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

例如,RCC地址从“0x40021000”开始,该地址属于寄存器
0x0000x83
(其中X未根据参考手册定义),对吗?这些寄存器在MCU中是否有地址,以便访问和操作?如果是这样,那么这些寄存器位是否只是晶体管,当将寄存器中的某个位设置为1时,晶体管将导通

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

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

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

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

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

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

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

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