#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) 是什么意思
答案:4 悬赏:0 手机版
解决时间 2021-04-29 13:09
- 提问者网友:树红树绿
- 2021-04-28 20:05
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) 是什么意思
最佳答案
- 五星知识达人网友:北城痞子
- 2021-04-28 21:21
文件stm32f10x_map.h包含了所有外设控制寄存器的结构,其中GPIO为:
typedef struct { vu32 CRL; vu32 CRH; vu32 IDR; vu32 ODR; vu32 BSRR; vu32 BRR; vu32 LCKR; } GPIO_TypeDef; typedef struct { vu32 EVCR; vu32 MAPR; vu32 EXTICR[4]; } AFIO_TypeDef;
已经声明新结构体类型名GPIO_TypeDef;,他就代表上面指定的结构体类型而vu32在函数库最开始就被定义了typedef volatile unsigned long vu32;
你看一下函数库吧,我也新手,这样是肯定的:GPIOx肯定对应CRL、CRH、IDR、ODR、BSRR、BRR寄存器 ;所以
define GPIOx ((GPIO_TypeDef *) GPIOx_BASE)就是GPIOx 在CRL、CRH、IDR、ODR、BSRR、BRR寄存器的基址
typedef struct { vu32 CRL; vu32 CRH; vu32 IDR; vu32 ODR; vu32 BSRR; vu32 BRR; vu32 LCKR; } GPIO_TypeDef; typedef struct { vu32 EVCR; vu32 MAPR; vu32 EXTICR[4]; } AFIO_TypeDef;
已经声明新结构体类型名GPIO_TypeDef;,他就代表上面指定的结构体类型而vu32在函数库最开始就被定义了typedef volatile unsigned long vu32;
你看一下函数库吧,我也新手,这样是肯定的:GPIOx肯定对应CRL、CRH、IDR、ODR、BSRR、BRR寄存器 ;所以
define GPIOx ((GPIO_TypeDef *) GPIOx_BASE)就是GPIOx 在CRL、CRH、IDR、ODR、BSRR、BRR寄存器的基址
全部回答
- 1楼网友:鱼忧
- 2021-04-29 01:10
在头文件 stm32f10x.h 内 已经 作了 预处理了
#define AFIO_BASE (APB2PERIPH_BASE + 0x0000)
#define EXTI_BASE (APB2PERIPH_BASE + 0x0400)
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400)
#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800)
#define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00)
#define GPIOG_BASE (APB2PERIPH_BASE + 0x2000
它们 都 已经被定义好了数值
#define AFIO_BASE (APB2PERIPH_BASE + 0x0000)
#define EXTI_BASE (APB2PERIPH_BASE + 0x0400)
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400)
#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800)
#define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00)
#define GPIOG_BASE (APB2PERIPH_BASE + 0x2000
它们 都 已经被定义好了数值
- 2楼网友:迟山
- 2021-04-28 23:41
#define GPIOA ((GPIO_TypeDef*)GPIOA_BASE)
1)GPIOA_BASE被强制转换为地址,空间以GPIO_TypeDef的类型进行构建,首址为GPIOA_BASE,空间内有成员,之间依各自固有类型顺序分配相应空间;
2)GPIOA宏展开,即为紧跟其后的具体内容,这样它就是一个指针了:指向以GPIOA_BASE为首址的结构体空间。所以您给出GPIOA->某成员,则操作成立,如取该成员地址、赋值等。
1)GPIOA_BASE被强制转换为地址,空间以GPIO_TypeDef的类型进行构建,首址为GPIOA_BASE,空间内有成员,之间依各自固有类型顺序分配相应空间;
2)GPIOA宏展开,即为紧跟其后的具体内容,这样它就是一个指针了:指向以GPIOA_BASE为首址的结构体空间。所以您给出GPIOA->某成员,则操作成立,如取该成员地址、赋值等。
- 3楼网友:鸽屿
- 2021-04-28 22:33
这是宏定义,是预编译命令。即,在正式编译程序前,先做字符串替代,替代完毕再编译。
例如:
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
预编译命令 说,凡后面程序中出现 GPIOA 的地方,把 GPIOA 换成:
((GPIO_TypeDef *) GPIOA_BASE) 后再编译。
后面的 #define 命令 类似。例如
#define GPIOI ((GPIO_TypeDef *) GPIOI_BASE)
即 凡后面程序中出现 GPIOI 的地方,把 GPIOI 换成:
((GPIO_TypeDef *) GPIOI_BASE) 后再编译。
----
另外:
(GPIO_TypeDef *) ... 是强制转换。
GPIO什么 替代后就有了 GPIO什么_BASE。 所以 原来的 结构体里面找不到 它们。
例如:
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
预编译命令 说,凡后面程序中出现 GPIOA 的地方,把 GPIOA 换成:
((GPIO_TypeDef *) GPIOA_BASE) 后再编译。
后面的 #define 命令 类似。例如
#define GPIOI ((GPIO_TypeDef *) GPIOI_BASE)
即 凡后面程序中出现 GPIOI 的地方,把 GPIOI 换成:
((GPIO_TypeDef *) GPIOI_BASE) 后再编译。
----
另外:
(GPIO_TypeDef *) ... 是强制转换。
GPIO什么 替代后就有了 GPIO什么_BASE。 所以 原来的 结构体里面找不到 它们。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