Java教程

stm32寄存器封装

本文主要是介绍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;



这篇关于stm32寄存器封装的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!