位带操作与HWREGBITW(x, b) 理解
1、位带
(1)位带区
位带区域分直接位带区(bit-band region)和位带别名区(bit-band alias)。
直接位带区,表现为对内存的直接访问;
位带别名区,每一个地址都代表直接位带区的一个bit位,对此区域的访问都会被映射到直接位带区,写操作被执行为读-修改-写,指令访问不会被重新映射。
(1)位带区分布
TM4C芯片中位带区域包含SRAM和Peripheral,位带区域占用 SRAM 和外围存储器区域的最低 1 MB。Cortex-M4 微处理器中所有 SRAM 和所有外设都位于位带区域内。
32M的SRAM位带别名区映射到1M的SRAM直接位带区,见表2-6,表中地址显示的地址区不足32M,但是映射表中满足32M的地址,映射表见Figure2-4.
32M的外设别名区映射到1M的外设直接位带区,见表2-7.

(2)位带映射
写入别名区域中的字会更新位带区域中的单个位,通俗地讲,位带操作就是把位带区中一个地址的8个位分别映射到位带别名区的8个地址(LSB有效,即最低位有效),通过操作相应地址的方式实现操作某个位。
写入别名区域中字的值的位 0 确定写入位带区域中目标位的值。 写入位 0 设置的值会将 1 写入位带位,写入位 0 清除的值会将 0 写入位带位。
别名字的位 31:1 对位带位没有影响。 写入 0x01 与写入 0xFF 的效果相同。 写入 0x00 与写入 0x0E 的效果相同。
读取别名区域中的字时,0x0000.0000 表示位带区域中的目标位已清除,0x0000.0001 表示位带区域中的目标位已设置。

2、为何使用位带
我们都知道51单片机的GPIO引脚可以直接通过bit位来控制;而现在的32位单边机不能直接操作寄存器中的某一位。为解决此问题,32位单片机提出位带区,形成位带操作。
3、HWREG()宏
HWREG()宏可以直接操作硬件寄存器,里面的参数是tm4c芯片的硬件外设寄存器地址
#define HWREG(x) \
(*((volatile uint32_t *)(x)))
#define HWREGH(x) \
(*((volatile uint16_t *)(x)))
#define HWREGB(x) \
(*((volatile uint8_t *)(x)))
4、HWREGBITW()宏
HWREGBITW()宏定义的是tm4c芯片的位带操作,对应地址范围是SRAM/Peripheral bit-band alias。宏定义中的“| 0x02000000”则锁定了位带别名区。
#define HWREGBITW(x, b) \
HWREG(((uint32_t)(x) & 0xF0000000) | 0x02000000 | \
(((uint32_t)(x) & 0x000FFFFF) << 5) | ((b) << 2))
#define HWREGBITH(x, b) \
HWREGH(((uint32_t)(x) & 0xF0000000) | 0x02000000 | \
(((uint32_t)(x) & 0x000FFFFF) << 5) | ((b) << 2))
#define HWREGBITB(x, b) \
HWREGB(((uint32_t)(x) & 0xF0000000) | 0x02000000 | \
(((uint32_t)(x) & 0x000FFFFF) << 5) | ((b) << 2))
HWREGBITW(x,b)宏中的x是所填位带区的地址,b是偏移量。

浙公网安备 33010602011771号