linux 下定義寄存器宏 實現相似於STM32的寄存器操做

在使用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;
相關文章
相關標籤/搜索