1. 程式人生 > 其它 >位帶操作HWREGBITW(x, b) 理解

位帶操作HWREGBITW(x, b) 理解

1、位帶操作

位帶區域分直接位帶區(bit-band region)和位帶別名區(bit-band alias)。直接位帶區是一塊直接對應暫存器的地址(地址表見晶片手冊Memory Map);位帶別名區是直接位帶區的對映,將每一位膨脹成了一個32位的字。

2、HWREG()巨集

HWREG()巨集可以直接操作硬體暫存器,裡面的引數是tm4c晶片的硬體外設暫存器地址

#define HWREG(x)                                                              \
     	   (*((volatile uint32_t *)(x)))
#define HWREGH(x)                                                             \
    	    (*((volatile uint16_t *)(x)))
#define HWREGB(x)                                                             \
    	    (*((volatile uint8_t *)(x)))

3、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))

(1)位帶區

TM4C晶片中位帶區域包含SRAM和Peripheral,如下圖所示。

(2)引數說明

HWREGBITW(x,b)巨集中的x是所填位帶區的地址,b是偏移量。