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;
以上一般就是對芯片寄存器進行開發時常用的操作手段