看过论坛里面这个问题,并且百度过,但是关于#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-23 08:50
 精彩回答 2  元偷偷看……
少说多做
2楼-- · 2019-07-23 09:18
我觉得你们每个人都说的很好,但是只能设置一个最佳答案。对不起了
孟亮
3楼-- · 2019-07-23 14:48
 精彩回答 2  元偷偷看……
JUSTNIUB
4楼-- · 2019-07-23 15:24
孟亮 发表于 2018-4-5 08:26
个人感觉,是因为C不支持ref 和 out 关键词,这样形参传入函数时就没法被直接更改,甚至会重新分配内存。 ...

谢谢回答,不过你可能理解错我的意思了,我的意思是在定义GPIOA这个宏时,为什么不使用
#define  GPIOA        (GPIO_TypeDef ) GPIOA_BASE。
你其实解释的是做为变量的使用了,做为变量的话实际上它已经有分配内存,至于怎么寻址其实根据具体需求来定。而你说的不带*的定义,在我的印象里STM32的库函数中,这类类型大多数都不是直接与寄存器相关的。

孟亮
5楼-- · 2019-07-23 18:45
JUSTNIUB 发表于 2018-4-8 09:49
谢谢回答,不过你可能理解错我的意思了,我的意思是在定义GPIOA这个宏时,为什么不使用
#define  GPIOA  ...

#define PERIPH_BASE           ((uint32_t)0x40000000)
#define APB1PERIPH_BASE       PERIPH_BASE
#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)
#define AHBPERIPH_BASE        (PERIPH_BASE + 0x20000)
#define GPIOA_BASE            (APB2PERIPH_BASE + 0x0800)
他之前仅被定义为一个(uint32_t)整数,
你再强制转换成
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;
  __IO uint32_t LCKR;
} GPIO_TypeDef;
7个(uint32_t)数,会被报错或溢出之类的吧。。。。。
JUSTNIUB
6楼-- · 2019-07-23 19:29
 精彩回答 2  元偷偷看……

一周热门 更多>