STM32-位带操作及位带别名区

这里写自定义目录标题

  • 一、位带操作的基本含义及作用
  • 二、以STM32为例
  • 三、位带别名区和位带区(寄存器地址位地址)的转换关系
  • 四、使用例程

一、位带操作的基本含义及作用

	位带别名区的设计主要是为了**方便对位带区单个比特位进行读写操作**。在某些应用场景下,
	需要频繁地对位带区某个特定的比特位进行读写操作,但是由于处理器架构中并没有提供直接读写
	位带区单个比特位的指令,因此需要使用一定的位运算来实现。但是,这样会使得代码复杂且容易出错。

   位带别名区的出现,就是为了解决这个问题。它通过为位带区每个比特位分配一个独立的物理地址,以便能够
   直接对某个特定的比特位进行读写操作,从而避免了手动进行位运算的麻烦和出错风险。实际上,位带别名区
   就是在内存中专门开辟出来的一段空间,其中的每4个字节都与原始内存中的某个特定的比特位相映射,从而可
   以直接对该比特位进行读写操作

二、以STM32为例

STM32就要两个位带区:一个是SRAM存储寄存器映射区,二是外设位带区
(把寄存器的每一个位映射成一个 32 位的字)

STM32物理内存映射

如上图所示:
一个是SRAM存储寄存器映射区:
0x2000 0000–0x2000 0FFF是SRAM(静态随机存取)的物理地址
0x20001000–0x3FFF FFFF是保留部分内存,它的目的就是为了以某一种关系把0x2000 0000–0x2000 0FFF的每一个位映射到0x20001000–0x3FFF FFFF的空间中,实现一个比特位转换为一个字的空间(STM32的一个地址存储一个4个字节(32位)的内容),这种关系下面再详细说明

二是外设位带区
0x4000 0000–0x4002 03F7是各种外设寄存器的物理地址
而0x4002 03F8–Ox5FFF FFFF是保留部分内存,功能和上面说得一样

三、位带别名区和位带区(寄存器地址位地址)的转换关系

   下面是它们的转换公式:
	(Base_Adr +0x02000000+ byte_offset * 32) + (bit_number * 4)
	Base_Adr是位带区的基地址,
	
	byte_offset 表示该比特位在位带区中的偏移量,如果知道某一寄存器的实际物理位置
	为Reg_Adr,则byte_offset =Reg_Adr - Base_Adr
	
	bit_number 则是该比特位在所在字节中的位偏移量。

对SRAM说:Base_Adr = 0x20000000u
对外设位带区说:Base_Adr = 0x40000000u

四、使用例程

#define GPIO_BITBAND_REG(Reg,Bit)    (*((uint32_t volatile*)\
(0x40000000u +0x02000000u+ (((uint32_t)&(Reg) - (uint32_t)0x40000000u)\
<<5) + (((uint32_t)(Bit))<<2))))
//GPIO_OUT
#define PA0_OUT       GPIO_BITBAND_REG(GPIOA->ODAT, 0) 
#define PA1_OUT       GPIO_BITBAND_REG(GPIOA->ODAT, 1)
#define PA2_OUT       GPIO_BITBAND_REG(GPIOA->ODAT, 2)
#define PA3_OUT       GPIO_BITBAND_REG(GPIOA->ODAT, 3)
#define PA4_OUT       GPIO_BITBAND_REG(GPIOA->ODAT, 4)
#define PA5_OUT       GPIO_BITBAND_REG(GPIOA->ODAT, 5)
#define PA6_OUT       GPIO_BITBAND_REG(GPIOA->ODAT, 6)
#define PA7_OUT       GPIO_BITBAND_REG(GPIOA->ODAT, 7)
#define PA8_OUT       GPIO_BITBAND_REG(GPIOA->ODAT, 8)
#define PA9_OUT       GPIO_BITBAND_REG(GPIOA->ODAT, 9)
#define PA10_OUT      GPIO_BITBAND_REG(GPIOA->ODAT, 10)
#define PA11_OUT      GPIO_BITBAND_REG(GPIOA->ODAT, 11)
#define PA12_OUT      GPIO_BITBAND_REG(GPIOA->ODAT, 12)
#define PA13_OUT      GPIO_BITBAND_REG(GPIOA->ODAT, 13)
#define PA14_OUT      GPIO_BITBAND_REG(GPIOA->ODAT, 14)
#define PA15_OUT      GPIO_BITBAND_REG(GPIOA->ODAT, 15)

