C语言访问MCU寄存器
问题由来:
//下面这行代码的意思是直接操作0X020C4068这个寄存器
//具体寄存器的作用是通过手册得到的
#define CCM_CCGR0 *((volatile unsigned int*)0X020C4068)
//假设寄存器为32位
//要设置0X020C4068寄存器值为0X03,可以直接写成
CCM_CCGR0=0X03
为什么这个宏定义可以直接操作这个地址??
将上述代码拆解来看
1. 第一步
(unsigned int*)0X020C4068
//表示将0X020C4068强制转换为unsigned int 类型的指针
//0X020C4068代表一个16进制的数据
2. 第二步
(volatile unsigned int*)0X020C4068
//由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问。
//当要求使用volatile声明变量值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。
//精确地说就是,遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问;
//如果不使用valatile,则编译器将对所声明的语句进行优化。
//(简洁的说就是:volatile关键词影响编译器编译的结果,用volatile声明的变量表示该变量随时可能发生变化,与该变量有关的运算,不要进行编译优化,以免出错)
//用volatile定义

最低0.47元/天 解锁文章
706

被折叠的 条评论
为什么被折叠?



