传统操作:修改一个32位寄存器内值的方法是,从寄存器中取出值,修改这个值,然后再放回这个寄存器中。
位带操作:对于位带区的每一位,在位带别名区都有一个32位的地址对应,当需要修改值时,直接对该地址所指向的值进行修改。
位带区:支持位带操作的地址区,也就是说此区域可以给它起一个地址别名。
位带别名:即为上述映射到的32位地址(别名)所在区域,对这个别名地址的访问最终作用到位带区的访问上。
支持位带操作的两个内存区域是:
0X2000_0000-0X200F_FFFF(SRAM区中的最低1MB)
0X4000_0000-0X400F_FFFF(片上外设区中的最低1MB)
位带区与位带别名区之间的映射关系见下图
位带区到位带别名区的地址映射公式:
在编程中,我们会把以上公式合并成一个公式
(addr & 0xF0000000)+0x02000000+((addr & 0x00FFFFFF<<5)+(bitnum<<2))
(addr & 0xF0000000)目的是取出addr的最高位(根据映射表可知最高位非2即4),通过最高位来区分是SRAM还是片上外设,再加上0x02000000即复原了SRAM/外设位带别名区的起始地址,(addr & 0x00FFFFFF<<5)实际上是实现原式中的(A-0x20000000)*8*4,(bitnum<<2)等同于n*4.