初学M4,看到HWREGBITW函数不知什么意思,求指导!
#define HWREGBITW(x, b) \
HWREG(((uint32_t)(x) & 0xF0000000) | 0x02000000 | \
(((uint32_t)(x) & 0x000FFFFF) << 5) | ((b) << 2))
以上函数的逻辑是什么,感觉不理解。。。
初学M4,看到HWREGBITW函数不知什么意思,求指导!
#define HWREGBITW(x, b) \
HWREG(((uint32_t)(x) & 0xF0000000) | 0x02000000 | \
(((uint32_t)(x) & 0x000FFFFF) << 5) | ((b) << 2))
以上函数的逻辑是什么,感觉不理解。。。
Hi Di,
下面的公式是别名区和位带区的映射关系:
bit_word_offset = (byte_offset x 32) + (bit_number x 4)
bit_word_addr = bit_band_base + bit_word_offset
其中:
bit_word_offset-在位带区中的目标位的位置。(((uint32_t)(x) & 0x000FFFFF) << 5) | ((b) << 2)
bit_word_addr-在别名区中与目标位映射的字的地址。(((uint32_t)(x) & 0xF0000000) | 0x02000000 | (((uint32_t)(x) & 0x000FFFFF) << 5) | ((b) << 2)
bit_band_base-别名区的起始地址 ((uint32_t)(x) & 0xF0000000) | 0x02000000
byte_offset-字节在包含目标位的位带区中的编号((uint32_t)(x) & 0x000FFFFF)
bit_number-目标位的位置,0-7。(b)
上面标红的部分就是所对应的部分。
Wellin Zhang
您好,请问为什么要将(((uint32_t)(x) & 0x000FFFFF) << 5) | ((b) << 2)中的“(b) << 2”左移两位,而将其地址的低二位空出来呢?