位带操作与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是偏移量。 

posted @ 2021-08-05 14:36  硕果磊磊  阅读(1168)  评论(0)    收藏  举报