此预处理将GPIOA变成GPIO_typedef 类型的结构体指针,默认指向了GPIOA的基地址首。在调用->指向不同结构体成员时,指针就会根据成员变量类型的大小跳不同的步进,进而访问到不同的成员地址,对不同成员地址(其实就是GPIO的各功能寄存器)赋值处理就完成操作GPIO。这是我最近理解结构体指针的感悟。
这是宏定义,是预编译命令。即,在正式编译程序前,先做字符串替代,替代完毕再编译。例如:define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)预编译命令 说,凡后面程序中出现 GPIOA 的地方,把 GPIOA 换成:((GPIO_TypeDef *) GPIOA_BASE) 后再编译。后面的 #define 命令 类似。例如...
1)GPIOA_BASE被强制转换为地 址,空间以GPIO_TypeDef的 类型进行 构建,首址为GPIOA_BASE,空间内有成员,之间依各自固有类型顺序分配相应空间; 2)GPIOA宏展开,即为紧跟其后的具体内容,这样它就是一个指针了:指向以GPIOA_BASE为首址的结构体空间。所以您给出GPIOA->某成员,则操作成立,如取该成员地址、赋值等。
GPIOA是一个结构体指针,他指向一个地址为GPIOA_BASE的结构体GPIO_TypeDef。其中GPIOA_BASE就是控制这组IO口的寄存器组的基地址,GPIO_TypeDef是一个结构体,里面的成员变量对应着A组IO的相关控制寄存器,如:GPIOA->ODR;GPIOA->IDR;GPIOA->CRL;GPIOA->CRH等等就是控制A组IO口的寄存器,操作GPIO...
先定义了 “片上外设”基地址 PERIPH_BASE,接着在 PERIPH_BASE 上 加入各个总线的地址偏移,得到 APB1、APB2 总线的地址 APB1PERIPH_BASE、 APB2PERIPH_BASE,在其之上加入外设地址的偏移,得到 GPIOA-G 的外设地址,最后在 外设地址上加入各寄存器的地址偏移,得到特定寄存器的地址。一旦有了具体地址,就可 以用指...
//定义在<stm32f103xb.h>中#define GPIOA((GPIO_TypeDef*)GPIOA_BASE)#define GPIOB((GPIO_TypeDef*)GPIOB_BASE)#define GPIOC((GPIO_TypeDef*)GPIOC_BASE)#define GPIOD((GPIO_TypeDef*)GPIOD_BASE)#define GPIOE((GPIO_TypeDef*)GPIOE_BASE)//这里注释表示上下两段在文件中是非连续排版的下同#define...
操作GPIOA_MODE,写入data值 第一种: *(unsigned int *)0x4002 0000=data; 第二种: #define GPIOA_MODE *(unsigned int *)0x4002 0000 GPIOA_MODE=data; 第三种: #define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)#define GPIOC ((GPIO_TypeDef *) GP...
#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE) GPIOA=GPIOA_BASE=0x40000000+0x10000+0x800 通过查询STM32微控制器开发手册可以得知,STM32的外设起始基地址为0x40000000,而APB2总线设备起始地址相对于外设基地址的偏移量为0x10000,GPIOA设备相对于APB2总线设备起始地址偏移量为0x800。
#define GPIOA (GPIO_TypeDef *) GPIOA_BASE) 如上代码中,GPIOA经过四次宏定义,最终确立了其寄存器组的起始地址为0x4001 0800。 2)结构体定义接口的寄存器组 其次,每个接口都是有多个寄存器进行管理,这些寄存器大多地址连续,所以将其定义为结构体类型,然后结构体变量,就可以用一个宏定义映射到整个寄存器组的存储...
typedef struct { uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured. This parameter can be any value of @ref GPIO_pins_define */ GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins. This parameter can be a value of @ref GPIOSpeed_TypeDef */...