找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9074|回复: 5
收起左侧

解释#define RCC ((RCC_TypeDef *) RCC_BASE)

[复制链接]
ID:59583 发表于 2014-3-26 15:34 | 显示全部楼层 |阅读模式
#define RCC  ((RCC_TypeDef *) RCC_BASE)
RCC_TypeDef是一个定义的结构体
RCC_BASE是一个unsigned long(32位数值)
简化后是:(int *) 0xb8000000.
明显,指针是一个存放地址的变量,
int a=1;
int *p=&a;
a与*p是同一个体!
在stm32你是知道RCC寄存器的地址的如0xb8000000,并且目的是用指针指向这个地
很自然会有:
int *p;
p=0xb8000000;
但是0xb8000000是一个整数,编译器不知0xb8000000是内存地址,所以通过强制类型转换将数字转为合适的地址类型。
则,int *p;
p=(int *)0xb8000000;
这样P就装有一个地址,
#define RCC  ((RCC_TypeDef *) RCC_BASE)
RCC  就指向是RCC_BASE这个地址
从RCC_BASE开始,长度为RCC_TypeDef这个类型的长度!
其实
int *p;
p=0xb8000000;

int *p;
p=(int *)0xb8000000;
没有多大区别,都实现同样的功能。
前者由于p是int *类型,所以给p赋值0xb8000000时会作默认类型转换,有些编译器也许会有警告。但访问*p时也会得到int型的数据。
后者加上了(int *),是做了强制类型转换,消除了潜在的警告。编程思想表述得更清晰。访问*p同样是得到int型的数据。

回复

使用道具 举报

ID:152913 发表于 2017-6-19 15:59 | 显示全部楼层
nt a=1; int *p=&a; a与*p是同一个体!    这里错了  *p你前面存的是a的地址,所以给a分配人的存储内容是1,而*p存储的是a的地址,不是a的内容,所以两个不是一回事
回复

使用道具 举报

ID:152913 发表于 2017-6-19 16:01 | 显示全部楼层
总体很好  赞一个
回复

使用道具 举报

ID:271772 发表于 2018-1-6 10:36 | 显示全部楼层
也就是说:P就是RCC,RCC_Typedef*就相当于int*,RCC_BASE就相当于0xb8000000。 (RCC_TypeDef *) 相当于(int*)强制类型转换。
回复

使用道具 举报

ID:271772 发表于 2018-1-6 10:41 | 显示全部楼层
#define RCC ((RCC_TypeDef *) RCC_BASE)

int *p;
p=0xb8000000;

RCC 相当于 p;
RCC_TypeDef * 相当于 int*;
RCC_BASE 相当于0xb8000000;
回复

使用道具 举报

ID:18591 发表于 2019-1-20 21:02 | 显示全部楼层

下载学习,谢谢分享
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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