考研门户网站的建设,网络运维基础知识,网站建设1000字,蚌埠铁路建设监理公司网站1.GPIO为什么需要宏定义地址 在 STM32 这样的微控制器中#xff0c;硬件寄存器的地址是固定的并且特定于每个外设#xff08;比如 GPIOA、GPIOB 等#xff09;。为了方便代码访问这些硬件寄存器#xff0c;我们通常会使用宏定义来指定每个外设的基地址。这样做有几个理由硬件寄存器的地址是固定的并且特定于每个外设比如 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-BSRR1不会改变他的地址值 其实有了上面的哪一点问题迎刃而解了BSRR就是地址了而GPIOA-BSRR是取BSRR的值而不是地址所以我们在修改的是BSRR的值而不是地址