STM32学习笔记——寄存器映射
存储器映射
- 总线基地址
总线名称 | 总线基地址 |
---|---|
APB1 | 0x4000 0000 |
APB2 | 0x4001 0000 |
AHB | 0x4000 8000 |
- GPIO基地址
GPIO端口挂在总线APB2上
端口名称 | 端口基地址 |
---|---|
GPIOA | 0x4001 0800 |
GPIOB | 0x4001 0C00 |
GPIOC | 0x4001 1000 |
GPIOD | 0x4001 1400 |
GPIOE | 0x4001 1800 |
GPIOF | 0x4001 1C00 |
GPIOG | 0x4001 2000 |
每个端口的基地址相差0x400
- GPIOx端口的寄存器列表
以GPIOB端口为例
寄存器名称 | 寄存器基地址 | 偏移地址 |
---|---|---|
GPIOB_CRL | 0x4001 0C00 | 0x00 |
GPIOB_CRH | 0x4001 0C00 | 0x04 |
GPIOB_IDR | 0x4001 0C00 | 0x08 |
GPIOB_ODR | 0x4001 0C00 | 0x0C |
GPIOB_BSRR | 0x4001 0C00 | 0x10 |
GPIOB_BRR | 0x4001 0C00 | 0x14 |
GPIOB_LCKR | 0x4001 0C00 | 0x18 |
每个寄存器地址相差0x04
GPIOB端口寄存器描述——使PB0输出0/1
宏定义方式
#define PERIPH_BASE ((unsigned int)0x40000000)
#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000)
#define GPIO_BASE (APB2PERIPH_BASE + 0x0C00)
#define GPIO_ODR *(unisgned int*)(GPIO_BASE + 0x0C)
//PB0输出低电平
GPIO_ODR &= ~(1<<0);
//PB0输出高电平
GPIO_ODR |= (1<<0)
(GPIO_BASE + 0x0C)对应GPIO_ODR寄存器地址
(unsigned int*) 将(GPIO_BASE + 0x0C)强制转化为指针
(*)指针操作,指向GPIO_ODR地址
结构体封装
typedef unsigned int uint32_t; /*无符号32位变量*/
typedef unsigned short int uint16_t; /*无符号16位变量*/
/*GPIO寄存器列表*/
typedef struct{
uint32_t CRL; /*地址偏移0x00*/
uint32_t CRH; /*地址偏移0x04*/
uint32_t IDR; /*地址偏移0x08*/
uint32_t ODR; /*地址偏移0x0C*/
uint32_t BSRR; /*地址偏移0x10*/
uint32_t BRR; /*地址偏移0x14*/
uint32_t LCKR; /*地址偏移0x18*/
}GPIO_TypeDef;
GPIO_TypeDef* GPIOx;
GPIOx = GPIO_BASE;
GPIO->ODR = 0xFFFFE;