快速理解STM32位带操作原理和用途

关注、星标公众,不错过精彩内容

作者:strongerHuang

微信公众号:strongerHuang

说到位带操作,可能很多人比较陌生,但说到控制IO,你肯定不会陌生。有的项目为了最大效率控制IO,使用位带操作。下面就来简单说说未带操作的内容。

一、初识位带操作

Bit-banding简称位带,有人也叫位段。支持位带操作后,可以使用普通的加载/存储指令来对单一的比特进行读写。

很多朋友是从学习51单片机过来的,都知道P1.1这个引脚可以单独控制,我们操作的这个引脚就是一个Bit位。

我们都知道在STM32中不能直接操作寄存器的某一个Bit位,比如单独控制PA端口输出数据寄存器中的ODR1,如下图:

STM32F1内核Cortex-M3早就考虑到了这个问题,为了能达到直接操作ODR1这类Bit位,就在内核中开辟了一块地址区域(位带别名):可以将ODR1这类Bit位(位带区)映射到位带别名区域对应的地址,只需要操作映射后的地址,就可以实现操作这个ODR1位了。

简单来说就是映射操作,只是这个映射操作有许多约定要遵循。

二、位带操作中的映射关系

在Cortex-M3中有两个区实现了位带操作,其中一个是 SRAM区的最低 1MB 范围,第二个则是片内外设区的最低 1MB 范围。

这两个区域如下图红色标注的区域:

这两个1MB将分别映射到另外两个地址区域:

1.SRAM区的最低1MB(0x2000 0000 --- 0x200F FFFF) 映射到(0x2200 0000 --- 0x23FF FFFF)。

2.片内外设区的最低1MB(0x4000 0000 --- 0x400F FFFF)映射到(0x4200 0000 --- 0x43FF FFFF)。

其实就是映射到偏移(距离自身)0x0200 0000外的32MB空间(位带别名区),如下图SRAM区映射关系:

提示:看图中的有颜色的8Bit,它是映射到偏移0x0200 0000外的32Bit(4Byte)空间上。我们读写0x2200 0000这个地址,其实就是操作0x2000 0000中的Bit0位。

这就是所谓的“比特的膨胀对应关系”,1Bit膨胀到32Bit(4字节)。4字节对应的就是那1Bit位的地址,而这个地址中的数据只有最低一位才有效(LSB)。

解释上面多处出现的关键词

位带区:支持位带操作的地址区;

位带别名:对别名地址的访问最终作用到位带区的访问上;

三、位带区->别名区计算公式

位带操作的主要目的:通过Bit位地址(A)计算得到别名区地址(AliasAddr)。

1.SARM区计算公式

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

2.片上外设区计算公式

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

由于映射关系一样,所以公式原理也一样,只是地址不一样。计算公式需要结合上图比特的膨胀对应关系来理解。

*8:1个字4个字节;

*4:1个字节8Bit;

四、代码实现

利用上面计算公式,代码实现的过程就很简单,我们的目的就是对“AliasAddr”这个地址进行读写操作。

1.RAM位带操作宏定义

#define BITBAND_RAM(RAM, BIT) (*((uint32_t volatile*)(0x22000000u + (((uint32_t)&(RAM) - (uint32_t)0x20000000u)<<5) + (((uint32_t)(BIT))<<2))))

2.外设寄存器位带宏定义

#define BITBAND_REG(REG, BIT) (*((uint32_t volatile*)(0x42000000u + (((uint32_t)&(REG) - (uint32_t)0x40000000u)<<5) + (((uint32_t)(BIT))<<2))))

方便大家对比,给一个截图:

A.RAM地址0x20001000Bit1位写0

BITBAND_RAM(*(uint32_t *)0x20001000, 1) = 0;

B.读取RAM地址0x20001000Bit1

uint8_t Val;

Val=BITBAND_RAM(*(uint32_t *)0x20001000, 1);

C.对PA1数据输出寄存器输出1

BITBAND_REG(GPIOA->ODR, 1) = 1;

D.读取PA1数据输出寄存器

uint8_t Val;

Val=BITBAND_REG(GPIOA->ODR, 1);

这里就是操作某一个地址,类似于操作指针一样;

五、位带操作优缺点

1.优点

相比直接操作寄存器代码更简洁,运行效率更高。避免在多任务,或中断时出现紊乱等。

2.缺点

操作不当(传入地址参数不对),容易出现总线Fault。

六、说明

关于Cortex-M3的位带操作,详情可以参看Cortex-M3技术参考手册(权威指南)。

我了解Cortex-M处理器中,Cortex-M3、Cortex-M4都具有位带操作,Cortex-M0,Cortex-M+好像不支持。具体可以下载相关的技术参考手册查看。

推荐阅读:

基于STM32的Keil、IAR仿真打印输出

CMSIS RTOS API,内核通用API接口

Linux 内核的 100% 自由版本 GNU Linux-libre 5.8 发布

