STM32学习笔记——寄存器映射
存储器映射GPIOB端口寄存器描述——使PB0输出0/1宏定义方式结构体封装
存储器映射
总线基地址
总线名称总线基地址
APB10x4000 0000APB20x4001 0000AHB0x4000 8000
GPIO基地址
GPIO端口挂在总线APB2上
端口名称端口基地址
GPIOA0x4001 0800GPIOB0x4001 0C00GPIOC0x4001 1000GPIOD0x4001 1400GPIOE0x4001 1800GPIOF0x4001 1C00GPIOG0x4001 2000
每个端口的基地址相差0x400
GPIOx端口的寄存器列表
以GPIOB端口为例
寄存器名称寄存器基地址偏移地址
GPIOB_CRL0x4001 0C000x00GPIOB_CRH0x4001 0C000x04GPIOB_IDR0x4001 0C000x08GPIOB_ODR0x4001 0C000x0CGPIOB_BSRR0x4001 0C000x10GPIOB_BRR0x4001 0C000x14GPIOB_LCKR0x4001 0C000x18
每个寄存器地址相差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;