E
Member
低功耗模式下偶发丢事件,现象是外部中断明明来了、程序却没反应,重启又正常。这种故障最难复现,排查要按唤醒链路一步步来。
第一,确认唤醒源真的使能了。很多 MCU 在进入 Stop/Standby 前要单独使能唤醒引脚和边沿配置,代码里只开了中断、没开唤醒源,睡眠后中断根本唤不醒芯片。先查参考手册的唤醒源使能位,再查代码。
第二,查唤醒后的时钟恢复。唤醒瞬间系统时钟还没切回高速时钟,外设时钟处于低速或停振状态,这时来的事件可能因为采样时钟不对而被错过。唤醒中断里先等时钟稳定标志,再处理外设事件,别一唤醒就读寄存器。
第三,查中断标志的清除时序。睡眠前没清掉的历史中断标志,唤醒后会被当成新事件处理一次,真正的事件反而被覆盖。入睡前清标志、唤醒后先读标志再清,是固定套路。
第四,查电源域。部分低功耗模式会掉电 SRAM 或外设寄存器,唤醒后配置丢了,外设处于复位态,看起来像没收到事件。关键寄存器在唤醒后重配一遍,或者选不断电的低功耗档位。
第五,实测手段:唤醒引脚接示波器,看唤醒脉冲和程序恢复执行的时间差,差值超过外设响应窗口就说明时钟恢复链路有问题。
你们做低功耗遇到过唤醒丢事件吗?一般是唤醒源配置问题,还是时钟恢复问题?
第一,确认唤醒源真的使能了。很多 MCU 在进入 Stop/Standby 前要单独使能唤醒引脚和边沿配置,代码里只开了中断、没开唤醒源,睡眠后中断根本唤不醒芯片。先查参考手册的唤醒源使能位,再查代码。
第二,查唤醒后的时钟恢复。唤醒瞬间系统时钟还没切回高速时钟,外设时钟处于低速或停振状态,这时来的事件可能因为采样时钟不对而被错过。唤醒中断里先等时钟稳定标志,再处理外设事件,别一唤醒就读寄存器。
第三,查中断标志的清除时序。睡眠前没清掉的历史中断标志,唤醒后会被当成新事件处理一次,真正的事件反而被覆盖。入睡前清标志、唤醒后先读标志再清,是固定套路。
第四,查电源域。部分低功耗模式会掉电 SRAM 或外设寄存器,唤醒后配置丢了,外设处于复位态,看起来像没收到事件。关键寄存器在唤醒后重配一遍,或者选不断电的低功耗档位。
第五,实测手段:唤醒引脚接示波器,看唤醒脉冲和程序恢复执行的时间差,差值超过外设响应窗口就说明时钟恢复链路有问题。
你们做低功耗遇到过唤醒丢事件吗?一般是唤醒源配置问题,还是时钟恢复问题?
