看过论坛里面这个问题,并且百度过,但是关于#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)还有一些疑问,希望大神进来see

2019-07-20 23:17发布

这是我在论坛看的相关的帖子: #define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)        http://www.openedv.com/forum.php ... IO%5C_TypeDef%2B%2B
但是还是有一些疑问,想请各位大神给个解答。
首先谈下个人的理解:宏定义就是预处理的时候将出现GPIOA的全部替换为(GPIO_TypeDef *) GPIOA_BASE
GPIO_TypeDef是一个结构体,里面包含着7个IO端口的寄存器。
(GPIO_TypeDef *) GPIOA_BASE这个语句的意思是将GPIOA_BASE(参照上面的帖子好像是个地址)强制转换为结构体指针变量。
这样GPIO_A就可以访问GPIO_TypeDef结构体中的成员。
那么我有以下几个疑问:
1.地址能够强制转换为指针变量?(百度上说是可以的)
2.即时地址(GPIOA_BASE)能够强制转换为结构体指针变量,那么结构体指针变量需要指向一个变量的地址(指针变量是装地址的)。例如:int a=3;  int * p; p=&a;  那么被强制转换后的结构体指针变量,它指向的是哪个地址?
3.是不是可以这样理解GPIOA_BASE被强制转换为结构体指针变量,那么这个结构体指针变量指向的地址还是原来GPIOA_BASE的地址。而这个地址又是IO端口第一个寄存器的地址?
深夜发帖,必是深思熟虑。刚刚踏入stm32,还请各位感受指点。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
25条回答
JUSTNIUB
1楼-- · 2019-07-22 19:12
借楼问个问题:
我上午本来打了很长一段字打算回答这个问题,后面忽然想到了一个问题,就没有回答了。
这个问题是:
为什么使用 GPIO_TypeDef *,而不是GPIO_TypeDef 来强制转换这个GPIO_BASE? 原来是GPIOA->,改成后面的写法就变成GPIO.这样难道不行吗?
我现在大概有个模糊的答案,不过希望还是有人来解惑,或许比较简单,可能是我想的复杂了,请高手不吝赐教
少说多做
2楼-- · 2019-07-22 21:15
mack13013 发表于 2018-4-4 08:10
GPIOA_BASE实际上就是一串数字,该数字被当作地址的时候,地址总线会按照该数字映射。
比如假定GPIOA_BASE ...

谢谢了,我感觉我应该懂了。谢谢各位大神
少说多做
3楼-- · 2019-07-23 00:02
StayHungry123 发表于 2018-4-4 09:31
推荐你阅读《C Primer Plus》,懂得指针到底是个啥,以上几个问题自会迎刃而解。个人愚见两个主要特点:1.指 ...

谢谢你的回答,给了我一些启发。
少说多做
4楼-- · 2019-07-23 02:04
 精彩回答 2  元偷偷看……
少说多做
5楼-- · 2019-07-23 04:25
楼上的各位大神,谢谢你们的解答,你们每个人说的都很有道理。建议和我有同样疑惑的同学们,都看看楼上大神的说法。
少说多做
6楼-- · 2019-07-23 06:10
林光华ing 发表于 2018-4-4 10:35
1.        
指针就是专门针对地址的变量。这是C语言的很基础的知识。你的问题都是C语言里面的东西。
在32 ...

谢谢大神的帮忙

一周热门 更多>