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
)会自动偏移至相应的地址,而不需要为每个字段单独定义一个宏。