C语言:寄存器操作

C语言:寄存器操作

在对芯片进行开发时,我们对芯片的操作本质上就是对芯片底层寄存器进行操作,在C语言中对寄存器进行操作则是通过寄存器的地址进行数据的赋值,那这个过程是如何实现的呢?

我们在学习单片机时,会使用到单片机厂商提供 SDK,会遇到如下的代码

/* 
 * CCM相关寄存器地址 
 */
#define CCM_CCGR0 			*((volatile unsigned int *)0X020C4068)
#define CCM_CCGR1 			*((volatile unsigned int *)0X020C406C)
#define CCM_CCGR2 			*((volatile unsigned int *)0X020C4070)
#define CCM_CCGR3 			*((volatile unsigned int *)0X020C4074)
#define CCM_CCGR4 			*((volatile unsigned int *)0X020C4078)
#define CCM_CCGR5 			*((volatile unsigned int *)0X020C407C)
#define CCM_CCGR6 			*((volatile unsigned int *)0X020C4080)

这些代码用宏定义来替换掉寄存器的地址,方便用户直接使用宏定义名称来操作寄存器,最关键的部分就是下面这段代码:

*((volatile unsigned int *)0X020C4068)

这部分代码就是用来映射寄存器,使用 volatile unsigned int * 来将一个寄存器地址强制转化为 unsigned int 的指针,同时使用 volatile 关键字对寄存器地址进行修饰,告诉编译器,该地址运行过程中随时可能变化,编译时不要过优化该地址!

关于 volatile 的用法可以看我之前的文章: C语言:volatile关键字

在将寄存器地址强制转化为指针地址后,在前面在加上 * 指向地址存放的值,之后我们直接调用宏定义就可以操作寄存器了,如下

CCM_CCGR0 = 0xffffffff;
CCM_CCGR1 = 0xffffffff;
CCM_CCGR2 = 0xffffffff;
CCM_CCGR3 = 0xffffffff;
CCM_CCGR4 = 0xffffffff;
CCM_CCGR5 = 0xffffffff;
CCM_CCGR6 = 0xffffffff;

以上一般就是对芯片寄存器进行开发时常用的操作手段

posted @ 2021-10-30 17:06  JeckXu666  阅读(1714)  评论(0编辑  收藏  举报