位段操作
使用方法
-
位段别名:Cortex-M4 将 SRAM 或外设位带区中的每一位,映射到别名区的一个 32 位字。通过访问这个别名地址,就能直接读取或写入对应的单个 bit。 例如:SRAM 地址
0x20000000的 bit0,对应别名地址0x22000000;向0x22000000写入1,就能将原地址的 bit0 置 1。 -
位段范围为:SRAM 位带区
0x20000000 ~ 0x200FFFFF,对应别名区0x22000000 ~ 0x23FFFFFF; 外设位带区0x40000000 ~ 0x400FFFFF,对应别名区0x42000000 ~ 0x43FFFFFF。 具体芯片是否实现位带,需要查芯片参考手册。 普通修改一个 bit 通常需要 3 条指令(LDR、ORR/BIC、STR), 别名地址已准备好时通常只需要 1 条STR指令,理论上节约 2 条指令。 -
程序中通过
volatile指针访问位带别名地址:#include <stdint.h> #define DEV_BIT0 (*(volatile uint32_t *)0x42000000UL) DEV_BIT0 = 1U; // 将 0x40000000 的 bit0 置 1 DEV_BIT0 = 0U; // 将 0x40000000 的 bit0 清 0
优势
- 单 bit 读写代码直观,不需要手动进行移位和掩码运算
- 硬件直接完成单 bit 访问,适合操作 GPIO、状态标志和控制位。
- 写单 bit 通常可由一条指令完成,减少读改写过程,降低被中断打断导致数据冲突的风险。
- 现代项目一般不主动使用位带:GPIO 通常使用芯片提供的原子置位/复位寄存器(如 STM32 的
BSRR),通用数据则使用 CMSIS、HAL、RTOS 或原子指令接口。位带主要用于理解 Cortex-M4 原理和维护旧代码。