位段操作

← 返回 Cortex-M4内核原理 | ← 主页


使用方法

  1. 位段别名:Cortex-M4 将 SRAM 或外设位带区中的每一位,映射到别名区的一个 32 位字。通过访问这个别名地址,就能直接读取或写入对应的单个 bit。 例如:SRAM 地址 0x20000000 的 bit0,对应别名地址 0x22000000;向 0x22000000 写入 1,就能将原地址的 bit0 置 1。

  2. 位段范围为:SRAM 位带区 0x20000000 ~ 0x200FFFFF,对应别名区 0x22000000 ~ 0x23FFFFFF; 外设位带区 0x40000000 ~ 0x400FFFFF,对应别名区 0x42000000 ~ 0x43FFFFFF。 具体芯片是否实现位带,需要查芯片参考手册。 普通修改一个 bit 通常需要 3 条指令(LDR、ORR / BIC、STR), 别名地址已准备好时通常只需要 1 条 STR 指令,理论上节约 2 条指令。

  3. 程序中通过 volatile 指针访问位带别名地址:

    #include <stdint.h>
     
    #define DEV_BIT0    (*(volatile uint32_t *)0x42000000UL)
     
    DEV_BIT0 = 1U;       // 将 0x40000000 的 bit0 置 1
    DEV_BIT0 = 0U;       // 将 0x40000000 的 bit0 清 0

优势

  1. 单 bit 读写代码直观,不需要手动进行移位和掩码运算
  2. 硬件直接完成单 bit 访问,适合操作 GPIO、状态标志和控制位。
  3. 写单 bit 通常可由一条指令完成,减少读改写过程,降低被中断打断导致数据冲突的风险。
  4. 现代项目一般不主动使用位带:GPIO 通常使用芯片提供的原子置位/复位寄存器(如 STM32 的 BSRR),通用数据则使用 CMSIS、HAL、RTOS 或原子指令接口。位带主要用于理解 Cortex-M4 原理和维护旧代码。