筆記:STM32中寄存器地址與指針的轉換

1.STM32中的存儲器映射地址(查STM32F429數據手冊)

/*片上外設基地址*/
#define PERIPH_BASE             ((unsigned int)0x40000000)

 /*AHB1總線基地址*/
#define AHB1PERIPH_BASE         (PERIPH_BASE + 0x00020000)

 /*GPIOB基地址*/
#define GPIOB_BASE              (AHB1PERIPH_BASE + 0x0400)

2.將寄存器地址轉換成指針

#define GPIOB_MODER            *(unsigned int*)(GPIOB_BASE+0x00)

#define GPIOB_OTYPER           *(unsigned int*)(GPIOB_BASE+0x04)
    (unsigned int*)(GPIOB_BASE+0x00)    把地址強制轉換成指針類型
    *(unsigned int*)(GPIOB_BASE+0x00)   把地址強制轉換成指針類型並指向該地址
    
     “*”作用是解引用,引用指針指向的變量值,引用其實就是引用該變量的地址。

3.封裝寄存器時,需要用volatile修飾

 #define __IO    volatile

關鍵字“ volatile”在 C 語言中該關鍵字用於表示變量是易變的,要求編譯器不要優化,每次使用這些變量的時候,都要求 CPU 去該變量的地址重新訪問。若沒有這個關鍵字修飾,在某些情況下,編譯器認爲沒有代碼修改該變量,就直接從CPU 的某個緩存獲取該變量值,但該緩存中的是陳舊數據,導致數據訪問有出入。

解引用:百度百科

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章