HWREGBITW函数是什么意思?



初学M4,看到HWREGBITW函数不知什么意思,求指导!

#define HWREGBITW(x, b) \
HWREG(((uint32_t)(x) & 0xF0000000) | 0x02000000 | \
(((uint32_t)(x) & 0x000FFFFF) << 5) | ((b) << 2))

以上函数的逻辑是什么,感觉不理解。。。

  • Hi DI,

      这句话的主要作用是针对cortex-M3和M4架构里特有的bit-band的操作。你可以先了解一下bit-band的具体意思,然后在返回来看这个表达式,你就会很容易理解了。

    谢谢

    ken

  • 我们知bit band 是用别名 对位的操作,对于上面的语句,我也有同感,能解释一下吗?比如举个例子?

  • 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

  • 解释的很好,MARK一下!:)

  • 您好,请问为什么要将(((uint32_t)(x) & 0x000FFFFF) << 5) | ((b) << 2)中的(b) << 2”左移两位,而将其地址的低二位空出来呢?