STM32F4存储器映射
如何访问寄存器
以GPIOA寄存器组为例、如何读写ODR寄存器?
已知GPIOA的起始地址为0x40020000
各寄存器的偏移地址如下:
MODER;
/*Address offset: 0x00 */
OTYPER;
/*Address offset: 0x04 */
OSPEEDR;
/*Address offset: 0x08 */
PUPDR;
/*Address offset: 0x0C */
IDR;
/*Address offset: 0x10 */
ODR;
/*Address offset: 0x14 */
BSRR;
/*Address offset: 0x18 */
LCKR;
/*Address offset: 0x1C */
如何访问寄存器——第一种方式
对地址进行宏定义
#defineGPIOA_BASE( (unsigned int ) 0x40020000 )
#defineGPIOA_ODR( GPIOA_BASE+0x14 )
读操作val= *(unsigned int *) GPIOA_ODR ;
写操作*(unsigned int *)GPIOA_ODR = val ;
改进
#defineGPIOA_ODR(*(unsigned int *) ( GPIOA_BASE+0x14 ))
val= GPIOA_ODR ;//读GPIOA_ODR = val ;//写
如何访问外设寄存器——第二种方式
用结构体封装寄存器
用上面的方法去定义地址,还是稍显繁琐、根据我们每一类外设对应的寄存器组地址都是连续增长的特点,我们引入 C 语言中的结构体语法对寄存器进行封装
typedef struct {
uint32_t MODER; /*Address offset: 0x00 */
uint32_t OTYPER; /*Address offset: 0x04 */
uint32_t OSPEEDR; /*Address offset: 0x08 */
uint32_t PUPDR; /*Address offset: 0x0C */
uint32_t IDR; /*Address offset: 0x10 */
uint32_t ODR; /*Address offset: 0x14 */
uint32_t BSRR; /*Address offset: 0x18 */
uint32_t LCKR; /*Address offset: 0x1C */
} GPIO_TypeDef;
#define GPIOA_BASE( (unsigned int ) 0x40020000 )
#define GPIOA((GPIO_TypeDef *) GPIOA_BASE)
STM32F4启动流程详解
STM32F407启动文件分析