OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6250|回复: 9

请教一个问题!#define RCC ((RCC_TypeDef *) RCC_BASE)?

[复制链接]

10

主题

65

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2016-1-9
在线时间
30 小时
发表于 2016-1-18 14:15:10 | 显示全部楼层 |阅读模式
1金钱
#define RCC                 ((RCC_TypeDef *) RCC_BASE)  

这一句的意思是RCC是一个指针 , 然后把地址 RCC_BASE 赋给RCC吗?

那为什么为什么RCC没有定义呢。。

以及后面   RCC->RC 的使用  和上面那个定义的联系 跳跃太大了,有点晕了。。

C语言的确不怎么扎实求教了。

最佳答案

查看完整内容[请看2#楼]

#define RCC ((RCC_TypeDef *) RCC_BASE), 这个本身就是RCC的定义,这是最基本的宏定义, RCC_TypeDef是个结构体,有定义,找找看, RCC_BASE是个数值,具体地说是地址,取决于RCC寄存器在芯片中的实际地址, ((RCC_TypeDef *) RCC_BASE)的意思就是把RCC_BASE这个地址强制转换为RCC_TypeDef 类型的指针, RCC也就是((RCC_TypeDef *) RCC_BASE),就是指向RCC_BASE的RCC_TypeDef 类型的指针。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2015-12-21
在线时间
18 小时
发表于 2016-1-18 14:15:11 | 显示全部楼层
#define RCC   ((RCC_TypeDef *) RCC_BASE),
这个本身就是RCC的定义,这是最基本的宏定义,
RCC_TypeDef是个结构体,有定义,找找看,
RCC_BASE是个数值,具体地说是地址,取决于RCC寄存器在芯片中的实际地址,
((RCC_TypeDef *) RCC_BASE)的意思就是把RCC_BASE这个地址强制转换为RCC_TypeDef 类型的指针,
RCC也就是((RCC_TypeDef *) RCC_BASE),就是指向RCC_BASE的RCC_TypeDef 类型的指针。
回复

使用道具 举报

12

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2015-1-28
在线时间
8 小时
发表于 2016-1-18 14:20:15 | 显示全部楼层
RCC是一个宏,它代表文本“ ((RCC_TypeDef *) RCC_BASE)  ”,预编译的时候会把代码中出现的RCC替换为 ((RCC_TypeDef *) RCC_BASE),RCC->RC就是 ((RCC_TypeDef *) RCC_BASE)->RC。了解了C语言的宏和指针后,应该就能理解这些。
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-1-18 20:12:44 | 显示全部楼层
[mw_shl_code=c,true]void main(void)
{
    RCC_TypeDef *RCC;
   
    RCC = (RCC_TypeDef *)RCC_BASE;
   
   
    RCC->CR = .....
   
}[/mw_shl_code]
写成这样要是明白,真该再温习一下结构体和指针了。。
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

11

主题

94

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2015-6-7
在线时间
39 小时
发表于 2016-1-20 08:46:30 | 显示全部楼层
只是一个强制转换,和GPIO单PIN读写的原理是一样的
回复

使用道具 举报

33

主题

218

帖子

0

精华

高级会员

Rank: 4

积分
568
金钱
568
注册时间
2015-1-12
在线时间
75 小时
发表于 2020-2-19 23:53:47 | 显示全部楼层
磨剑 发表于 2016-1-18 14:20
RCC是一个宏,它代表文本“ ((RCC_TypeDef *) RCC_BASE)  ”,预编译的时候会把代码中出现的RCC替换为 ((RC ...

如果是定义结构体指针变量RCC,再使用RCC->RC我理解,但是 宏定义 RCC还是 结构体 指针常量也能直接用RCC->RC我就 不知道 怎么理解了  ?高手能再透彻讲下吗
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2020-8-23
在线时间
3 小时
发表于 2020-8-23 23:06:00 | 显示全部楼层
((RCC_TypeDef *) RCC_BASE)   是定义一个结构体指针 ,但没有没有定义一个RCC_TypeDef类型的变量,怎么就能赋值操作了.............
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3888
金钱
3888
注册时间
2017-3-7
在线时间
1694 小时
发表于 2020-8-24 12:55:18 | 显示全部楼层
xy108 发表于 2020-8-23 23:06
((RCC_TypeDef *) RCC_BASE)   是定义一个结构体指针 ,但没有没有定义一个RCC_TypeDef类型的变量,怎么就 ...

RCC_BASE有一个具体的值,RCC_TypeDef *只是把这个值转换成地址,这样就能通过这个地址操作寄存器了
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2020-8-23
在线时间
3 小时
发表于 2020-8-24 20:39:46 | 显示全部楼层
a5820736 发表于 2020-8-24 12:55
RCC_BASE有一个具体的值,RCC_TypeDef *只是把这个值转换成地址,这样就能通过这个地址操作寄存器了

感谢你的回复,只是觉得一般要操作结构体成员,至少需要有个结构体变量,然后可通过结构体指针来操作成员;这里只看到指针,并看不到结构体变量声明,应该是编译器编译时自动给创建了一个结构体变量(创建内存空间),语法上那样的操作就是对结构体变量的操作
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3888
金钱
3888
注册时间
2017-3-7
在线时间
1694 小时
发表于 2020-8-25 08:01:41 | 显示全部楼层
xy108 发表于 2020-8-24 20:39
感谢你的回复,只是觉得一般要操作结构体成员,至少需要有个结构体变量,然后可通过结构体指针来操作成员 ...

你可能跟java那些语言搞混了,c语言可直接操作内存,所以只要你知道地址就可以直接进行操作。并不要有什么变量,内存给你分配之类的操作
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 05:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表