# 寄存器定義 在單晶片中常常需要操作硬體寄存器,也就是對寄存器的地址進行讀取或寫入等操作,因此要如何定義已知寄存器的位址以方便程序員操作呢? 一般變數宣告 ```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 ```