此预处理将GPIOA变成GPIO_typedef 类型的结构体指针,默认指向了GPIOA的基地址首。在调用->指向不同结构体成员时,指针就会根据成员变量类型的大小跳不同的步进,进而访问到不同的成员地址,对不同成员地址(其实就是GPIO的各功能寄存器)赋值处理就完成操作GPIO。这是我最近理解结构体指针的感悟。
1)GPIOA_BASE被强制转换为地 址,空间以GPIO_TypeDef的 类型进行 构建,首址为GPIOA_BASE,空间内有成员,之间依各自固有类型顺序分配相应空间; 2)GPIOA宏展开,即为紧跟其后的具体内容,这样它就是一个指针了:指向以GPIOA_BASE为首址的结构体空间。所以您给出GPIOA->某成员,则操作成立,如取该成员地址、赋值等。
#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)GPIOC_BASE是GPIOC模块的起始地址.GPIO_TypeDef 是一结构体,如下.typedef struct{vu32 CRL;vu32 CRH;vu32 IDR;vu32 ODR;vu32 BSRR;vu32 BRR;vu32 LCKR;} GPIO_TypeDef; 相关知识点: 试题来源: ...
这段代码先用 GPIO_TypeDef 类型定义一个结构体指针 GPIOx,并让指针指向地址 GPIOB_BASE(0x4001 0C00),使用地址确定下来,然后根据 C 语言访问结构体的语法,用 GPIOx->ODR 及 GPIOx->IDR 等方式读写寄存器。 最后,我们更进一步,直接使用宏定义好 GPIO_TypeDef 类型的指针,而且指针指向 各个 GPIO 端口的首地...
这是宏定义,是预编译命令。即,在正式编译程序前,先做字符串替代,替代完毕再编译。例如:define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)预编译命令 说,凡后面程序中出现 GPIOA 的地方,把 GPIOA 换成:((GPIO_TypeDef *) GPIOA_BASE) 后再编译。后面的 #define 命令 类似。
将GPIOB_BASE强转为GPIO_TypeDef 类型的指针
GPIOC_BASE是GPIOC模块的起始地址.GPIO_TypeDef 是一结构体,如下.typedef struct{vu32 CRL;vu32 CRH;vu32 IDR;vu32 ODR;vu32 BSRR;vu32 BRR;vu32 LCKR;} GPIO_TypeDef; 扫码下载作业帮搜索答疑一搜即得 答案解析 查看更多优质解析 解答一 举报 typedef struct{vu32 CRL;vu32 CRH;vu32 IDR;vu32 ODR;vu...
typedef struct { __IO uint32_t CR; /*!< RCC clock control register, Address offset: 0...
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低两位 ...
//通过查找 GPIO_TypeDef 结构体可以看到typedef struct{__IO uint32_t CRL;//端口配置低寄存器__IO uint32_t CRH;//端口配置高寄存器__IO uint32_t IDR;//端口输入数据寄存器__IO uint32_t ODR;//端口输出数据寄存器__IO uint32_t BSRR;//端口置位/复位寄存器__IO uint32_t BRR;//端口位清除寄存...