历史上的今天
返回首页

历史上的今天

今天是:2024年09月30日(星期一)

正在发生

2021年09月30日 | STM32位带操作-详解-计算过程

2021-09-30 来源:eefocus

位带操作

位带操作的概念其实很多年前就有了,那还是 8051 单片机开创的先河。如今,CM3 将此能力进化,这里的位带操作是 8051 位寻址区的威力大幅加强版。


官方解释

先来看一下Cortex-M3权威指南中描述的位带操作:

支持了位带操作后,可以使用普通的加载/存储指令来对单一的比特进行读写操作。在CM3中,有两个区中实现了位带。其中一个是 SRAM 区的最低1MB 范围,第二个则是片内外设区的最低 1MB 范围。这两个区中的地址除了可以像普通的 RAM 一样使用外,它们还都有自己的“位带别名区”,位带别名区把每个比特膨胀成一个 32 位的字。当你通过位带别名区访问这些字时,就可以达到访问原始比特的目的。

在这里插入图片描述

正点原子库函数指导书解释

位带操作简单的说,就是把每个比特膨胀为一个 32 位的字,当访问这些字的时候就达到了访问比特的目的,比如说 BSRR 寄存器有 32 个位,那么可以映射到 32 个地址上,我们去访问这 32 个地址就达到访问 32 个比特的目的。这样我们往某个地址写 1 就达到往对应比特位写 1 的目的,同样往某个地址写 0 就达到往对应的比特位写 0 的目的。

在这里插入图片描述

对比下来还是下面写的更容易理解一些,现在我们知道了位带操作是将一位是数据膨胀为32位的字,那么他是怎么实现的呐?


位带操作地址转换计算

大家先看一下这个图注意一下,下面为位带区(就是原来的位置,占一位),而上面位带别名区(新地址,站32位)。(这里真的不知道咋解释了,试着理解一下吧)



CM3中支持位带操作的地址

首先我们要了解在STM32中有两个区域可以进行位带操作,支持位带操作的两个内存区的范围是:

0x2000 0000-0x200F FFFF (SRAM区中的最低1MB)

0x4000 0000-0x400F FFFF (片上外设区中的最低1MB)

对应别名区的范围为:

0x2200 0000-0x23FF FFFF

0x4200 0000-0x43FF FFFF


从这连个范围就可以看出点问题,支持位带操作的区域大小,差不多比位带别名区小32倍。

这也就表明了确实是位带区的一位,在别名区是32位。那么是怎么转换的那。

官方给了计算公式:

是不是感觉不太好理解,那我们就一起来算一下,到地是不是这么回事。

首先一个官方给的图来做对比,看看结果对不对。

我们就计算两个位置,分别为0x20000000的第0位和0x20000000的第1位.

因为这两个位置都是SRAM位带区的数据所以我们要用对应的公式:


AliasAddr = 0x22000000+((A-0x20000000)*8+n)*4= 0x22000000+(A-0x20000000)32+n4


首先我们需要注意的一点是,A是SRAM位带区的某个比特的字节地址,注意是字节地址,我们都知道STM32中每个寄存器是32位的,所以每个寄存器站用4个字节,而0x20000000是总线地址,也就是基地址,寄存器地址是在这个基地址的基础上偏移的。如下图:

OK,了解这些就可以进行计算了。


要计算数据:0x20000000的第0位


A = 0x20000000

n = 0

公式:

AliasAddr = 0x22000000+((A-0x20000000)*8+n)*4= 0x22000000+(A-0x20000000)*32+n*4

第一步:带入数据

AliasAddr =  0x22000000+(0x20000000-0x20000000)*32+0*4

这里将一下计算规则:

加/减运算,只需要对应的位进行减就可以了

乘除运算:需要化为十进制进行计算。

结果:

AliasAddr = 0x22000000


对应上面的图片:

位带区 —> 等效的别名地址

0x20000000.0 --> 0x22000000.0

说明我们计算正确了,有人可能认为我们取得值太简单,那我们就在换一个再进行一次计算。


要计算数据:0x20000004的第2位

代入数据

AliasAddr =  0x22000000+(0x20000004-0x20000000)*32+2*4

这里计算就要借助计算器了,大家可以自行计算一下,注意在乘的时候一定要转化为十进制。计算结束后在转化为16进制

经过计算结果:

AliasAddr = 0x22000088


对照上表说明我们计算的只是正确的。这样我们就了解是如何进行转化的了,但是这就有新的问题了,32位的位带地址是如何给的位带区传递值的呐。


官方文档给出了解释:

