STM32-位带操作及位带别名区

一、位带操作的基本含义及作用

	位带别名区的设计主要是为了**方便对位带区单个比特位进行读写操作**。在某些应用场景下,
	需要频繁地对位带区某个特定的比特位进行读写操作,但是由于处理器架构中并没有提供直接读写
	位带区单个比特位的指令,因此需要使用一定的位运算来实现。但是,这样会使得代码复杂且容易出错。

   位带别名区的出现,就是为了解决这个问题。它通过为位带区每个比特位分配一个独立的物理地址,以便能够
   直接对某个特定的比特位进行读写操作,从而避免了手动进行位运算的麻烦和出错风险。实际上,位带别名区
   就是在内存中专门开辟出来的一段空间,其中的每4个字节都与原始内存中的某个特定的比特位相映射,从而可
   以直接对该比特位进行读写操作

二、以STM32为例

STM32就要两个位带区:一个是SRAM存储寄存器映射区,二是外设位带区
(把寄存器的每一个位映射成一个 32 位的字)

STM32物理内存映射

如上图所示:
一个是SRAM存储寄存器映射区:
0x2000 0000–0x2000 0FFF是SRAM(静态随机存取)的物理地址
0x20001000–0x3FFF FFFF是保留部分内存,它的目的就是为了以某一种关系把0x2000 0000–0x2000 0FFF的每一个位映射到0x20001000–0x3FFF FFFF的空间中,实现一个比特位转换为一个字的空间(STM32的一个地址存储一个4个字节(32位)的内容),这种关系下面再详细说明

二是外设位带区
0x4000 0000–0x4002 03F7是各种外设寄存器的物理地址
而0x4002 03F8–Ox5FFF FFFF是保留部分内存,功能和上面说得一样

三、位带别名区和位带区(寄存器地址位地址)的转换关系

   下面是它们的转换公式:
	(Base_Adr +0x02000000+ byte_offset * 32) + (bit_number * 4)
	Base_Adr是位带区的基地址,
	
	byte_offset 表示该比特位在位带区中的偏移量,如果知道某一寄存器的实际物理位置
	为Reg_Adr,则byte_offset =Reg_Adr - Base_Adr
	
	bit_number 则是该比特位在所在字节中的位偏移量。

对SRAM说:Base_Adr = 0x20000000u
对外设位带区说:Base_Adr = 0x40000000u

四、使用例程

#define GPIO_BITBAND_REG(Reg,Bit)    (*((uint32_t volatile*)\
(0x40000000u +0x02000000u+ (((uint32_t)&(Reg) - (uint32_t)0x40000000u)\
<<5) + (((uint32_t)(Bit))<<2))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值