位带区对应的位带别名区地址如何计算?

学习过C51单片机的朋友都应该知道位寻址的概念,我们能够对特殊功能寄存器某一位直接寻址进行操作。在ARM Contex-M3 内核同样有两个区域支持类似的操作,名称有点不一样,称为位带操作。

STM32是32位机,寄存器和存储器都是32位的,其中片内SRAM(静态随机存储区)和片上外设区支持位带操作。位带区空间大小为1MB,与之配合使用的位带别名区空间大小为:32MB,如图1所示。可以理解为将位带区膨胀了32倍。相当于1M位带空间中的每一个bit位都用一个32位的值来表示(实际上只用了32位中的一个字节)。32位对应的是四个字节,即一个32位存储空间需要用4个字节来进行编址。

图1 存储器映射结构图

以0x2000 0000-0x2010 000位带区为例,第一个存储空间占32位(4个Byte),详细地址表示如图2所示。进行位带操作时需要使用位带别名区中对应的地址表示此空间中的每一个bit。

图2 位带区第一个存储空间的地址表示

为了实现位带操作,我们用位带别名区中32位(实际上只用了4个字节中的低字节地址)表示位带区中的一个bit,详细表示过程如图3所示。

图3 位带别名区与位带区地址对照图

从图3可知,0x2000 0000.0位是由位带别名区中的第一个32位存储空间中的低字节地址表示的,具体地址为:0x2200 0000。0x2000 0000.1位由第二个32位存储空间中的低字节地址表示,具体地址位0x2200 0004;第3个bit对应地址为:0x2200 0008,依此类推。归纳总结为计算公式:

位带别名区地址=0x22000000+((A-0x20000000)*8+n)*4

其中,A表示位带区地址,n表示每个字节中的第几位(n大于等于0,小于等于7)。(A-0x20000000)*8+n)表示总计位数,而每增加一位,别名区的字节地址都会增加4,所以需要乘以4。

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值