关注微信公众号『strongerHuang』,后台回复“1024”查看更多内容,回复“加群”按规则加入技术交流群。

长按前往图中包含的公众号关注

  • 13
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: STM32最小应用系统是指使用STM32微控制器的基本构成,包括微控制器、晶体振荡器、电源电路、复位电路以及一些必要的外部元件。原理图和PCB图是用于设计、布局、连接和制造最小应用系统的重要工具。 首先,我们来了解一下原理图。原理图通过符号、连线和标识来表示系统的电路连接和元件之间的关系。对于STM32最小应用系统,原理图中会包含STM32微控制器的引脚连接、晶体振荡器、电源电路、复位电路以及外部元件的连接,如LED、按键等。原理图有助于我们理解系统的电路原理和连接方式。 接下来是PCB图,也称为印制电路板布局图。PCB图是根据原理图设计的实际电路板布局,它展示了电路元件的尺寸、位置、布线和连接。在PCB图中,我们需考虑电路板的尺寸和形状,同时将电路元件布置在电路板上,并根据原理图中的电路连接,通过导线、焊盘和电路通孔将它们连接在一起。PCB图还包括地平面、电源平面、信号引脚等关键设计元素,以确保电路板的性能和可靠性。 设计STM32最小应用系统的原理图和PCB图时,需要仔细阅读相关的技术资料和用户手册,了解每个电路元件的功能和引脚连接,确保电路的正确性和可行性。通过合理布局和连接,在PCB图上绘制出电路板的设计,然后进行样板制造和焊接等制造工艺。最后,通过测试和调试,确保STM32最小应用系统的正常运行。 总之,STM32最小应用系统的原理图和PCB图是设计、布局和制造该系统的关键工具,能够帮助我们理解和实现系统的电路连接和元件布局。 ### 回答2: STM32最小应用系统原理图是一种设计用于基于STM32微控制器的最简单的电路系统。它由两个主要部分组成:微控制器和与之相关的外部电路。 首先,微控制器是整个系统的核心。它由STM32系列微控制器芯片组成,该芯片集成了处理器核心、内存、外设接口等。在最小应用系统中,常用的STM32型号是STM32F103C8T6,采用了ARM Cortex-M3处理器核心。此外,还需要将该微控制器与电源(通常为5V直流电源)连接。 其次,外部电路是与微控制器连接的各种器件和元件。这些器件和元件包括但不限于晶振、电容、电阻、LED、按键等。其中,晶振用于提供微控制器的时钟信号,电容和电阻被用作滤波和限流元件,LED用于指示系统状态,按键用于输入控制信号等。 在最小应用系统的原理图中,这些器件和元件被合理地布置在一个PCB(印刷电路板)上。PCB是一种将电子元件连接在一起的基板,方便快捷且可靠地实现电路布线。PCB上的每个元件都有连接点,通过细线(称为走线)将它们连接到一起。同时,在PCB上的电源、地线、跳线等需要进行正确的布线。 通过合理设计STM32最小应用系统原理图和对应的PCB图,可以实现基本的硬件功能,如输入输出控制、时钟信号生成等。这样的系统可以为应用程序和软件提供稳定可靠的硬件支持,并且易于调试和扩展。 综上所述,STM32最小应用系统原理图和PCB图是设计和连接基于STM32微控制器的最简单电路系统的关键工具,为硬件开发提供了一个良好的起点。 ### 回答3: STM32最小应用系统原理图是指使用STM32单片机构建的一个最基本的应用系统的电路原理图。这个系统通常包含了STM32单片机、晶体谐振器、电源电路、外部存储器、复位电路以及一些必要的外围器件。 首先,STM32单片机是整个应用系统的核心部分,它负责处理和控制各种任务和功能。它的引脚需要与其他器件连接,用于进行输入输出操作。 晶体谐振器是为了提供系统时钟而必须添加的一个组件。它主要由晶振和电容构成,用于产生稳定的时钟信号,以确保系统的稳定运行。 电源电路提供所需的电源供应。通常,它包含稳压器、滤波电容和滤波电感等元件,以保持电源的稳定和纯净。 外部存储器是用来存储程序代码和数据的,它可以是闪存、RAM等。通过连接到STM32的相应引脚,可以实现对存储器的读写操作。 复位电路用于控制系统的复位功能,它包含了复位电路和复位按钮。通过复位电路,可以在出现问题时或按下复位按钮时重新启动系统。 在最小应用系统中,还会有一些用于外围设备连接和控制的元件,如LED、按键、继电器等。这些元件通过STM32的GPIO引脚进行控制和操作。 当这些元件连同STM32单片机通过连接线布置在PCB上时,就形成了一个完整的最小应用系统的电路板。每个元件的引脚将根据原理图进行布局和连接,以实现各个功能模块之间的协同工作。 总之,STM32最小应用系统原理图PCB图是一种通过布局和连接各个电路元件,并通过原理图指导电路设计的方式来实现STM32单片机最基本应用系统的电路板。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值