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

如前《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。

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

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

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

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

相关文章

EaticSearch学习

ES学习目标 1、全文检索 2、ES介绍 2.1 安装(docker) docker pull elasticsearch:7.14.0 docker run -d -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" elasticsearch:7.14.0初步检索 1、_cat GET /_cat/nodes:查看所…

MySQL选择普通索引还是唯一索引(2/16)

普通索引和唯一索引 基本概述 MySQL中可以创建普通索引与唯一索引,这两种索引的区别是: 普通索引(Non-Unique Index),也称为非唯一索引,它允许索引中的条目具有重复的键值。普通索引的主要目的是加快查询…

HarmonyOS开发学习:【DevEco Device Tool 安装配置(问题全解)】

本文介绍如何在Windows主机上安装DevEco Device Tool工具。 坑点总结: 国内部分网络环境下,安装npm包可能会很慢或者超时,推荐使用国内npm源(如淘宝源、华为源等);serialport这个npm包安装的过程中需要编…

暴力枚举法

虽然暴力枚举法有时候效率低&#xff0c;时间复杂度高&#xff0c;但是在面对小规模数据集的时候&#xff0c;暴力枚举法往往是很好的思维利器。 B: 01 串的熵&#xff08;5分&#xff09; 问题描述 #include <iostream> #include <cmath> #include <algorithm…

第二十六周代码(总结 + 查缺补漏)

蓝桥云课&#xff1a;刷题数量通过139题&#xff0c;尝试解决&#xff08;未做出&#xff09;18题。 其中蓝桥杯往年真题74题&#xff0c;尝试解决&#xff08;未做出&#xff09;6题算法模板题5题经典算法题20题&#xff0c;尝试解决&#xff08;未做出&#xff09;1题算法赛…

从零自制docker-9-【管道实现run进程和init进程传参】

文章目录 命令行中输入参数长度过长匿名管道从父进程到子进程传参[]*os.File{}os.NewFile和io.ReadAllexe.LookPathsyscall.Execstrings.Split(msgStr, " ")/bin/ls: cannot access : No such file or directory代码 命令行中输入参数长度过长 用户输入参数过长或包…

红黑瓷砖(BFS和DFS)

9 6 ....#. .....# ...... ...... ...... ...... ...... #...# .#..#.45BFS import java.util.Deque; import java.util.LinkedList; import java.util.Scanner;public class Main {//. 黑色//# 红色// 黑色开始static final int N 11;static int n,m,ans 1; static char[][…

传统文字检测方法+代码实现

文章目录 前言传统文字检测方法1、基于最大稳定极值区域&#xff08;MSER&#xff09;的文字检测1.1 MSER&#xff08;MSER-Maximally Stable Extremal Regions&#xff09;基本原理代码实现——使用Opencv中的cv2.MSER_create()接口 2、基于笔画宽度变换&#xff08;Stroke Wi…

【示例】MySQL-SQL语句优化

前言 本文主要讲述不同SQL语句的优化策略。 SQL | DML语句 insert语句 插入数据的时候&#xff0c;改为批量插入 插入数据的时候&#xff0c;按照主键顺序插入 大批量插入数据的时候&#xff08;百万&#xff09;&#xff0c;用load指令&#xff0c;从本地文件载入&#x…

基于深度学习的人脸表情识别系统(PyQT+代码+训练数据集)

基于深度学习的人脸表情识别系统&#xff08;PyQT代码训练数据集&#xff09; 前言一、数据集1.1 数据集介绍1.2 数据预处理 二、模型搭建三、训练与测试3.1 模型训练3.2 模型测试 四、PyQt界面实现 前言 本项目是基于mini_Xception深度学习网络模型的人脸表情识别系统&#x…

关于nvm node.js的按照

说明&#xff1a;部分但不全面的记录 因为过程中没有截图&#xff0c;仅用于自己的学习与总结 过程中借鉴的优秀博客 可以参考 1,npm install 或者npm init vuelatest报错 2&#xff0c;了解后 发现是nvm使用的版本较低&#xff0c;于是涉及nvm卸载 重新下载最新版本的nvm 2…

4月12日重新安排行程

332.重新安排行程 332. 重新安排行程 - 力扣&#xff08;LeetCode&#xff09; 给你一份航线列表 tickets &#xff0c;其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机…

Linux网络 基础概念

目录 背景知识 互联网的发展 局域网和广域网 网络拓扑 网络协议栈 协议的概念 网络协议的分层 网络与操作系统的联系 网络传输的基本流程 IP地址和MAC地址 以太网通信 数据包的封装和分用 跨网段传输 背景知识 互联网的发展 计算机网络是计算机技术和通信技术相…

循环新蓝海,“新”从“旧”中来

浙江安吉&#xff0c;是“两山”理念——“绿水青山就是金山银山”的发源地&#xff0c;也是众多循环经济和绿色产业的根据地。这里汇集了大批已上市和待上市的相关公司的总部&#xff0c;年初刚递表港交所的闪回科技&#xff0c;就是其中之一。 主营二手手机回收和销售的闪回…

卫星图像10个开源数据集资源汇总

文章目录 1、UC Merced Land-Use 2、Indian Pines 3、KSC 4、Washington DC 5、BigEarthNet 6、水体卫星图像的图像 7、城市航拍图像分割数据集 8、游泳池和汽车卫星图像检测 9、人工月球景观数据集 10、马萨诸塞州道路数据集 1、UC Merced Land-Use 数据集下载地址&am…

一文看懂交易主机托管!(此篇足矣)

什么是主机托管&#xff1f; 主机托管的类型&#xff1f; 如何开通主机托管&#xff1f; 主机托管的费用? 日常大家关心最多的就是这几个问题&#xff01;小编今天我们全面一次型解答&#xff01;帮助我们跟多了解&#xff01;建议收藏&#xff0c;避免下次找不到了哦&#x…

VulnHub靶机-easy_cloudantivirus 打靶

easy_cloudantivirus 靶机 目录 easy_cloudantivirus 靶机一、导入虚拟机配置二、攻击方式主机发现端口扫描web渗透-SQL注入命令注入反弹shellssh爆破提权 一、导入虚拟机配置 靶机地址&#xff1a; https://www.vulnhub.com/entry/boredhackerblog-cloud-av,453/下载完成&am…

DOTS Instancing合批:如何针对单个渲染实体修改材质参数

最近在做DOTS的教程,由于DOTS(版本1.0.16)目前不支持角色的骨骼动画&#xff0c;我们是将角色的所有动画数据Baker到一个纹理里面&#xff0c;通过修改材质中的参数AnimBegin,AnimEnd来决定动画播放的起点和终点&#xff0c;材质参数AnimTime记录当前过去的动画时间。但是在做大…

【Super数据结构】二叉搜索树与二叉树的非递归遍历(含前/中/后序)

&#x1f3e0;关于此专栏&#xff1a;Super数据结构专栏将使用C/C语言介绍顺序表、链表、栈、队列等数据结构&#xff0c;每篇博文会使用尽可能多的代码片段图片的方式。 &#x1f6aa;归属专栏&#xff1a;Super数据结构 &#x1f3af;每日努力一点点&#xff0c;技术累计看得…

洛谷P1209 [USACO1.3] 修理牛棚 Barn Repair

#先看题目 题目描述 在一个月黑风高的暴风雨夜&#xff0c;Farmer John 的牛棚的屋顶、门被吹飞了 好在许多牛正在度假&#xff0c;所以牛棚没有住满。 牛棚一个紧挨着另一个被排成一行&#xff0c;牛就住在里面过夜。有些牛棚里有牛&#xff0c;有些没有。 所有的牛棚有相同…