历史上的今天
返回首页

历史上的今天

今天是:2024年12月14日(星期六)

2018年12月14日 | KST-STM32学习之位带操作

2018-12-14 来源:eefocus

1、位带认识


其实学习51的时候已经初步领略过,只是当时没有提出这么专业的名次,譬如:TR0 = 1不就是嘛! 


51中可以进行位带操作的内存地址为20H 到 2FH 这 16 个字节共 128 位的内存!而其余内存只能字节操作!


这么方便的东西,对于STM32当然也是有的啦!


2、STM32的位带操作


有两部分可以进行位带操作, SRAM 区的最低 1MB 范围和片内外设区的最低 1MB 范围,而常用的位带操作为后者,即片外外设区的1MB,也就是外设寄存器所在的地址空间。


3、位带与位带别名区认识


编程操作时,不方便对外设寄存器的某一位直接访问,因此在片内外设区另外开辟了一个 32MB 大小的寻址空间,取名为位带别名区。在这个地址空间中,每 4个字节对应了位带区的一个位。


有了这层关系,对位带别名区的某 4 个字节的操作,就等价于对这个地址对应的位带区的某一位的操作。


4、位带与位带别名区对应关系


这里再次复习一下,地址换算到空间大小的方法, 


先记住,2的10次方是1K,2的20次方是1M,2的30次方是1G, 


然后具体就是数0的个数了,或者数1的个数也行!


Cortex-M3的地址空间是4GB,片内外设的地址从0x40000000到0x5FFFFFFF共512MB。(两者相减后为1FFFFFFF,共29个1,换算到空间大小就是2的29次方字节,就是512MB。)


512MB其中从 0x40000000 到 0x40100000 的地址空间是片内外设的 1MB 的位带区。(1MB的计算同上,共20个0,即2的20次方字节,就是1MB)。


从 0x42000000 到 0x43FFFFFF 是对应的 32MB 的位带别名区。


注意理清楚,位带区与位带别名区的关系!


直观理解图 


这里写图片描述


更形象理解图 


这里写图片描述


5、位带与位带别名区的映射公式


编程实现的时候首先确定要操作的寄存器的地址,也就是他的位带地址,然后确定要操作的是哪一位,最终根据映射关系计算出要操作的这一位所映射的位带别名区的地址。


所以有了下面的映射公示。


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


1、 addr 表示的是外设寄存器的地址,bitnum 表示的是要操作的这一位在这个寄存器的第几位。


2、(addr & 0xF0000000)+0x2000000 区分的是片内外设区还是 SRAM 区的位带,片上外设区的位带地址是从 0x40000000 到 0x40100000,SRAM 区的位带地址是从0x20000000 到0x20100000,大多数情况下只操作外设。


3、(addr &0x00FFFFFF)<<5)表示这一位所在的寄存器的第 0 位对应的位带别名区地址。由于位带区的一个寄存器是 32 位,因此映射到位带别名区就是 32 个字节,左移 5 相当于乘以 32。


4、bitnum<<2 是确定这一位相对于寄存器第 0 位对应的位带别名区地址的偏移地址。由于相对于寄存器的第 0 位,每偏移 1 个位,位带别名区就偏移 4 个字节,因此需要左移 2 位,相当于乘以 4。


emmmm,,,,,好吧,我承认第一看到这里的时候,确实蒙圈了。。。。


这个完全的理解,还需要结合上下文,我们就根据下面的图来看就行了! 


这里写图片描述

应该差不多可以理解大概的意思了,熟练的话可能需要假以时日而已。


差不多就来看应用了。。。


之前对于IO的操作,是使用位设置函数GPIO_SetBits(××, ××),以及位清除函数GPIO_ResetBits(××, ××),而现在引入位带操作后就可以像51那样直接操作了!!!


譬如,PA1,其引脚模式已经设置为输出。 


那么首先需要进行宏定义,即#define PA1 PAOut(1),然后就可以直接写PA1 = 1;代替GPIO_SetBits(GPIOA, GPIO_Pin_1)这样的繁琐代码了!


岂不美哉!!!


位带操作写程序还需要注意的地方


这里写图片描述


后面的分号切记不要忘记了!!!

推荐阅读

史海拾趣

AnDAPT__Inc.公司的发展小趣事

AnDAPT Inc.是一家专注于可编程电源管理解决方案的创新型公司。以下是关于该公司发展的相关故事:

  1. 公司成立与初期阶段:AnDAPT Inc.成立于2014年,总部位于美国加利福尼亚州圣何塞。公司的创始人之一是Raghunandan "Raghu" Anandan,他在可编程电源管理领域拥有丰富的经验和专业知识。公司成立之初,致力于开发一种新型的可编程电源管理解决方案,以满足日益复杂和多样化的电子设备对电源管理的需求。

  2. 技术创新与产品开发:AnDAPT Inc.在其成立初期即开始着手开发基于可编程电源管理技术的解决方案。公司团队结合了数字信号处理(DSP)和模拟电路设计等领域的专业知识,不断推动技术创新和产品开发。他们的主要产品是基于可编程电源管理器件的芯片,能够根据应用需求动态调整电源管理参数,提供高效、灵活和智能的电源解决方案。

  3. 市场拓展与合作伙伴关系:随着公司技术的不断成熟和产品的不断推出,AnDAPT Inc.开始加大对市场的拓展力度。公司与电子设备制造商、系统集成商以及电源管理解决方案提供商建立了紧密的合作关系,共同推动可编程电源管理技术的应用和推广。通过与行业领先的合作伙伴进行合作,AnDAPT Inc.不断拓展产品的应用领域和市场份额。

  4. 技术认证与市场认可:AnDAPT Inc.的产品经过严格的技术认证和市场测试,在业界获得了良好的口碑和市场认可。公司的可编程电源管理解决方案被广泛应用于各种电子设备,包括消费类电子产品、工业自动化设备、汽车电子系统等。其技术创新和产品性能得到了行业专家和客户的一致好评。

  5. 持续发展与未来展望:作为一家专注于可编程电源管理技术的创新型公司,AnDAPT Inc.将继续致力于技术创新和产品开发。公司将不断推出新的产品和解决方案,满足客户不断变化的需求,并积极参与行业标准的制定和技术进步的推动。在未来,AnDAPT Inc.将继续保持敏锐的市场洞察力和技术领先地位,助力客户实现产品创新和市场竞争优势。

