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 的某個緩存獲取該變量值,但該緩存中的是陳舊數據,導致數據訪問有出入。