寄存器地址說明
- 存儲寄存器地址的大小為4位,也就是地址偏移相差0x4 ,每位存儲1字節數據,共4字節(32位)
-
0x400 == 1K
-
0x10 0000 == 1M
-
0X4000 0000 == 1G
-
0X8000 0000 == 2G
格式:寄存器地址 |= value(置1)、寄存器地址 &= value(置0)
例子:
GPIOB_CRL &= ~(1111<<4*N); //左移4*N位,先復位
GPIOB_CRL |= (1101<<4*N); //左移4*N位,再置位
含義:
-
-
-
1101:寄存器配置的模式
-
4*N:假設以每4位為一組,第N組
-
1101<<4*2 = 1101 0000 0000
-
-
或者
HWREG(BASE + OFFSET) &=DATA
HWREG(BASE + OFFSET) |=DATA //置位
BASE:基地址,OFFSET:偏移地址 ,DATA:模式或者數據
#define HWREG(x) *((volatile unsigned int *)(x)))
-
把x轉化為volatile unsigned int *(地址/指針)類型,並*取值(內容)
-
對寄存器里面的內容進行操作
volatile
-
volatile是一個特征修飾符(type specifier).volatile的作用是作為指令關鍵字,確保本條指令不會因編譯器的優化而省略,且要求每次直接讀值。
-
volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設這個變量的值了。
-
精確地說就是,編譯器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器里的備份。
-
#define __IO volatile
寄存器置1置0