在使用cpu資源的時候,須要設置寄存器才能使用相應的資源,而在STM32裏使用寄存器會相似於下面這種spa
GPIOA -> ODR |=1<<3;
這樣就訪問並設置了端口A的 ODR 寄存器,但是有不少人不明白怎麼就訪問了地址了,怎麼就經過一個結構體的賦值語句就能設置ODR這個寄存器呢指針
下面咱們就來本身編寫一個結構體來操做寄存器code
既然是結構體語句,確定會有結構體的存在,而結構體裏面的內容就是一個功能組的裏面的寄存器名字,如:blog
這個CCM寄存器功能組裏面就包含了CCM_CCR,CCM_CCDR等等,由於在一個寄存器功能組裏的地址是相連或者相近的,這裏面咱們就能夠做爲一個結構體,定義以下:資源
typedef struct { volatile unsigned int CCR; volatile unsigned int CCDR; volatile unsigned int CSR; …… volatile unsigned int CCGR6; volatile unsigned int RESERVED_3[1]; volatile unsigned int CMEOR; }CCM_Type;
能夠看見結構體裏的排列順序與寄存器的排列順序是同樣的,但會發如今結構體中出現了一個 RESERVED_3[1];這個是在官方寄存器中是沒有的,這是爲何呢,咱們來看看官方寄存器表class
能夠看見CCM_CCGR6 地址爲20C4080,CCM_CMEOR地址爲20C4088,中間爲相隔了8個字節地址,咱們能夠參考上面的寄存器地址,中間相隔爲4個字節,說明這兩個地址之間空了一個寄存器,咱們就須要把這個寄存器地址給他用其餘值來進行代替,由於咱們結構體的地址是連續的,若是不佔用這個地址,後面的值得地址就會偏移。im
如今結構體有了,尚未指定地址,咱們須要給定結構體基地址,而這個基地址就是咱們這個寄存器組的第一個寄存器的地址cpu
#define CCM_address 0x20c400 //定義基地址
給結構體基地址img
#define CCM ((CCM_Type*)CCM_address) //外設指針
這樣咱們就能夠像STM32那樣使用結構體來使用寄存了端口
CCM -> CCR |= 1<<3;