stm32寄存器封装
2021/11/24 6:11:57
本文主要是介绍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寄存器封装的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-11cursor试用出现:Too many free trial accounts used on this machine 的解决方法
- 2025-01-11百万架构师第十四课:源码分析:Spring 源码分析:深入分析IOC那些鲜为人知的细节|JavaGuide
- 2025-01-11不得不了解的高效AI办公工具API
- 2025-01-102025 蛇年,J 人直播带货内容审核团队必备的办公软件有哪 6 款?
- 2025-01-10高效运营背后的支柱:文档管理优化指南
- 2025-01-10年末压力山大?试试优化你的文档管理
- 2025-01-10跨部门协作中的进度追踪重要性解析
- 2025-01-10总结 JavaScript 中的变体函数调用方式
- 2025-01-10HR团队如何通过数据驱动提升管理效率?6个策略
- 2025-01-10WBS实战指南:如何一步步构建高效项目管理框架?