【STM32笔记】__WFI();进入不了休眠的可能原因
【STM32笔记】低功耗模式配置及避坑汇总
前文:
blog.csdn.net/weixin_53403301/article/details/128216064
【STM32笔记】HAL库低功耗模式配置(ADC唤醒无法使用、低功耗模式无法烧录解决方案)
__WFI();为汇编指令
/**
\brief Wait For Interrupt
\details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs.
*/
#define __WFI __wfi
其作用就是设备休眠 并等待任意中断实践唤醒
实际调用:
__WFI();
但是 基本上直接都执行不了
最常见的就是中断没清理掉
在Keil的调试中可以看到活跃的中断
EPA分别表示Enable Pending Active
前两个表示开启但未发生 Active表示正在发生
所以进入休眠前需要调用中断清理
如:
__disable_irq();
或:
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); //清理唤醒标志 防止立刻唤醒
等标志
另外 实测发现 即使没有中断或唤醒标志 也会导致__WFI();无法进入 特别是程序刚开始运行的时候 这里其实就是没消抖 需要延时一会(哪怕1us)
delay_us(1);
__WFI();
再者 在进行调试时 如果采用单步调试(也相当于一种中断) 则会执行__WFI();后立马执行下一句
所以可以在__WFI();之前和之后打一个断点 用全速跑来判断是否进入