【发布时间】:2021-08-13 21:42:00
【问题描述】:
我有以下宏用于读取 STM32F091 上寄存器中的单个位:
#define GET_BIT(reg, pos) (((reg)>>(pos))&0x00000001u)
我必须将此宏与这两个参数一起使用:
#define FLASH_KEYR (*((u32_t *)(0x40022004u)))
#define BSY_FLASH_SR_POS (0u)
我没有任何问题使用这个宏来评估单个变量,例如:
uint32_t value = GET_BIT(FLASH_SR, BSY_FLASH_SR_POS);
但是,在这样的条件语句上使用这个宏:
while (GET_BIT(FLASH_SR, BSY_FLASH_SR_POS) == 1u);
微机进入 ISR 以进行 HardFault。
...为什么?
【问题讨论】:
-
什么是FLASH_SR - 即显示定义(不解释SR寄存器的作用)。 Waht 是 REGISTER_ADDRESS
-
为什么是
0x00000001u而不是简单的1 -
@Toad __ -
GET_BIT(((REGISTER_ADDRESS)>>(FIELD_POSITION))&0x00000001u)不是 2 参数宏GET_BIT(reg, pos)的有效调用。 -
您说的调用有效,与您说的中断不同,因此很可能与 if 或 while 无关,而是与参数无关。无论如何,这是一个可怕的想法。与其使用位位置宏,不如使用位掩码宏(可能已经在芯片头中定义)并直接测试位,或者使用位带地址直接读取位。
-
现在,您是要移位寄存器地址还是寄存器值?您实际在做什么以及它在语义上是否有意义将取决于 FLASH_SR 的定义。宏不好,因为它们混淆了代码的语义。要调试一个,您必须考虑 full 扩展以及它在语法上和在这种情况下在语义上是否正确。