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,使得编译器每次都如实地把新数值写入存储器,而不再会出于优化的考虑 ,在中途使用寄存器来操作数据的复本,直到最后才把复本写回。这是对上面第二行代码的解读。

你可能感兴趣的:(cortex m3位带操作区解读)