STM32位段与位段别名区

本文介绍了STM32中位段的概念,特别是针对32位处理器如何进行位操作。位段别名区是为了提高位操作效率,将位段映射到新的地址空间,每个位映射为32位。通过地址映射关系,计算位段别名区的地址,并提供了通用的宏定义来便捷地进行位操作。此外,还阐述了地址数据加1对应字节增加的理解。
摘要由CSDN通过智能技术生成

1.位段解释:

因为STM32是32位处理器,所以一般在存取数据时都规定以32位为内存地址进行操作。存储器中有两段地址比较特殊,它允许进行按位操作,称作位段。

分别是:
SRAM的前1MB内存,起始地址0x2000 0000;
外设寄存器的前1MB内存,起始地址0x4000 0000;

2.位段别名区:

按位进行操作没有按照32位内存进行操作快,所以对于位段,将其映射到另一段地址上,将原来位段上的1bit映射为32bit(1bit膨胀为32bit,方便操作),这一段地址叫做位段别名区。

对位段别名区进行操作等同于操作对应位段上一个位的数据。虽然位段别名区有32位,但是只有最低位有效。

位段起始地址对应的位段起始地址:
0x2000 0000 ---  0x2200 0000
0x4000 0000 ---  0x4200 0000

由映射关系可知:
1MB = 1M * 8 bit = 8 Mbit,
所以位段别名区的内存大小为:8 M * 4B = 32MB  (将一个bit膨胀为32bit即4B)。

所以位段别名区的地址范围为:
0x2200 0000 --- 0x221F FFFF
0x4200 0000 --- 0x421F FFFF
(可以验算一下,
所占内存 = (0x221F FFFF - 0x2200 0000)B
              = 0x1F FFFF B
              = 32MB

3.对于十六进制地址数据的理解:

地址数据+1等于加了一个字节Byte。

4.位段到位段别名区的地址映射换算:

由以上定义可得:

位段别名区地址 = 位段别名区起始地址 + 位段别名区地址偏移(与位段起始地址的差)。

位段别名区地址偏移 = 位段地址偏移 *  8 * 4 + 该位在该字节中的位置偏移(是第几位)* 4;

5.通用映射代码:


#define A(addr,n)  ( ( addr&0xf000 0000 ) + 0x2000 0000 + ( (addr&0xf ffff) << 5 ) + (n << 2) )

注:计算出位段地址为addr,第n位的位的位段别名区地址,<< 5相当于* 32,<< 2相当于* 4;

#define BA(addr,n)  ( * ( volatie unsigned int * )A(addr,n) )

注:调用A(addr,n)得到位段别名区地址,强制类型转换成int指针型变量,volatile关键字防止优化,再将该地址的值用BA(addr,n)表示。
BA(addr,n) = 1就可以将该位置1;

可以再度封装:
eg:  #define PFout(n) BA(GPIOF_ODR,n)
注:GPIOF_ODR也是一个宏定义,是该寄存器的地址(0x4002 1414)。

参考视频:https://www.bilibili.com/video/BV1BT4y1Q716?share_source=copy_web

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值