求助:#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)

2019-10-12 14:07发布

原子哥资料上说    #define     GPIOA         ((GPIO_TypeDef *) GPIOA_BASE)    这句语句的意思是GPIOA指向
地址GPIOA_BASE(即0x40010800)。请问定义这条语句后GPIOA怎么就指向GPIOA_BASE(即0x40010800)了,
哪位大神能回答下啊?
或者解释下  ((GPIO_TypeDef *) GPIOA_BASE) 这个强制类型转换也可以啊。
谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
shibinjie
1楼-- · 2019-10-13 00:30
回复【7楼】229382777@qq.com:
--------------------------------
你说的这些我都理解,只是有一点不理解#define     GPIOA         ((GPIO_TypeDef *) GPIOA_BASE)这句定义之后为什么结构体中的第一个元素就是0x40010800了(GPIOA_BASE = (APB2PERIPH_BASE + 0x0800) = ERIPH_BASE + 0x10000 + 0x0800 = 0x40000000 + 0x10000 + 0x0800 
= 0x40010800这个基地址我也理解)
it_do_just
2楼-- · 2019-10-13 05:16
首先GPIOA_BASE是常量,我们不能对常量进行操作,所以把它转为指针变量,前面你说根据基地址连续操作寄存器你能懂,那请问为什么能根据基地址进行操作?如果没有结构体,你只能把每个寄存器的地址常量都转为指针变量后再进行操作,但有了结构体后就不需要了,结构体有个特性,结构体的内存地址如果是对齐的话地址是连续的,刚好符合我们的操作需求,而且使这个地址有了范围,就像你把char类型强制转为了int类型,为什么就从1字节变成了4字节是一个道理,结构体代表的是一段内存空间,而你强制转换就是为这段空间取了个名字叫0x40010800,那么自然他的第一个元素就是0x40010800,就像数组名代表他的首地址一样,强烈建议学好C呀,C博大精深,自己也只会皮毛
最珍贵年轻的心
3楼-- · 2019-10-13 10:47
 精彩回答 2  元偷偷看……
shibinjie
4楼-- · 2019-10-13 12:51
回复【9楼】229382777@qq.com:
---------------------------------
谢谢解释的很清楚了,越来越觉得自己C没学好了
Ldd69stm32
5楼-- · 2019-10-13 12:53
229382777@qq.co 发表于 2015-11-17 10:02
首先GPIOA_BASE是常量,我们不能对常量进行操作,所以把它转为指针变量,前面你说根据基地址连续操作寄存器 ...

解释的很到位,谢谢
Ldd69stm32
6楼-- · 2019-10-13 13:34

一周热门 更多>