在下面的代码中,变量在哪里,变量类型在哪里?我们在这里更改了寄存器的属性。
如果它是面向对象的,那么我们需要一个对象名称来更改其属性。
在这里,我看不到类型在哪里,变量名在哪里,以及我们如何精确地更改其内部属性?
#include <stm32f0xx.h>
int main(void)
{
RCC->AHBENR|=RCC_AHBENR_GPIOCEN ;
GPIOC->MODER|=GPIO_MODER_MODERG_O ;
}
这与OOP无关,它只是一个结构成员分配。 RCC
和GPIOC
在stm32f0xx.h中定义:
#define RCC ((RCC_TypeDef *) RCC_BASE)
和
#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)
[RCC_BASE
和GPIOC_BASE
与abaolute地址定义在同一标头中,并且RCC_TypeDef
和GPIO_TypeDef
是结构类型-例如:
typedef struct
{
__IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */
__IO uint16_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */
uint16_t RESERVED0; /*!< Reserved, 0x06 */
__IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */
__IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */
__IO uint16_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */
uint16_t RESERVED1; /*!< Reserved, 0x12 */
__IO uint16_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */
uint16_t RESERVED2; /*!< Reserved, 0x16 */
__IO uint32_t BSRR; /*!< GPIO port bit set/reset registerBSRR, Address offset: 0x18 */
__IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */
__IO uint32_t AFR[2]; /*!< GPIO alternate function low register, Address offset: 0x20-0x24 */
__IO uint16_t BRR; /*!< GPIO bit reset register, Address offset: 0x28 */
uint16_t RESERVED3; /*!< Reserved, 0x2A */
}GPIO_TypeDef;
因此在以下位置扩展宏:
RCC->AHBENR|=RCC_AHBENR_GPIOCEN ;
解析为:
((RCC_TypeDef*)0x40021000)->AHBENR |= ((uint32_t)0x00080000) ;
[0x40021000
是RCC的基地址,AHBENR
指的是设置了GPIOC使能标志的RCC寄存器。
stm32f0xx.h定义每个外设的寄存器集的结构,然后定义宏,这些宏将结构映射到每个外设所驻留的地址。