位带操作(Bit-banding)的特性是ARM Cortex-M微控制器中一个非常有用的功能,其目的是提供一种简便的方法来访问和操作存储器中单个位的状态。位带操作能够使程序员能够以原子操作(即不可中断的操作)的方式读取和写入单个位,这对于多任务环境和需要高度同步的场合非常有用。
位带操作将两个特定区域的内存映射至一个别名区域:
- 位带别名区:这是一块较大的内存区域,其中的每个位都映射到位带区中一个特定的位。
- 位带区:一个较小的内存区域,通常包括某些特定的内存和外设寄存器。
位带操作的过程如下所述:
-
映射机制:位带映射机制将别名区中的每个字(32位)映射到位带区的一个特定位上。因此,位带别名区相对位带区会大得多,因为每32位被映射为位带区的一个单独位。
-
读-改-写操作:在位带别名区对一个字(32位)进行写操作实质上将导致对位带区中的一个特定位执行读-改-写操作。例如,如果在位带别名区写入1到某个特定位置,相应在位带区的那个位将被设置为1;如果写入0,则该位被清零。这个操作保证了原子性,意味着在整个读-改-写阶段,操作不会被中断。
这种映射机制允许软件以位为单位精确控制存储器或寄存器的状态,而无需使用移位和掩码操作,这些操作涉及额外的读取和写入,且可能不是原子的。位带操作尤其在需要对某单个位频繁进行读取或者修改的嵌入式应用中非常有用,例如在处理中断使能寄存器或特定的状态标志时。
在实际应用中,开发者需要根据具体的微控制器手册中提供的地址映射信息,确定如何正确地定位和使用别名区和位带区。
在 STM32F10xxx 里,外设寄存器和 SRAM 都被映射到一个位段区里,这允许执行单一的位段的
写和读操作。
下面的映射公式给出了别名区中的每个字是如何对应位带区的相应位的:
bit_word_addr = bit_band_base + (byte_offset × 32) + (bit_number × 4)
其中:
bit_word_addr 是别名存储器区中字的地址,它映射到某个目标位。
bit_band_base 是别名区的起始地址。
byte_offset 是包含目标位的字节在位段里的序号
bit_number 是目标位所在位置 (0-31)
例子:
下面的例子说明如何映射别名区中 SRAM 地址为 0x20000300 的字节中的位 2 :
0x22006008 = 0x22000000 + (0x300 × 32) + (2 × 4).
对 0x22006008 地址的写操作与对 SRAM 中地址 0x20000300 字节的位 2 执行读 - 改 - 写操作有着相
同的效果。