☰
【嵌入式外设精学】Day18|看门狗:为什么能救死机、该在哪喂
2026/10/5 5:08:27 网站建设 项目流程

【嵌入式外设精学】Day18|看门狗:为什么能救死机、该在哪喂

今天解决:程序卡住为何能自动复位?为什么不能在滴答里无脑喂?


目录

  1. 问题 2. 原理 3. 代码 4. 误区 5. 自测 6. 答案

1. 问题

  • 死循环后整机假活,遥控也没反应
  • 开了看门狗仍然“卡死不复位”

2. 原理

2.1 看门狗本质

独立的“倒计时”:

一直倒数 → 你必须在归零前“喂狗” 没喂到 → 硬件复位

2.2 喂狗位置决定它保护什么

在哪喂保护效果
SysTick/滴答里一直喂主循环死了也可能不复位(滴答还活着)
所有关键任务都正常时才喂主逻辑挂了才会复位

推荐:任务 A、B、C 都更新“新鲜时间戳”,都在允许窗口内才reload。

2.3 窗口型

有的看门狗还要求“不能喂太早”,用来抓“跑太快/节奏乱”。

2.4 调试期

调试器单步时容易误复位,可临时关掉;发布前再打开并测复位路径。


3. 代码示例

#include"stm32f4xx.h"#include<stdbool.h>#include<stdint.h>voidwdt_init(uint32_treload){IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);IWDG_SetPrescaler(IWDG_Prescaler_64);IWDG_SetReload(reload);/* 按 LSI 与预分频算超时,查手册 */IWDG_ReloadCounter();IWDG_Enable();}voidwdt_feed(void){IWDG_ReloadCounter();}typedefstruct{uint32_tt0_ms,t1_ms,now_ms;uint32_twindow_ms;}health_t;boolsys_healthy(consthealth_t*h){return(h->now_ms-h->t0_ms<h->window_ms)&&(h->now_ms-h->t1_ms<h->window_ms);}voidmain_loop_step(consthealth_t*h){/* ... 各任务更新 t0/t1 ... */if(sys_healthy(h)){wdt_feed();}}

4. 常见误区

误区正解
中断里无脑喂掩盖主逻辑挂死
超时设得很短初始化没跑完就复位
看门狗打开就万事大吉喂错地方等于没开
调试不测复位上线后难查

5. 自测

  1. 为什么不在滴答里喂狗?
  2. 双任务都要活,怎么喂?

6. 答案

  1. 主循环死了滴答仍在喂,系统假活不复位。
  2. 两个任务的“健康戳”都在窗口内才喂。

作者:shuifanyu
标签:看门狗复位可靠性

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询