专栏中心

EEPW首页 > 专栏 > STM32如何进行位绑定

STM32如何进行位绑定

发布人:Linux嵌入式 时间:2022-12-30 来源:工程师 发布文章

在我们学习51单片机的时候,对IO的操作可直接使用P0^1=0,P0^2=1,控制某个IO口就可以单独的对某个端口的IO口进行操作,但在STM32中是不能直接这样用的,为了可以像使用51单片机一样对某个端口的IO口进行直接操作方便我们使用,就出现了位带操作。

位绑定理解:

STM32对外设端口的操作是通过配置相应的寄存器的位来完成的,位绑定就是把对寄存器某一位的操作映射到某个内存地址,通过位绑定后我们可以使我们的的代码效率更高,对外设的操作更加方便。

下图显示了Cortex-M3 存储器的映射

从图中我们可以看出STM32存储映射区包括两个位绑定区(bit band区)。分别为SRAM区域中的低1MB地址即(0X20000000~0x200FFFFF)和外设存储区的低 1MB地址处(0x4000 0000 ~ 0x400F FFFF)。我们都知道STM32是32的,最快捷的操作方法就是操作一个32的地址,所以STM32有设计出了别名区,对32MB SRAM的别名区的访问映射为1M SRAM位绑定区(Bit Band)的访问,对 32MB 外设别名区的访问映射为对 1MB 外设位绑定区(Bit Band)区的访问。为什么别名区会是位带区的32倍呢?因为位带区是以位为单位,每八个位为一个地址,而别名区是以字为单位,每个字等于4个字节,就是32位。

位绑定区的地址映射如下所示:


从上图中可以看出位带区0x20000000的第0位对应的地址是0x22000000-0X22000003 这4个字节,这里我们需要注意的是只有起始的地址0x2200000,0x22000004,这样4的倍数的地址才能被访问。所以就有了以下的对应地址:



映射的算法:

对于位绑定的公式官方给出的如下:


比如我们要访问的内存寄存器的地址为add;n为对应的每一位

SRAM区映射的地址 = 0x22000000 + ((add- 0x20000000) * 8 + n) * 4 = 0x22000000 + ((add - 0x20000000) * 32 + n * 4

片上外设区映射的地址 = 0x42000000 + ((add - 0x40000000) * 8 + n) * 4= 0x42000000 + ((add - 0x40000000) * 32 + n * 4

n*4是因为1位要用4个地址单元即前面说的只有4的倍数的地址才能被访问。

byte_offset*32(add - 0x20000000)*32因为位带区的一个位要扩张到别名区的32个位,byte_offset*32是前面已经占用的地址。

程序实现:

#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))


#define GPIOA_ODR_Addr (GPIOA_BASE+20)

#define GPIOA_IDR_Addr (GPIOA_BASE+16) //0x40020010

对IO口操作

#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出

#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入

因为不知道其是SRAM还是片上外设的映射,所以我们取其高位addr & 0xF0000000,然后加上0x2000000,
这样无论是SRAM还是片上外设的映射都可以得到其对应的别名区基地址,addr &0xFFFFF(add=0x2000_0000‐0x200F_FFFF 0x4000_0000‐0x400F_FFFF)屏蔽高三位就相当于与add- 0x20000000和add - 0x40000000
<<5就相当于乘32,<<2就是乘以4,因为左移的速度比乘的要快,所以把乘都改为了左移。


专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词: STM32 位绑定

相关推荐

STM32开发-LL库与HAL库对比

嵌入式系统 2025-08-01

结合RTC实现的“智能定时任务系统”:设计与实战

采用按键消抖电路,不用再软件延时了

嵌入式系统 2025-08-06

STM32 心电图方案全解析:手把手教你开发医疗级心电监测设备!

嵌入式系统 2025-08-04

意法半导体出厂中国制造的STM32 MCU

聚焦工程师需求,贸泽电子带来丰富 STMicroelectronics 产品方案

2026-03-31

FreeRTOS 在STM32上的移植 V1.0

手把手教你学ARM-STM32 第二讲 STM32最小系统

视频 2012-12-25

基于STM32指甲式脉搏血氧仪七大核心功能解析与实现

嵌入式系统 2025-08-04

汽车表盘显示和GPS地图显示的动感演示

视频 2012-05-07

详解STM32单片机的堆栈

功率监测与控制系统DIY——搭建环境,定时器翻转LED

IAR_STM32开发板原理图

资源下载 2009-01-04

STM32的定时器进行输入脉冲的计数(代码).

如何使用STM32的PVD对电源的电压进行监控

手把手教你学ARM-STM32 第一讲 绪论(上)

视频 2012-12-25

“sacq”的STM32运行uCGUI演示的视频片段1

视频 2012-05-07

手把手教你学ARM-STM32 第三讲 系统时钟初始化函数与延时函数的实现

视频 2012-12-25

基于STM32的MP3播放器设计与实现(提供MDK完整源码)

基于STM32的智能地震监测预警系统

更多 培训课堂
更多 焦点
更多 视频

技术专区