# 寄存器定義
在單晶片中常常需要操作硬體寄存器,也就是對寄存器的地址進行讀取或寫入等操作,因此要如何定義已知寄存器的位址以方便程序員操作呢?
一般變數宣告
```c=
int a = 5; // 變數a會由編譯器自行產生地址,其內容為5
int *b;
```
若要指定指標的位置,則`int *b = 0x20000000;` 但此時編譯器會編譯錯誤,錯誤類型為型態錯誤。
因此需將整數強制轉成指標 `int *b = (int *)0x20000000;`
因此若要對0x20000000地址寫入值123
則 `*((int *)0x20000000) = 123;`
此方法可直接操作此地址的內容,不再需要宣告指標b
同理,若要將0x20000000地址裡值寫入到變數a
則 `a = *((int *)0x20000000);`
為了讓工程師在寫程式可以不再一一對照datasheet,而將每個硬體相關寄存器的位置預先定義好,可將地址定義如下:
```c=
#define CPUREG *((volatile int *)0x20000000)
```
而加入volatile是為了要避免編譯器將這個重要的寄存器進行優化(修改)
往後只需對定義CPUREG進行操作即可
即
```c=
CPUREG = 123; // 地址為0x20000000寫入值123
a = CPUREG; // 讀取地址為0x20000000的值放入至變數a
```