wordpress图标插件,seo 优化公司,做视频网站被判刑,做一个网站后期维护需要做什么1.GPIO为什么需要宏定义地址 在 STM32 这样的微控制器中,硬件寄存器的地址是固定的并且特定于每个外设(比如 GPIOA、GPIOB 等)。为了方便代码访问这些硬件寄存器,我们通常会使用宏定义来指定每个外设的基地址。这样做有几个理由&a…1.GPIO为什么需要宏定义地址


在 STM32 这样的微控制器中,硬件寄存器的地址是固定的并且特定于每个外设(比如 GPIOA、GPIOB 等)。为了方便代码访问这些硬件寄存器,我们通常会使用宏定义来指定每个外设的基地址。这样做有几个理由:
-
硬件地址是固定的: 微控制器的每个外设(比如 GPIOA、GPIOB 等)都有一个固定的起始地址(基地址),这些地址在芯片的硬件手册中明确给出。例如,GPIOA 可能有一个固定的基地址,比如 0x40010800
。
-
代码便于移植: 使用宏定义可以让代码更加灵活。例如,如果你将代码移植到不同型号的 STM32 设备上,不同型号的设备可能会有不同的外设基地址。通过宏定义,可以方便地修改这些基地址,而不需要修改代码中每个寄存器访问的地方。
-
简化代码: 使用宏定义可以简化代码的书写和阅读。我们直接使用 GPIOA_BASE
而不是手动输入每个寄存器的地址。
因此,GPIOA
需要宏定义一个地址是因为它是外设的基地址,代码通过这个基地址来访问 GPIOA 外设的寄存器。

你也可以不定义,那就需要输入地址再访问了,比如:

2. 为什么不需要为 BSRR定义宏地址
从下图可以看到,我所查找的的BSRR只是一个宏定义,找不到他的地址值了,为什么呢?

GPIOA->
BSRR的访问并不需要为 BSRR寄存器单独定义一个地址,因为:已经包含了所有寄存器字段的偏移量定义。例如,BSRR寄存器的地址会是 GPIOA_BASE +
0x10(这是在硬件手册中定义的)。
-
结构体的每个字段(例如 ODR
)会自动偏移至相应的地址,而不需要为每个字段单独定义一个宏。
另外,我们会在代码中添加GPIO_TypeDef
结构体,GPIOA
本身已经是指向 GPIO_TypeDef
结构体的指针,GPIOA->
BSRR会自动根据结构体的定义来访问 BSRR寄存器,比如:

三、为什么GPIOA->BSRR=1不会改变他的地址值
其实有了上面的哪一点,问题迎刃而解了,BSRR就是地址了,而GPIOA->
BSRR是取BSRR的值而不是地址,所以我们在修改的是BSRR的值而不是地址