STM32学习笔记——寄存器映射

存储器映射

  1. 总线基地址
总线名称 总线基地址
APB1 0x4000 0000
APB2 0x4001 0000
AHB 0x4000 8000
  1. 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

  1. 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;

猜你喜欢

转载自blog.csdn.net/weixin_46185572/article/details/107123071