stm32寄存器封装

文章目录


前言

本文记录的是用stm32开发的时候,一些底层的寄存器封装,固件库是如何帮我们完成这些工作的


一、版本一

代码如下(示例):

/* 外设基地址 */
#define PERIPH_BASE 		((unsigned int)0x4000000

/* 总线基地址 */
#define APB1PERIPH_BASE		(PERIPH_BASE + 0)
#define APB2PERIPH_BASE		(PERIPH_BASE + 0x10000)
#define APB2PERIPH_BASE		(PERIPH_BASE + 0x18000)

/* GPIO 外设基地址 */
#define GPIOA_BASE 			(APB2PERIPH_BASE + 0x800)
#define GPIOB_BASE 			(APB2PERIPH_BASE + 0xC00)
#define GPIOC_BASE 			(APB2PERIPH_BASE + 0x1000)
#define GPIOD_BASE 			(APB2PERIPH_BASE + 0x1C00)
#define GPIOE_BASE 			(APB2PERIPH_BASE + 0x1800)
#define GPIOF_BASE 			(APB2PERIPH_BASE + 0x2000)
#define GPIOG_BASE 			(APB2PERIPH_BASE + 0x2400)

/* 寄存器基地址,以GPIOB为例 */
#define GPIOB_CRL			(GPIOB_BASE + 0x00)
#define GPIOB_CRH			(GPIOB_BASE + 0x04)
#define GPIOB_IDR			(GPIOB_BASE + 0x08)
#define GPIOB_ODR			(GPIOB_BASE + 0x0C)
#define GPIOB_BSRR			(GPIOB_BASE + 0x10)
#define GPIOB_BRR			(GPIOB_BASE + 0x14)
#define GPIOB_LCKR			(GPIOB_BASE + 0x18)

二、版本二

代码如下(示例):

typedef unsigned int		uint32_t	//无符号32位变量
typedef unsigned short		uint16_t	//无符号16位变量

/* 外设基地址 */
#define PERIPH_BASE 		((unsigned int 0x4000000)

/* 总线基地址 */
#define APB1PERIPH_BASE		(PERIPH_BASE + 0)
#define APB2PERIPH_BASE		(PERIPH_BASE + 0x10000)
#define APB2PERIPH_BASE		(PERIPH_BASE + 0x18000)

/* GPIO 外设基地址 */
#define GPIOA_BASE 			(APB2PERIPH_BASE + 0x800)
#define GPIOB_BASE 			(APB2PERIPH_BASE + 0xC00)
#define GPIOC_BASE 			(APB2PERIPH_BASE + 0x1000)
#define GPIOD_BASE 			(APB2PERIPH_BASE + 0x1C00)
#define GPIOE_BASE 			(APB2PERIPH_BASE + 0x1800)
#define GPIOF_BASE 			(APB2PERIPH_BASE + 0x2000)
#define GPIOG_BASE 			(APB2PERIPH_BASE + 0x2400)

/* 寄存器基地址,以GPIOB为例 */
#define GPIOB_CRL			(GPIOB_BASE + 0x00)
#define GPIOB_CRH			(GPIOB_BASE + 0x04)
#define GPIOB_IDR			(GPIOB_BASE + 0x08)
#define GPIOB_ODR			(GPIOB_BASE + 0x0C)
#define GPIOB_BSRR			(GPIOB_BASE + 0x10)
#define GPIOB_BRR			(GPIOB_BASE + 0x14)
#define GPIOB_LCKR			(GPIOB_BASE + 0x18)

/* GPIO寄存器列表 */
typedef struct {
	uint32_t	CRL;	//GPIO 端口配置低寄存器		地址偏移:0x00
	uint32_t	CRH;	//GPIO 端口配置高寄存器		地址偏移:0x04
	uint32_t	IDR;	//GPIO 数据输入寄存器		地址偏移:0x08
	uint32_t	ODR;	//GPIO 数据输出寄存器		地址偏移:0x0c
	uint32_t	BSRR;	//GPIO 位设置/清除寄存器	地址偏移:0x10
	uint32_t	BRR;	//GPIO 端口位清除寄存器		地址偏移:0x14
	uint16_t	LCKR;	//GPIO 端口配置锁定寄存器	地址偏移:0x18
}GPIO_TypeDef;