BOOKLY公司的发展小趣事

BOOKLY公司在技术创新的基础上,积极拓展市场。通过与各大电子产品制造商建立合作伙伴关系,BOOKLY的产品迅速进入全球市场。公司还积极参与国际电子展览和技术交流会,展示其最新研发成果,吸引了众多合作伙伴和投资者的关注。通过不断的市场拓展和合作,BOOKLY逐渐成为了电子行业的领军企业。

Conxall公司的发展小趣事

为了进一步提升公司的竞争力,Conxall公司积极寻求与其他企业的合作。公司与多家知名电子企业签订了战略合作协议,共同研发新技术、新产品。通过合作,Conxall公司不仅获得了更多的技术资源和市场支持,还提升了自身的品牌形象和知名度。

Danaher Corporation公司的发展小趣事

丹纳赫集团一直重视科技创新和产品研发。在电子行业,丹纳赫集团不断推出具有创新性和竞争力的产品,如高精度测量仪器、自动化测试设备和电子制造解决方案等。这些产品不仅满足了客户对高质量、高效率生产的需求,还帮助丹纳赫集团在电子行业中树立了良好的品牌形象。

Edcon Components Netherlands Cv公司的发展小趣事

品质一直是Edcon Components Netherlands Cv的生命线。公司始终坚持以客户为中心,注重产品质量和服务的提升。通过引进先进的生产设备和检测设备,加强生产过程中的品质控制,确保每一件产品都符合高标准的质量要求。同时,公司还建立了完善的售后服务体系,为客户提供及时、专业的技术支持和解决方案。这些举措使得Edcon在客户中树立了良好的品牌形象。

Cembre SPA公司的发展小趣事

Cembre SPA一直秉持品质至上的原则,不断追求产品质量的提升。公司建立了严格的质量管理体系,从原材料采购到生产制造,再到产品出厂,每一个环节都严格把控。同时,公司还注重持续改进,通过引入先进的生产设备和技术,不断提高生产效率和产品质量。

问答坊 | AI 解惑

行业精英策论PCB设计关键技术

基于Ansoft电磁技术的新一代PCB仿真设计     针对PCB设计人员关注的问题予以讨论,剖析PCB电磁问题的实质及处理方法,介绍Ansoft仿真解决方案的技术特点,与同类型产品的定位关系及比较,并为您展示Ansoft电磁技术及工具在国内 ...…

查看全部问答>

除了定时器我还能用啥来喂狗

我用了一个看门狗芯片LTC1232,想每100ms喂狗,程序如下,OK没问题。 但现在我的两个定时器都要用到别的地方,做计数器用,难道我要在主程序里面每过一段时间喂狗码? 请高手指教 void time0() interrupt 1//定时器中断time0 {    ...…

查看全部问答>

兄弟们,2010年6月23日,中国足球机器人首获世界杯冠军了!

博创足球机器人助中国首获RoboCup2010中型组世界冠军                                ...…

查看全部问答>

[===============]WINCE arm开发板 上电后 全屏 自动运行 指定程序

第一次 接触  wince 开发板 首先遇到的问题是  要让用vs2003写的程序 在 设备 一上电 就 全屏 自动运行 这个问题 就是不想让用户 看到 wince 系统界面上的程序 请各位大侠 指教 …

查看全部问答>

[wince5.0]关于interruptinitialize的使用问题,请教!

我目前是在一个wince5.0平台上写个小驱动,需要在init里启用一个中断,于是就想到了interruptinitialize()这个函数。现在的问题是如果在原BSP里的某个驱动里使用这个函数调用就没有问题,并且能完成任务;但是我自己写的驱动,编译完成后就总是出现 ...…

查看全部问答>

NAND FLASH的spare区格式是什么啊?

NAND FLASH的spare区格式是什么啊? 小块的。。16BIT的。。。 …

查看全部问答>

关于1*16SDRAM的使用问题

各位大哥:本人现做的一个项目需要用到一个8M的RAM缓存,初步打算用1*16的SDRAM,主控是AVR单片机,我想请问一下哪位高手有用过普通单片机来控制SDRAM的呢?具体怎么实现?还有,究竟怎样通过执行LOAD MODE REGISTER命令,完成对SDRAM工作模式设定 ...…

查看全部问答>

买STN32开发板的遭遇

                                 打电话到北京英蓓特办事处问有无STN32开发板,有,兴冲冲找了一个多小时,才在边远地区找到,拿出开发板,但无ulin ...…

查看全部问答>

EXTI的中断问题

                                 stm32例子中的EXTI中断程序的开始都有一个功能是查哪个管脚发生的,以EXTI15_10_IRQHandler为例,在程序开始的时候 ...…

查看全部问答>