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_Adrbit_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)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hive借助java反射解决User-agent编码乱码问题

一、需求背景 在截取到浏览器user-agent&#xff0c;并想保存入数据库中&#xff0c;经查询发现展示的为编码后的结果。 现需要经过url解码过程&#xff0c;将解码后的结果保存进数据库&#xff0c;那么有几种实现方式。 二、问题解决 1、百度&#xff1a;url在线解码工具 …

Java 与 Go:可变数组

可变数组&#xff08;也称为动态数组&#xff09;是一种可以在运行时动态增加或减少其大小的数据结构。由于其动态分配大小&#xff0c;灵活性增删改查&#xff0c;动态地管理内存&#xff08;在需要时动态分配内存空间&#xff0c;以适应数据结构的大小变化&#xff0c;而不会…

经典排序算法之基数排序详解|c++代码实现|简单易懂

引言 排序算法c实现系列第10弹&#xff08;最后一弹&#xff09;——基数排序。该系列文章主要讲解了十大经典排序算法&#xff0c;如最基础的冒泡排序、选择排序到借助堆数据结构实现的堆排序&#xff0c;其余所有算法的文章在本文最后都有链接&#xff0c;感兴趣的uu可以移步…

Java多线程实战-异步操作日志记录解决方案(AOP+注解+多线程)

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️本系列源码仓库&#xff1a;多线程并发编程学习的多个代码片段(github) &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正…

PHP异世界云商系统开源源码

系统更新与修复列表 1. 基于彩虹的二次开发 - 对彩虹系统进行了二次开发&#xff0c;增强了系统的功能和性能。2. 新增自定义输入框提示内容&#xff08;支持批量修改&#xff09; - 用户可以自定义输入框的提示内容&#xff0c;并支持批量修改&#xff0c;提升用户体验。3. 新…

18-结构体(初识)

18-1 概念 我们现在已经知道的数据类型&#xff1a; char short int long float double 但是当我们需要描述一个复杂对象时&#xff0c;这些数据类型单独拿出来不能满足&#xff0c;如&#xff1a; 人&#xff1a;名字年龄性别地址电话 书&#xff1a;书名作者出版社定价书…

软件设计和体系结构

软件设计和体系结构 一、引言 软件 定义&#xff1a;一系列按照特定顺序组织的计算机数据、指令的集合 特点&#xff1a; 软件不是生产制造&#xff0c;是设计开发软件不会磨损和老化软件需要根据实际情况进行定制开发 软件设计的基本原则 抽象方法 过程抽象&#xff1a;是指…

Spring题库详解

3、Spring Beans 3.1、什么是Spring beans&#xff1f; Spring beans 是那些形成Spring应用的主干的java对象。它们被Spring IOC容器初始化&#xff0c;装配&#xff0c;和管理。这些beans通过容器中配置的元数据创建。比如&#xff0c;以XML文件中 的形式定义。 3.2、 一个…

【AIGC调研系列】通义灵码与copilot的对比

通义灵码与GitHub Copilot的对比主要集中在几个方面&#xff1a;代码编写能力、免费性、操作界面和适配性。 首先&#xff0c;在代码编写能力上&#xff0c;虽然GitHub Copilot在整体上要强于通义灵码&#xff0c;但通义灵码的能力也不算弱&#xff0c;并且在某些特定的小类任…

橡胶工厂5G智能制造数字孪生可视化平台,推进橡胶工业数字化转型

橡胶5G智能制造工厂数字孪生可视化平台&#xff0c;推进橡胶工业数字化转型。随着信息技术的迅猛发展和智能制造的不断推进&#xff0c;数字化转型已成为制造业转型升级的重要方向。橡胶工业作为传统制造业的重要领域&#xff0c;正面临着产业升级和转型的迫切需求。橡胶5G智能…

腾讯春招后端一面(八股篇)

前言 前几天在网上发了腾讯面试官问的一些问题&#xff0c;好多小伙伴关注&#xff0c;今天对这些问题写个具体答案&#xff0c;博主好久没看八股了&#xff0c;正好复习一下。 面试手撕了三道算法&#xff0c;这部分之后更&#xff0c;喜欢的小伙伴可以留意一下我的账号。 1…

测试人员业务提升的几个方面

&#x1f4cb; 个人简介 作者简介&#xff1a;大家好&#xff0c;我是凝小飞&#xff0c;软件测试领域作者支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 整个文章来源于我的xmind梳理和总结&#xff0c;接下来为各位一步步拆解。 一、测试流程遵守和推进 在…