看过论坛里面这个问题,并且百度过,但是关于#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条回答
少说多做
1楼-- · 2019-07-21 21:26
孟亮 发表于 2018-4-4 07:16
1、3合起来说,就是任意一串整数数字,都可以强制转成指向刚才整数为地址的指针,指针类型你可以随意定,

基地址是个地址,本身也就是由0和1组成的。那么按着你说的,假设GPIO_BASE的地址为010101(假设),那么GPIO_BASE被强制转化为结构体指针变量,那么结构体指针变量是不是就是指向010101这个地址了?
少说多做
2楼-- · 2019-07-21 21:45
孟亮 发表于 2018-4-4 07:16
1、3合起来说,就是任意一串整数数字,都可以强制转成指向刚才整数为地址的指针,指针类型你可以随意定,

(GPIO_TypeDef *) GPIOA_BASE通过这个强制转化将GPIOA_BASE(基地址)转化为结构体指针变量,那么此时结构体指针变量名是不是就是GPIOA_BASE它了?比如int *p   p就是指针变量名
rmrmrm
3楼-- · 2019-07-22 02:37
少说多做 发表于 2018-4-4 09:23
谢谢你的回答,GPIO_BASE(基地址)被强制转化为结构体指针变量,但是指针变量不得指向一个地址,那么基 ...

基地址被强制转换成结构体指针后,就相当于从这个基地址开始往下申请一段内存空间,大小由此结构体成员变量类型决定,然后你可以用结构体变量访问这些地址里面的数据,就相当于更改寄存器
孟亮
4楼-- · 2019-07-22 08:16
 精彩回答 2  元偷偷看……
孟亮
5楼-- · 2019-07-22 13:57
 精彩回答 2  元偷偷看……
林光华ing
6楼-- · 2019-07-22 18:23
本帖最后由 林光华ing 于 2018-4-4 10:49 编辑

1.        
指针就是专门针对地址的变量。这是C语言的很基础的知识。你的问题都是C语言里面的东西。
在32位MCU中,一个不超过U32的数字,当然可以转化为指针。对一个数字取*,就是取这个地址的值。而取多少,怎么取出来,是编译器根据的强制类型去操作。
(GPIO_TypeDef *) GPIOA_BASE。这里就很直观。
GPIOA_BASE是一个确定的数字(地址),结果值以GPIO_TypeDef的形式去取出来(其实就是看这个结构体多大,以GPIOA_BASE为基础地址,连续取后面sizeof(GPIO_TypeDef )字节的内容)。
需要注意的是,有些编译器可能不太支持过于复杂的指针变形。。。这个时候不能一步到位,要一步步去变形。。。
2.
就是指向变量a的内存地址
3.
你的理解是OK的

一周热门 更多>