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 的某个缓存获取该变量值,但该缓存中的是陈旧数据,导致数据访问有出入。