//将寄存器输出某值
GPIO_TypeDef* GPIOx;
GPIOx = GPIOB_BASE;
GPIOB_BASE->IDR = 0xFFFF;
GPIOB_BASE->ODR = 0xFFFF;

//读取寄存器的值
uint32_t temp;
temp = GPIOB_BASE->IDR;



三、版本三

typedef unsigned int		uint32_t	//无符号32位变量
typedef unsigned short		uint16_t	//无符号16位变量

/* 外设基地址 */
#define PERIPH_BASE 		((unsigned int 0x4000000)

/* 总线基地址 */
#define APB1PERIPH_BASE		(PERIPH_BASE + 0)
#define APB2PERIPH_BASE		(PERIPH_BASE + 0x10000)
#define APB2PERIPH_BASE		(PERIPH_BASE + 0x18000)

/* GPIO 外设基地址 */
#define GPIOA_BASE 			(APB2PERIPH_BASE + 0x800)
#define GPIOB_BASE 			(APB2PERIPH_BASE + 0xC00)
#define GPIOC_BASE 			(APB2PERIPH_BASE + 0x1000)
#define GPIOD_BASE 			(APB2PERIPH_BASE + 0x1C00)
#define GPIOE_BASE 			(APB2PERIPH_BASE + 0x1800)
#define GPIOF_BASE 			(APB2PERIPH_BASE + 0x2000)
#define GPIOG_BASE 			(APB2PERIPH_BASE + 0x2400)

/* 寄存器基地址,以GPIOB为例 */
#define GPIOB_CRL			(GPIOB_BASE + 0x00)
#define GPIOB_CRH			(GPIOB_BASE + 0x04)
#define GPIOB_IDR			(GPIOB_BASE + 0x08)
#define GPIOB_ODR			(GPIOB_BASE + 0x0C)
#define GPIOB_BSRR			(GPIOB_BASE + 0x10)
#define GPIOB_BRR			(GPIOB_BASE + 0x14)
#define GPIOB_LCKR			(GPIOB_BASE + 0x18)

/* GPIO寄存器列表 */
typedef struct {
	uint32_t	CRL;	//GPIO 端口配置低寄存器		地址偏移:0x00
	uint32_t	CRH;	//GPIO 端口配置高寄存器		地址偏移:0x04
	uint32_t	IDR;	//GPIO 数据输入寄存器		地址偏移:0x08
	uint32_t	ODR;	//GPIO 数据输出寄存器		地址偏移:0x0c
	uint32_t	BSRR;	//GPIO 位设置/清除寄存器	地址偏移:0x10
	uint32_t	BRR;	//GPIO 端口位清除寄存器		地址偏移:0x14
	uint16_t	LCKR;	//GPIO 端口配置锁定寄存器	地址偏移:0x18
}GPIO_TypeDef;


#define GPIOA	((GPIO_TypeDef *)GPIOA_BASE)
#define GPIOB	((GPIO_TypeDef *)GPIOB_BASE)
#define GPIOC	((GPIO_TypeDef *)GPIOC_BASE)
#define GPIOD	((GPIO_TypeDef *)GPIOD_BASE)
#define GPIOE	((GPIO_TypeDef *)GPIOE_BASE)
#define GPIOF	((GPIO_TypeDef *)GPIOF_BASE)
#define GPIOG	((GPIO_TypeDef *)GPIOG_BASE)
#define GPIOH	((GPIO_TypeDef *)GPIOH_BASE)

//将寄存器输出某值
GPIOB->CRL = 0xffff;
GPIOB->CRH = 0xffff;
GPIOB->IDR = 0xffff;

//读取寄存器的值
uint32_t temp;
temp = GPIOB_BASE->IDR;



上一篇:有哪些笔记本工具支持M1呢?


下一篇:串口接收字符1-4(②配置GPIO结构体)