标题:
解释#define RCC ((RCC_TypeDef *) RCC_BASE)
[打印本页]
作者:
9geren
时间:
2014-3-26 15:34
标题:
解释#define RCC ((RCC_TypeDef *) RCC_BASE)
#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型的数据。
作者:
兰小方
时间:
2017-6-19 15:59
nt a=1; int *p=&a; a与*p是同一个体! 这里错了 *p你前面存的是a的地址,所以给a分配人的存储内容是1,而*p存储的是a的地址,不是a的内容,所以两个不是一回事
作者:
兰小方
时间:
2017-6-19 16:01
总体很好 赞一个
作者:
箫声欲碎
时间:
2018-1-6 10:36
也就是说:P就是RCC,RCC_Typedef*就相当于int*,RCC_BASE就相当于0xb8000000。 (RCC_TypeDef *) 相当于(int*)强制类型转换。
作者:
箫声欲碎
时间:
2018-1-6 10:41
#define RCC ((RCC_TypeDef *) RCC_BASE)
int *p;
p=0xb8000000;
RCC 相当于 p;
RCC_TypeDef * 相当于 int*;
RCC_BASE 相当于0xb8000000;
作者:
jxchen
时间:
2019-1-20 21:02
下载学习,谢谢分享
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1