此预处理将GPIOA变成GPIO_typedef 类型的结构体指针,默认指向了GPIOA的基地址首。在调用->指向不同结构体成员时,指针就会根据成员变量类型的大小跳不同的步进,进而访问到不同的成员地址,对不同成员地址(其实就是GPIO的各功能寄存器)赋值处理就完成操作GPIO。这是我最近理解结构体指针的感悟。
这表示编译器会将代码中出现的GPIOA全部替换为((GPIO_TypeDef *) GPIOA_BASE)。从该句的C语言语法可以判断出((GPIO_TypeDef *) GPIOA_BASE)的功能为将GPIOA_BASE强制类型转换为指向GPIO_TypeDef类型的结构体变量。如此则需要找出GPIOA_BASE的含义,依次在“stm32f10x_map.h”文件中找到: #define GPIOA_BASE...
比如在“stm32f10x.h”中的代码: #define PERIPH_BASE ((uint32_t) 0x40000000) #define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) #define GPIOA_BASE (APB2PERIPH_BASE + 0x0800) #define GPIOA (GPIO_TypeDef *) GPIOA_BASE) 如上代码中,GPIOA经过四次宏定义,最终确立了其寄存器组的起始地址为0x...
define GPIOA ((GPIO_TypeDef*)GPIOA_BASE)1)GPIOA_BASE被强制转换为地址,空间以GPIO_TypeDef的类型进行构建,首址为GPIOA_BASE,空间内有成员,之间依各自固有类型顺序分配相应空间;2)GPIOA宏展开,即为紧跟其后的具体内容,这样它就是一个指针了:指向以GPIOA_BASE为首址的结构体空间。所以您...
//定义在<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...
((GPIO_TypeDef *) GPIOA_BASE)表示将GPIOA_BASE强制转换为指针类型的结构体, #define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) 表示用(GPIO_TypeDef *) GPIOA_BASE代替GPIOA ,那么现在GPIOA就表示以 GPIOA_BASE为基地址的一个类型为 GPIO_TypeDef结构体的一个指针,所以你程序里可以用...
先定义了 “片上外设”基地址 PERIPH_BASE,接着在 PERIPH_BASE 上 加入各个总线的地址偏移,得到 APB1、APB2 总线的地址 APB1PERIPH_BASE、 APB2PERIPH_BASE,在其之上加入外设地址的偏移,得到 GPIOA-G 的外设地址,最后在 外设地址上加入各寄存器的地址偏移,得到特定寄存器的地址。一旦有了具体地址,就可 以用指...
这句话我给你简单翻译一下:GPIOA首先是一个指向地址GPIOA_BASE的指针,指针类型为一个GPIO_TypeDef类型的结构体,也就是说GPIOA指向的结构体第一个成员为GPIOA的第一个寄存器,而这第一个寄存器的地址偏移一般是0,也就是说第一个寄存器的地址就是GPIOA_BASE,第二个寄存器地址为GPIOA_BASE+4个字节,以此类推。
GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins. This parameter can be a value of @ref GPIOMode_TypeDef */ }GPIO_InitTypeDef; typedef enum //输出速度枚举定义,注意一个细节,只使用了bit0和bit1低两位 ...
10 #define RCC ((RCC_TypeDef *) RCC_BASE) 这些宏通过强制类型转换把外设的基地址转换成 GPIO_TypeDef 类型的指针,从而得 到 GPIOA、GPIOB 等直接指向对应外设的指针,通过对结构体指针的操作,即可访问对应 外设的寄存器。 三main函数实现 1 /*