#define PB0_OUT       GPIO_BITBAND_REG(GPIOB->ODAT, 0)
#define PB1_OUT       GPIO_BITBAND_REG(GPIOB->ODAT, 1)
#define PB2_OUT       GPIO_BITBAND_REG(GPIOB->ODAT, 2)
#define PB3_OUT       GPIO_BITBAND_REG(GPIOB->ODAT, 3)
#define PB4_OUT       GPIO_BITBAND_REG(GPIOB->ODAT, 4)
#define PB5_OUT       GPIO_BITBAND_REG(GPIOB->ODAT, 5)
#define PB6_OUT       GPIO_BITBAND_REG(GPIOB->ODAT, 6)
#define PB7_OUT       GPIO_BITBAND_REG(GPIOB->ODAT, 7)
#define PB8_OUT       GPIO_BITBAND_REG(GPIOB->ODAT, 8)
#define PB9_OUT       GPIO_BITBAND_REG(GPIOB->ODAT, 9)
#define PB10_OUT      GPIO_BITBAND_REG(GPIOB->ODAT, 10)
#define PB11_OUT      GPIO_BITBAND_REG(GPIOB->ODAT, 11)
#define PB12_OUT      GPIO_BITBAND_REG(GPIOB->ODAT, 12)
#define PB13_OUT      GPIO_BITBAND_REG(GPIOB->ODAT, 13)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/461465.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

手把手学会pycharm中使用git

学习教程&#xff1a;http://【git pycharm的使用 连接github】 https://www.bilibili.com/video/BV1sv4y1D7SW/?share_sourcecopy_web&vd_source1a32dd27a726236a74603cf06b7302aa 1. 上传到本地仓库 &#xff08;1&#xff09;直接上传本地仓库 &#xff08;2&#xf…

OpenOFDM接收端信号处理流程

Overview — OpenOFDM 1.0 documentation 本篇文章为学习OpenOFDM之后的产出PPT&#xff0c;仅供学习参考。 ​​​​​​​

easyExcel 导入、导出Excel 封装公共的方法

文档包含三部分功能 1、easyExcel 公共导出list<对象>方法&#xff0c;可以自定义excel中第一行和样式 2、easyExcel 导入逻辑&#xff0c;结合spring Validator 验证导入数据是否符合规范 3、easyExcel 自定义导出 list<map> 、 list<对象> &#xff08;可…

Redis中的缓存设计

缓存穿透 缓存穿透是指查询一个根本不存在的数据&#xff0c;缓存层和存储层都不会命中&#xff0c;通常处于容错的考虑&#xff0c;如果从存储层查不到数据则不写入缓存层。缓存穿透将导致不存在的数据每次请求都要到存储层去查询&#xff0c;失去了缓存保护后端存储的意义。…

Java两周半速成之路(第十六天)

一、网络编程 1.概述&#xff1a; 就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换 2.网络模型 3.网络参考模型图 4.网络通信三要素 4.1IP地址 InetAddress类的使用&#xff1a; 注意&#xff1a;通过API查看&#xff0c;此类没有构造方法&#xff0c;如…

精读《精通 console.log》

1 引言 本周精读的文章是 Mastering JS console.log like a Pro&#xff0c;一起来更全面的认识 console 吧&#xff01; 2 概述 & 精读 console 的功能主要在于控制台打印&#xff0c;它可以打印任何字符、对象、甚至 DOM 元素和系统信息&#xff0c;下面一一介绍。 c…

力扣-20. 有效的括号(回顾知识哈希表,栈)

给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有…

QT中dumpcpp以及dumpdoc使用

qt中调用COM的方式方法有四种&#xff0c;参考解释在 Qt 中使用 ActiveX 控件和 COM (runebook.dev) 介绍dumpcpp的使用方法Qt - dumpcpp 工具 (ActiveQt) (runebook.dev)&#xff1a; 在安装好了的qt电脑上&#xff0c;通过powershell窗口来实现&#xff0c;powershell比cmd要…

C语言从入门到熟悉------第五阶段

结构体 结构体很重要&#xff0c;一定要掌握。但是在很多C语言书籍中结构体的内容讲得非常少&#xff0c;因为从结构体开始&#xff0c;后面介绍的内容已经超出C语言基础的范畴&#xff0c;属于C高级编程部分了。仅仅具备前面的知识是远远不够的&#xff0c;因为在实际编程中&…

#QT(定时轮播电子相册)

1.IDE&#xff1a;QTCreator 2.实验&#xff1a; &#xff08;1&#xff09;使用QOBJECT的TIMER &#xff08;2&#xff09;EVENT时间 &#xff08;3&#xff09;多定时器定时溢出判断 &#xff08;4&#xff09;QLABEL填充图片 3.记录 4.代码 widget.h #ifndef WIDGET_H…

