STM32学习和实践笔记(8): 理解位带区和位带别名区

news2024/11/25 18:56:03

如前《STM32学习和实践笔记(4): 分析和理解GPIO_InitTypeDef GPIO_InitStructure (b)(含memory mapping图)-CSDN博客

》中所写,

STM32一共有4GB的地址,对所有的寄存器、存储器、外设等进行统一编址。

每一个地址对应一个字节,每一个字节含有8位。

而STM的寄存器,都是32位的,所以一个寄存器就要占用4个地址,因为4个地址,每一个8位,才能凑够32位啊。

比如下面这个寄存器:

控制PortC上的那些引脚的寄存器,他们的址址是从0x4001 1000一路排到0x4001 13FF,一共有1024个地址(也就是1K),其中,最开始的4个地址,就分配给了

在上面的那些32位的寄存器里,假定我操作时,我只想操作其中的1位,而不想操作其余位时,应该怎么办?

当然也可以在软件上做一系列的操作来实现。

但是STM32在硬件上做了一个处理就是将那些位带区里的每一个bit,都扩展成32位,而放到位带别名区。

它位分别位于:

其位与地址检测位的规则是:

举例来说明:

假定位带区(bit band region)的第一个地址,也就是基地址0x40000000保存的这个byte的8个bit,因为其每一个bit都要膨胀成32位,这样,它在位带别名区,就需要4个地址来保存,这四个地址的起始地址,根据上面这个公式来计算如下:

第0个bit位在位带别名区(bit band Alias)的起始地址是:
AliasAddr = 0x42000000+ (A-0x40000000)*8*4 +n*4

                =0x42000000+ (0x40000000-0x40000000)*8*4 +0*4

                =0x42000000

第1个bit位位带别名区(bit band Alias)的起始地址是:

AliasAddr = 0x42000000+ (A-0x40000000)*8*4 +n*4

                =0x42000000+ (0x40000000-0x40000000)*8*4 +1*4

                =0x42000000+1*4

                =0x42000004

依此类推,第7个bit位位带别名区(bit band Alias)的起始地址是:

AliasAddr = 0x42000000+ (A-0x40000000)*8*4 +n*4

                =0x42000000+ (0x40000000-0x40000000)*8*4 +7*4

                =0x42000000+7*4(28用16进制是0x1C)

                =0x4200001C

(注意这里计算是32位的起始地址,所以实际上第7个bit位占了从0x4200001C到0x42000020的4个地址)

所以,位带区的基地址0x40000000保存的这个byte的8个bit,在位带别名区,用了位带别名区的从

  0x42000000到0x42000020的32个地址。

类似地,假定位带区(bit band region)的地址是0x40000001,那么同样根据上述公式,也能得到正确的地址,计算的结果,就是在基地址基础上增加了32位的偏移而已。这很简单。

简言之,就是用位带别名区的32位来表示位带区的一位。

一位只有0和1两种情况。那么对应的这32位数据,也可以只用0来表示0,用1来表示1。

这样,当我在位带区里的某一个地址的里的byte里的一位操作时,我就根据某个32位的起始地址,来对这32位进行操作。这很简单。

硬件做了这样的设计,就很方便地能对位带区的那些32位寄存器的某一位操作,而不会影响其余位了。

位带操作的优点

1)控制GPIO口输入输出非常简单。

2)操作串行接口芯片非常方便(DS130274HC595等)。

3)代码简洁,阅读方便。

这就是要搞这个位带区和位带别名区的意义所在!

------------------------------------------------------------

可以把上面的两个公式合并成下面这一个公式:

当调用这个合并公式时,传进来的是这两个参数:A和n

A:位带区的地址(无论是从0x40000000开始的外设位带区,还是众0x200000000开始的SRAM的位带区),以及n:该地址里的byte里的第n个bit位.

