文章目录
前言
本文记录的是用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;