在位带区中,每个比特都映射到别名地址区的一个字,这是只有一个 LSB有效的字。当一个别名地址被访问时,会先把该地址变换成位带地址。对于读操作,读取位带地址中的一个字,再把需要的位右移到LSB,并把LSB返回。对于写操作,把需要写的位左移至对应的位序号处,然后执行一个原子的“读一改一写”过程。

注释:LSB–最低有效位


这样位带操作就显得很简单了嘛,最后再看一下位带操作的实现


#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 

#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) 

#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) 

//IO¿ÚµØÖ·Ó³Éä

#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C 

#define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C 

#define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C 

#define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C 

#define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C 

#define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C    

#define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C    


#define GPIOA_IDR_Addr    (GPIOA_BASE+8) //0x40010808 

#define GPIOB_IDR_Addr    (GPIOB_BASE+8) //0x40010C08 

#define GPIOC_IDR_Addr    (GPIOC_BASE+8) //0x40011008 

#define GPIOD_IDR_Addr    (GPIOD_BASE+8) //0x40011408 

#define GPIOE_IDR_Addr    (GPIOE_BASE+8) //0x40011808 

#define GPIOF_IDR_Addr    (GPIOF_BASE+8) //0x40011A08 

#define GPIOG_IDR_Addr    (GPIOG_BASE+8) //0x40011E08 

 

//IO¿Ú²Ù×÷,Ö»¶Ôµ¥Ò»µÄIO¿Ú!

//È·±£nµÄֵСÓÚ16!

#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //Êä³ö 

#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //ÊäÈë 


#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //Êä³ö 

#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //ÊäÈë 


#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //Êä³ö 

#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //ÊäÈë 


#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //Êä³ö 

#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //ÊäÈë 


#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //Êä³ö 

#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //ÊäÈë


#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //Êä³ö 

#define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //ÊäÈë


#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //Êä³ö 

#define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //ÊäÈë


这里开头三行是实现地址转化的,原理就是将位带区的某一位转化位位带别名区的一个32位的字节。大家可以分析一下,看看能不能算出来。


位带操作的优点

位带操作有什么优越性呢?最容易想到的就是通过GPIO的管脚来单独控制每盏LED的点亮与熄灭。另一方面,也对操作串行接口器件提供了很大的方便(典型如74HC165,CD4094)。总之位带操作对于硬件I/0密集型的底层程序最有用处了。


读取比特时传统方法与位带方法的比较

这就很直观的看出位带操作的相对而言更简便一些。


结语

位带操作在实际开发中可能只是用来 IO 口的输入输出还比较方便,其他操作在日常开发中也基本很少用。

推荐阅读

史海拾趣

Crydom公司的发展小趣事

由于Crydom公司的发展涉及多个方面,且具体故事可能涉及公司内部信息或未公开资料,我无法直接提供5个精确到字数的电子行业里Crydom公司发展起来的相关故事。但我可以尝试根据已知信息,概括性地描述Crydom公司在电子行业中的一些重要发展事实。

  1. 固态继电器的发明与领导地位的确立

Crydom公司作为固态继电器的发明者,从一开始就奠定了在电子行业中的技术领先地位。固态继电器作为一种新型的电子开关,具有响应速度快、寿命长、可靠性高等优点,迅速在市场中获得了认可。Crydom凭借其在固态继电器技术领域的深厚积累,不断推出创新产品,满足了市场对高效、稳定电子开关的需求,逐渐确立了在行业中的领导地位。

  1. 质量保障体系的建立与完善

为了确保产品质量和客户满意度,Crydom建立了严格的质量保障体系。公司始终坚持“产品封装前后两次”“100%全检”的过程,对产品的每一个细节都进行严格把控。这种对质量的极致追求,使得Crydom的固态继电器在市场上获得了良好的声誉,赢得了众多客户的信赖。

  1. 定制化解决方案的提供

随着电子行业的不断发展,客户对产品的需求也日益多样化。Crydom公司敏锐地捕捉到这一市场变化,除了提供成千上万的即用型产品外,还能根据客户的具体应用需求,定制专属的固态继电器解决方案。这种灵活的服务模式,使得Crydom能够更好地满足客户的需求,进一步巩固了其在市场中的地位。

  1. 多元化市场的拓展

Crydom的固态继电器不仅在传统的工业领域得到了广泛应用,还逐渐拓展到了医疗、交通、军事以及航天等多元化市场。这些市场的开拓,不仅为Crydom带来了更多的商机,也进一步提升了其在电子行业中的影响力。

  1. 国际认证与合作的加强

