看门狗复位和软件复位有什么区别?别只怪喂狗,看看复位标志位
摘要系统莫名其妙重启看门狗明明在正常喂为什么还会复位不是看门狗失灵而是复位源不是看门狗而是掉电复位BOR 或软件复位。本文教你如何通过复位标志位Reset Flags 精准定位真凶。一、问题描述现象**产品在客户现场偶尔重启一天 1~2 次日志显示看门狗计数器一直在刷新喂狗正常重启后变量值还在以为是看门狗复位。**很多工程师的排查方向是喂狗函数没执行中断里喂狗被阻塞了换一个看门狗芯片二、原理分析1. 物理模型MCU 内部有多个复位源它们共用同一个 Reset 信号线。POR/BOR ─┐ IWDG ───┼── Reset Logic ── MCU Reset WWDG ───┤ Software ─┘2. 核心参数RCC_CSR / RSTC_SR复位状态寄存器存着谁干的坏事。IWDG独立看门狗基于 LSI 时钟主频异常也能工作。WWDG窗口看门狗基于 APB 时钟必须在一定窗口内喂。3. 反直觉真相“重启了就是看门狗复位”是最大的误解。BOR掉电复位电压跌落到阈值以下复位。Software Reset代码执行了NVIC_SystemReset()。Pin ResetNRST 引脚被拉低通常是电源芯片干的。结果你以为是看门狗没喂其实是电压掉了或者是软件里有个 Bug 调用了复位函数。三、工程级解决方案方案 1在 main() 开头读取复位标志必做这是定位随机重启的唯一科学方法。void Check_Reset_Source(void) { uint32_t reset_flags RCC-CSR; if (reset_flags RCC_CSR_PINRSTF) { printf(Pin Reset (NRST pin)\n); } if (reset_flags RCC_CSR_PORRSTF) { printf(Power On Reset (BOR)\n); } if (reset_flags RCC_CSR_SFTRSTF) { printf(Software Reset\n); } if (reset_flags RCC_CSR_IWDGRSTF) { printf(Independent Watchdog Reset\n); } // 清除标志位准备下一次检测 RCC-CSR | RCC_CSR_RMVF; }方案 2区分“冷启动”和“热重启”利用复位标志来决定初始化流程。if (reset_flags RCC_CSR_PORRSTF) { // 冷启动初始化所有外设、校准传感器 Init_All_Hardware(); } else { // 热重启看门狗/软件复位只恢复关键状态 Recover_State(); }方案 3防止“假喂狗”看门狗喂得太快在中断里喂可能掩盖真正的死机。错误在 Systick 中断里喂狗。正确在主循环Super Loop里喂狗且必须检查任务调度是否正常。四、选型避坑建议IWDG 不要用 LSE32.768kHzLSE 容易停振导致看门狗失效。用 LSI~40kHz虽然不准但可靠。WWDG 窗口期WWDG 要求必须在窗口内喂太早太晚都复位适合监控代码执行流。复位后变量保留如果变量定义在.noinit段复位后值会保留这不代表没有复位。五、总结 Checklist[ ] 是否在 main() 开头读取并打印复位标志[ ] 是否区分了 BOR、IWDG、Software 复位[ ] 看门狗是否在主循环喂而不是在中断里喂[ ] 复位后是否清除了复位标志位六、写在最后关注我少走弯路我是 gqqsherry一个拒绝调包、专注底层逻辑的嵌入式工程师。复位是系统的最后一道防线不知道谁触发了复位就等于瞎子摸象。关注我的专栏《嵌入式底层避坑指南》下一篇我们将深入解析《HardFault 怎么定位别只怪指针看看 LR 与 CFSA》。下一篇预告《HardFault 怎么定位别只怪指针看看 LR 与 CFSA》原创文章转载请注明出处。