很明显,假定A为0x40000001,经过((A & 0xF0000000)+0x02000000这样运算,得到的就是0x42000000

而如果A为0x20000001,经过((A & 0xF0000000)+0x02000000这样运算,得到的就是0x22000000,

所以这部分实现了与前面的那个没合并公式时同样的效果。

而((A &0x000FFFFF),实现的效果,与(A-0x40000000)实际的效果完全相同,就是算出与基地址的差值。

左移5位相当于*32,左移2位相于*4。

所以,合并公式完全实现了前面两个公式的结果。

通过写出上面这个笔记博文,我算是完全理解了~非常清楚~真好~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PostgreSQL入门到实战-第二十二弹

PostgreSQL入门到实战 PostgreSQL中表连接操作(六)官网地址PostgreSQL概述PostgreSQL中self-join命令理论PostgreSQL中self-join命令实战更新计划 PostgreSQL中表连接操作(六) 使用PostgreSQL自联接技术来比较同一表中的行 官网地址 声明: 由于操作系统, 版本更新等原因, 文…

19、矩阵-螺旋矩阵

思路: 这道题主要是对空间上有所思考,每次转一圈上右下左各减少一层。不妨设top,right,down,left,每次旋转一圈 top,right--,down--,left 代码如下: class Solution …

【Linux】网络基础(一)

文章目录 一、计算机网络背景1. 网络发展2. 认识“协议” 二、网络协议初识1. 协议分层2. OSI七层模型3. TCP/IP五层(或四层)模型 三、网络传输基本流程1. 同局域网的两台主机通信数据包封装和分用封装分用 2. 跨网络的两台主机通信 四、网络中的地址管理…

应该如何进行POC测试?—【DBA从入门到实践】第三期

在数据库选型过程中,为确保能够灵活应对数据规模的不断扩大和处理需求的日益复杂化,企业和技术人员会借助POC测试来评估不同数据库系统的性能。在测试过程中,性能、并发处理能力、存储成本以及高可用性等核心要素通常会成为大家关注的焦点&am…

KNN分类算法的MATLAB实现以及可视化

一、KNN简介 KNN算法,即K-Nearest Neighbors,是一种常用的监督学习算法,可以用于分类问题,并且在实际应用中取得了广泛的成功。 二、KNN算法的基本原理 对于给定的测试样本,KNN算法首先计算它与训练集中所有样本的距…

电子元器件线上交易商城搭建的价值和必要性-加速度jsudo

随着科技的飞速发展,电子元器件行业正迎来前所未有的变革。为了满足市场对于电子元器件采购的便捷性、高效性和多样性的需求,电子元器件商城的开发显得尤为重要。本文将探讨电子元器件商城开发的重要性、主要功能以及它如何助力行业发展。 电子元器件商城…

Open CASCADE学习|BrepOffsetAPI_ThruSections无法放样成Solid

目录 1、边界线(TopoDS_Wire)不在一个平面上时,无法生成Solid 2、边界线(TopoDS_Wire)在一个平面上时,可以生成Solid 3、边界线(TopoDS_Wire)不在一个平面上时,添加To…

每日OJ题_01背包①_牛客DP41 【模板】01背包(滚动数组优化)

目录 牛客DP41 【模板】01背包 问题一解析 问题二解析 解析代码 滚动数组优化代码 牛客DP41 【模板】01背包 【模板】01背包_牛客题霸_牛客网 #include <iostream> using namespace std;int main() {int a, b;while (cin >> a >> b) { // 注意 while 处…

力扣刷题 二叉树层序遍历相关题目II

NO.116 填充每个节点的下一个右侧节点指针 给定一个 完美二叉树 &#xff0c;其所有叶子节点都在同一层&#xff0c;每个父节点都有两个子节点。二叉树定义如下&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针&#xff0c;…

《疯狂java讲义》Java AWT图形化编程中文显示

《疯狂java讲义》第六版第十一章AWT中文没有办法显示问题解决 VM Options设置为-Dfile.encodinggbk 需要增加变量 或者这边直接设置gbk 此外如果用swing 就不会产生这个问题了。

视频中会动的进度条

视频中会动的进度条 1.成果展示&#xff1a;2.步骤&#xff1a; 1.成果展示&#xff1a; 2.步骤&#xff1a;

In Memoriam Fabrizio Flacco

一、背景 最近在看人机协作相关的论文&#xff0c;其中有一篇是Arash Ajoudani于2018发表在Autonomous Robots题为Progress and prospects of the human–robot collaboration的综述。当看到最后Acknowledgements部分&#xff0c;有一句话是The authors would like to thank a…

【React】React18+Typescript+craco配置最小化批量引入Svg并应用的组件

React18Typescriptcraco配置最小化批量引入Svg并应用的组件 前言创建React Typescript项目通过require.context实现批量引入Svg安装[types/webpack-env](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/README.zh-Hans.md)解决类型报错安装[craco](https://…

如何免费搭建幻兽帕鲁服务器?

雨云是一家国内的云计算服务提供商&#xff0c;为了吸引用户推出了积分兑换云产品活动&#xff0c;只需要完成简单积分任务即可获得积分&#xff0c;积分可以兑换免费游戏云、对象存储或者虚拟主机。本文将给大家分享雨云免费游戏云领取及幻兽帕鲁开服教程。 第一步&#xff1a…

每日一题---OJ题: 合并两个有序链表

嗨!小伙伴们,好久不见啦! 今天我们来看看一道很有意思的一道题---合并两个有序链表 嗯,题目看上去好像不难,我们一起画图分析分析吧! 上图中,list1有3个结点,分别为1,2,3 ; list2中有3个结点,分别为1,3,4, 题目要求我们要将这两个链表合并到一起,并且是升序,最后将链表返回。 …

【JAVA基础篇教学】第六篇:Java异常处理

博主打算从0-1讲解下java基础教学&#xff0c;今天教学第五篇&#xff1a; Java异常处理。 异常处理是Java编程中重要的一部分&#xff0c;它允许开发人员在程序运行时检测和处理各种错误情况&#xff0c;以保证程序的稳定性和可靠性。在Java中&#xff0c;异常被表示为对象&am…

大型网站系统架构演化

大型网站质量属性优先级&#xff1a;高性能 高可用 可维护 应变 安全 一、单体架构 应用程序&#xff0c;数据库&#xff0c;文件等所有资源都在一台服务器上。 二、垂直架构 应用和数据分离&#xff0c;使用三台服务器&#xff1a;应用服务器、文件服务器、数据服务器 应用服…

TCM SRAM等五块内存的使用和动态分配

TCM SRAM等五块内存的使用和动态分配 配置sct文件内存使用动态内存分配rtx_lib.hrtx_memory.cmain.c 配置sct文件 LR_IROM1 0x08000000 0x00200000 { ; load region size_regionER_IROM1 0x08000000 0x00200000 { ; load address execution address*.o (RESET, First)*(InRoo…

1113. 红与黑--Flood Fill 算法

目录 1113. 红与黑--Flood Fill 算法---宽搜&#xff08;BFS&#xff09;或DFS&#xff09; 输入格式 输出格式 数据范围 输入样例&#xff1a; 输出样例&#xff1a; 思路&#xff1a; 1.BFS 思路&#xff1a; 2.DFS 思路 方法一&#xff1a;&#xff08;BFS&#x…

玉伯也创业了,曾经的互联网高P也慢慢的落幕了

玉伯是真创业还是被动创业&#xff1f;毕竟&#xff0c;在阿里的时候&#xff0c;他可是Ant Design和语雀的大佬&#xff0c;风光无限&#xff0c;谁都知道他的大名。但后来&#xff0c;他去了字节&#xff0c;待了不到一年就跑了&#xff0c;现在选择出来创业。是不是曾经的那…