我有以下宏用于读取 STM32F091 寄存器中的单个位:
#define GET_BIT(reg, pos) (((reg)>>(pos))&0x00000001u)
Run Code Online (Sandbox Code Playgroud)
我必须将这个宏与这两个参数一起使用:
#define FLASH_KEYR (*((u32_t *)(0x40022004u)))
#define BSY_FLASH_SR_POS (0u)
Run Code Online (Sandbox Code Playgroud)
使用此宏来评估单个变量时我没有任何问题,例如:
uint32_t value = GET_BIT(FLASH_SR, BSY_FLASH_SR_POS);
Run Code Online (Sandbox Code Playgroud)
但是,在这样的条件语句上使用这个宏:
while (GET_BIT(FLASH_SR, BSY_FLASH_SR_POS) == 1u);
Run Code Online (Sandbox Code Playgroud)
微型进入硬故障的 ISR。
...为什么?
问题是你在重新发明轮子,结果是错误的。
这里不是帮助您重新发明另一个新轮子,而是 ST 已经为您制作的现有轮子:
#include "stm32f0xx.h"
...
while ((FLASH->SR & FLASH_SR_BSY) != 0);
Run Code Online (Sandbox Code Playgroud)