C语言中if或while语句上带有宏的HardFault



我有以下宏,用于读取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);

micro进入硬件故障的ISR。

为什么?

问题是你在重新发明轮子,结果出了问题。

与其帮助你重新发明另一个新的轮子,不如看看ST已经为你制造的现有轮子:

#include "stm32f0xx.h"
...
while ((FLASH->SR & FLASH_SR_BSY) != 0);

如果你坚持重新发明轮子,那么它在循环中不起作用的原因是因为你错过了指针投射中的volatile。

我的另一个答案仍然是正确的专业答案(尤其是在安全关键的环境中(,但从评论中听起来,这是你更愿意接受的答案。

相关内容

  • 没有找到相关文章

最新更新