Crydom公司一直致力于提升产品的国际竞争力。多年来,公司获得了多项国际认证,如ISO、UL、CE等,这些认证不仅证明了公司产品的高品质,也为其在国际市场上的拓展提供了有力支持。同时,Crydom还积极与全球知名的航空公司、电子企业等建立合作关系,通过技术交流和合作研发,不断提升自身的技术水平和市场竞争力。

这些发展事实只是Crydom公司在电子行业中发展的一部分缩影。如需更详细的故事或更深入的了解,建议查阅相关的行业报告、公司年报或专访文章。

Hifn Inc公司的发展小趣事

机顶盒,全称为数字视频变换盒,是现代家庭娱乐中不可或缺的重要设备。从广义上讲,任何与电视机连接的网络终端设备均可视为机顶盒,它们不仅限于接收和转换电视信号,还具备丰富的网络交互功能。

机顶盒的核心功能在于接收并解码来自有线电缆、卫星天线、宽带网络及地面广播的数字电视信号,将其转换成适合在电视机上播放的格式。这一过程包括接收、解码和显示三个主要步骤,确保了用户能够享受到高清乃至4K的超高清画质和震撼音效。此外,机顶盒还提供了诸如电子节目指南、因特网网页浏览等增值服务,极大地丰富了用户的观看体验。

随着技术的不断进步,机顶盒正朝着智能化、多功能化方向发展。例如,智能推荐算法能够根据用户的观看历史和偏好,提供个性化的节目推荐;语音识别技术则让用户能够通过语音指令控制机顶盒,实现更加便捷的操作体验。同时,机顶盒还支持家庭影院功能,让用户在家中就能享受到电影院般的视听效果。

总的来说,机顶盒作为连接电视与外部信号源的桥梁,不仅提升了电视节目的观看体验,还通过丰富的网络交互功能为用户提供了更加广泛的内容和娱乐选择。随着技术的不断发展和用户需求的日益多样化,机顶盒将继续在家庭娱乐领域发挥重要作用。

Heraeus公司的发展小趣事

Heraeus公司作为一家历史悠久的德国化学与科技公司,在电子行业的发展过程中积累了众多令人瞩目的故事。以下是五个与Heraeus公司在电子行业中发展起来的相关故事,每个故事均基于事实描述:

1. 从黄金冶炼到电子科技的转型

Heraeus始建于1851年,最初专注于黄金冶炼,这一历史深厚的背景为其在科技领域的拓展奠定了坚实的基础。随着电子工业的兴起,Heraeus敏锐地捕捉到了市场变化,逐步将业务扩展至电子科技领域。这一转型不仅展示了Heraeus的战略眼光,也体现了其在材料科学和技术创新方面的深厚底蕴。通过不断研发新技术、新产品,Heraeus在电子元件、特殊包装和传感器等领域取得了显著成就,成为电子行业的重要供应商之一。

2. 精密精细加工材料的突破

在电子科技领域,Heraeus以其精密精细加工材料而闻名。这些材料在制造高性能电子元件中发挥着关键作用。例如,Heraeus的薄膜材料在半导体封装、电路板制造等方面得到了广泛应用。为了不断满足市场需求,Heraeus投入大量资源进行技术研发和产品创新,成功推出了一系列具有自主知识产权的高性能材料。这些材料不仅提高了电子产品的性能和质量,也推动了整个电子行业的发展。

3. 全球化布局与本地化服务

作为一家全球领先的科技公司,Heraeus在全球范围内拥有广泛的分支机构和服务网络。为了更好地服务本地客户,Heraeus在不同国家和地区设立了研发中心和生产基地,以提供更加贴近市场需求的产品和服务。在中国市场,Heraeus自1974年在香港设立机构以来,不断加大投资力度,扩大业务规模。目前,Heraeus在大中华区拥有多个生产和办公场所,为众多中国客户提供了优质的产品和服务。这种全球化布局与本地化服务的策略使得Heraeus能够在全球范围内保持竞争优势。

4. 技术创新与可持续发展

Heraeus始终将技术创新作为企业发展的核心驱动力。在电子科技领域,Heraeus不断推出新技术、新产品以满足市场需求。同时,Heraeus也注重可持续发展和社会责任。公司通过优化生产流程、提高资源利用效率等措施减少对环境的影响;积极参与慈善活动和社会公益事业;倡导环保理念并推动行业绿色发展。这些举措不仅提升了Heraeus的企业形象和社会声誉,也为其在电子行业的长期发展奠定了坚实的基础。

5. 应对行业挑战与机遇

