[麦麦茶水间] 【每周分享】MCU的独立看门狗在哪些情况下会失效?

[复制链接]
78|0
dffzh 发表于 2025-10-31 16:24 | 显示全部楼层 |阅读模式



MCU的独立看门狗(其英文名称在不同MCU上可能会有差别)的失效大致可以分为几种情况:
根本性失效:看门狗硬件本身或其所依赖的核心资源停止工作。
逻辑性失效:看门狗硬件在工作,但软件逻辑导致其无法复位系统。
配置性失效:看门狗未被正确初始化或配置。
接下来我就详细说下具体情况:
1. 电源和时钟故障(根本性失效)
独立看门狗通常有一个关键特性:它独立于主时钟和外设。它使用独立的内部RC振荡器作为时钟源。然而,它依然依赖于电源。
MCU完全掉电或电压低于最低工作电压:如果整个芯片的电源都没了或者低到无法维持基本操作,看门狗电路自然也会停止工作。这种情况下,系统会直接停止,看门狗也无能为力。
看门狗专用时钟源失效(罕见):虽然独立看门狗的内部RC振荡器非常可靠,但在极端环境(如强电磁干扰、超出芯片规格)下,理论上也存在失效的可能。一旦其时钟停止,看门狗计数器也就停止了。
2. 软件逻辑错误(最常见的失效原因 - 逻辑性失效)
这是导致看门狗“形同虚设”的最主要原因。
在中断服务程序里“喂狗”
场景:主程序因为某个bug(如死循环)卡住了,但一个定时器中断仍在正常触发。如果喂狗操作放在了这个定时器中断里,那么即使主程序已死,看门狗也会被定期喂食,***不会超时复位。
最佳实践:喂狗操作必须放在主循环的超级VIP位置,确保只有主程序正常有序执行时才能走到喂狗这一步。
“喂狗”过于频繁或无处不在
场景:在程序的很多个地方都插入了喂狗语句。即使某个子程序或任务陷入局部死循环,但其他仍在运行的任务可能会“顺便”把狗喂了,从而掩盖了局部故障。
最佳实践:采用基于状态的喂狗策略。例如,设置一个“主程序心跳”变量,在主循环的关键节点更新这个变量。喂狗函数检查这个心跳是否正常推进,只有正常才执行喂狗。这能确保所有关键任务都健康。
看门狗复位时间设置过长
场景:看门狗超时时间设置为好几秒。但系统可能因为一个bug在几百毫秒内就进入了“卡死但又能响应中断”的状态。在这种情况下,用户会感觉到系统已经失灵(比如屏幕冻结、无响应),但要等好几秒后系统才会复位。
最佳实践:根据系统关键任务的执行周期,设置一个合理的、尽可能短的看门狗超时时间。

3. 外部硬件故障
复位引脚故障:看门狗触发后,是通过产生一个系统复位信号来重启MCU的。如果MCU的复位引脚(NRST)对VDD短路或被外部电路拉死,就无法实现有效的低电平复位,导致系统“复不了位”。
程序跑飞至Flash禁区:在某些极端情况下,如果程序指针跑飞到了Flash的非法地址或受保护的区域,并触发了硬件错误(如HardFault),而HardFault中断服务程序里也进行了喂狗操作,那么系统就会卡在HardFault里,看门狗同样不会复位。
4. 配置和初始化问题(配置性失效)
从未启动看门狗:代码中虽然有看门狗的初始化代码,但由于条件编译、某些初始化失败或程序流程错误,导致 IWDG_Start() 或类似的启动函数从未被执行。
窗口看门狗配置不当:对于窗口看门狗,如果你在“禁区”(窗口开启前)或“太晚”(窗口关闭后)喂狗,都会立即触发复位。如果计算错了窗口时间,可能导致正常的程序也频繁被复位。
5. 低功耗模式下的特殊处理
进入不恰当的低功耗模式:如果系统进入了某个停止或待机模式的低功耗状态,此时独立看门狗的时钟可能会被关闭,导致看门狗暂停工作。在这种情况下,系统“睡死”过去后,看门狗也无法将其唤醒或复位。
解决方案:在进入低功耗模式前,务必查阅数据手册,确认该模式下看门狗是否仍然工作。如果需要看门狗在睡眠时起保护作用,应选择能保持其工作的低功耗模式,或者使用具有独立时钟的看门狗。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

195

主题

1680

帖子

23

粉丝
快速回复 在线客服 返回列表 返回顶部