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