近年来,电子行业面临着诸多挑战和机遇。一方面,全球市场竞争日益激烈,技术更新换代速度加快;另一方面,新兴技术的发展为电子行业带来了新的增长点。面对这些挑战和机遇,Heraeus凭借其深厚的技术积累和市场洞察力,不断调整战略方向、优化产品结构、提升服务质量以应对市场变化。同时,Heraeus也积极寻求与产业链上下游企业的合作机会以实现共赢发展。这些努力使得Heraeus在电子行业中始终保持着领先地位并不断向前发展。

Geo Semiconductor Inc公司的发展小趣事
通过提高控制精度和响应速度,使立式磨床能够更准确地完成加工任务,提高加工精度和产品质量。
国盛科技(BOCHEN)公司的发展小趣事

随着市场竞争的加剧,国盛科技意识到传统生产方式已难以满足市场需求。于是,公司开始积极探索自动化生产之路。经过不懈努力,国盛科技成功自主研发了电位器自动包装设备、自动测试设备等多种自动化设备,实现了产品流水化生产。这一突破不仅大大提高了生产效率,还使得电位器年产量突破一亿只,为国盛科技赢得了市场的广泛认可。

CANOPUS公司的发展小趣事

CANOPUS的产品逐渐赢得了全球音乐爱好者的喜爱。为了更好地满足市场需求,公司开始积极拓展海外市场。通过与当地经销商合作、参加国际展览等方式,CANOPUS的产品逐渐打入国际市场,并在全球范围内建立了良好的声誉。

问答坊 | AI 解惑

请教WINCE的NBOOT下载问题

我用的是ATLAS 芯片AT640,想请教下NBOOT下载问题,谢谢~~…

查看全部问答>

请教串口通信问题

毕业实习要求,向串口发一个脉冲,中间连放大器,将电流放大,然后将电子锁打开,现在向各位大虾求教向串口发脉冲的C语言程序,以及发完脉冲后是如何联线到锁上的,很急,谢谢了!…

查看全部问答>

My Computer 下的my documents 文件夹

My Computer 下的my documents 文件夹可以修改这文件夹所在的路径吗?可以隐藏这个文件夹吗?希望知道的指教。谢谢…

查看全部问答>

关于BSP包的一些问题

前两天问了一下有关在BSP中添加流驱动的问题,经过几天的摸索,终于认识到以前的想法是错的,在这里说一下。 之前以为在BSP中添加流驱动程序,在注册表、dirs、smdk6410.pbcxml等文件修改好以后然后单独编译生成DLL文件才能够在定制系统时添加,现 ...…

查看全部问答>

C51指针问题请教

我在学习指针过程碰到一个问题,请教大家:    下面程序,单片机上电运行,第一次调用readRom()函数正常,第二次调用读取的数就不对了,也就是说while(1) 里第二个循环就不对了,第一个循环是正确的,第三次以后每次读出数字跟第二次 ...…

查看全部问答>

我的超声波程序总是出错,不知道哪儿有问题,请高手帮忙解决!!!非常感谢

#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int sbit echo=P3^2;//接收端sbit clk=P2^0;//脉冲输入sbit lcdrs=P1^0;//液晶命令数据选择端sbit lcdrw=P1^1;//读写选择端sbit lcden=P1^2;// ...…

查看全部问答>

请教SD卡的读取时间

读数据指令发出后一般多长时间收到ox00回应?收到回应以后又一般多长时间收到开始数据标志?TAAC和NSAC具体怎么理解?…

查看全部问答>

无线局域网技术:几种无线通信标准比较

最近找了一些无线的资料 无线局域网技术:几种无线通信标准比较 无论是家庭还是商业用户,在寻求无线局域网(WLAN)解决方案上都有许多选择。很多产品都支持802.11a、802.11b、802.11g和802.11n等Wi-Fi技术标准。另外,还有蓝牙和其他各种 ...…

查看全部问答>

关于30FSPI通讯的问题,困扰我好长时间了,请大侠帮忙

关于30FSPI通讯的问题,困扰我好长时间了,请大侠帮忙 本人刚开始用PIC,要通过30F6011往30F2020里面送数据,现在先通过6011往2020里面送一个数据,再把这个数据送给2020的占空比寄存器,改变2020PWM2的占空比。但总是传输的数据不稳定,传送同样的 ...…

查看全部问答>

提问+51单片机通过74HC138驱动数码管

以前只是用管脚直接驱动数码管,现在的新开搬上多了个74HC138译码器,搞得我心神不宁无处下手,有没有大神以前用过,能不能够讲下区别是啥…

查看全部问答>