AI - 决策树模型

&#x1f914;决策树算法 决策树的思想来源可以追溯到古希腊时期&#xff0c;当时的哲学家们就已经开始使用类似于决策树的图形来表示逻辑推理过程。然而&#xff0c;决策树作为一种科学的决策分析工具&#xff0c;其发展主要发生在20世纪。 在20世纪50年代&#xff0c;美国兰…

【消息队列开发】 测试MessageFileManager(对硬盘中的消息操作)类

文章目录 &#x1f343;前言&#x1f384;测试流程&#x1f334;准备工作&#x1f332;测试创建队列功能&#x1f333;测试统计文件的读写&#x1f38b;测试将相应消息放入文件中&#x1f38d;测试读文件里的消息到内存&#x1f340;测试删除消息&#x1f60e;测试垃圾回收⭕总…

AtomoVideo:AIGC赋能下的电商视频动效生成

✍&#x1f3fb; 本文作者&#xff1a;凌潼、依竹、桅桔、逾溪 1. 概述 当今电商领域&#xff0c;内容营销的形式正日趋多样化&#xff0c;视频内容以其生动鲜明的视觉体验和迅捷高效的信息传播能力&#xff0c;为商家创造了新的机遇。消费者对视频内容的偏好驱动了视频创意供给…

Yolo系列算法-理论部分-YOLOv3

0. 写在前面 YOLO系列博客&#xff0c;紧接上一篇Yolo系列算法-理论部分-YOLOv2-CSDN博客 1. YOLOv3-定型之作 2018年&#xff0c;Redmon团队推出YOLOv3的网络模型&#xff0c;将骨干网络&#xff08;backbone&#xff09;由darknet-19替换成darknet-53网络&#xff0c;加入特…

【Python循环2/5】for循环的复杂应用

目录 序言 导入1 累加 练习 导入2 计数器 练习 导入3 if判断 总结 序言 昨天&#xff0c;我们学习了 for 循环遍历列表、字典等数据的方式。今天我们会学习&#xff0c;for 循环与“累加” 、if 判断和“计数器”的结合运用。 导入1 在前面的学习中&#xff0c;我们学…

计算机网络——物理层(数据交换方式)

计算机网络——数据交换方式 提高数据交换方式的必要性电路交换电路交换原理电路交换的阶段建立阶段通信阶段和连接拆除阶段 电路交换的优缺点报文交换什么是报文报文交换的阶段报文交换的优缺点 分组交换分组交换的阶段分组交换的优缺点 数据交换方式的选择数据报方式数据报方…

VS Code上,QT基于cmake,qmake的构建方法(非常详细)

VS Code上,QT基于cmake&#xff0c;qmake的构建方法 1 前言2 QT基于cmake的构建方法2.1 VS Code关键插件安装2.2 系统环境变量配置2.3 VS Code中&#xff0c;环境变量配置2.4 Cmake新建一个新的Porject 3 QT基于qmake的构建方法 1 前言 最近&#xff0c;由于认证了github的学生…

尺寸小又薄的整流桥IBS

1. 整流桥功能介绍 整流桥在电子领域中扮演着至关重要的角色&#xff0c;为各种电子设备和电路提供了稳定的电源。整流桥的主要作用是将交流电信号转换为直流电信号。当交流电信号通过整流桥时&#xff0c;它会使得只有一个方向的电流能够通过&#xff0c;从而实现了将交流电信…

【数据结构练习题】栈——1.括号匹配 2.逆波兰表达式求值 3.出栈入栈次序匹配 4.最小栈

♥♥♥♥♥个人主页♥♥♥♥♥ ♥♥♥♥♥数据结构练习题总结专栏♥♥♥♥♥ 文件目录 前言1.括号匹配1.1问题描述1.2解题思路1.3画图解释1.4代码实现2.逆波兰表达式求值 2.1问题描述2.2解题思路2.3画图解释2.4代码解释3.出栈入栈次序匹配 3.1问题描述3.2思路分析3.3画图解释3.…

金融知识分享系列之:MACD指标精讲

金融知识分享系列之&#xff1a;MACD指标精讲 一、MACD指标二、指标原理三、MACD指标参考用法四、MACD计算步骤五、MACD分析要素六、根据快线DIF位置判断趋势七、金叉死叉作为多空信号八、快线位置交叉信号九、指标背离判断行情反转十、差离值的正负十一、差离值的变化十二、指…