cortex m3位带操作区解读

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

STM32支持位带操作(bit_band):其中一个是SRAM区的的最低1MB范围(0x2000_0000~0x200F_FFFF,所对应的位带别名区为0x2200_0000~0x23FF_FFFF),另一个是0x4000_0000~0x400F_FFFF,所对应的位带区为0x4200_0000~0x43FF_FFFF)。对应位带别名区指的是对应区域最低1MB范围的地址映射到该区域,例如地址为0x2000_0000的字节对应的位带别名起始地址为0x2200_0000,每个比特对应的位带别名地址分别为 0X220000000 ,0X220000004,0X220000008,0X22000000C,0X220000010,0X220000014,,0X220000018,0X22000001C。具体的地址分配策略可以查看cortex m3手册。

C编译器中并没有直接支持位段操作。比如,C 编译器并不知道对于同一块内存,能够使用不同的地址来访问,也不知道对位段别名区的访问只对 LSB 有效。需要在 C中使用位段操作,最简单的做法就是#define 一个位段别名区的地址。使用位段功能时,要访问的变量必须用 volatile 来定义。因为 C 编译器并不知道同一个比特可以有两个地址。所以就要通过 volatile,使得编译器每次都如实地把新数值写入存储器,而不再会出于优化的考虑 ,在中途使用寄存器来操作数据的复本,直到最后才把复本写回。这是对上面第二行代码的解读。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值