2026/2/14 20:32:29
网站建设
项目流程
网站建设中 敬请期待,零代码建站,最大的房产网站排名,厦门网站推广¥做下拉去118cr只要是软件#xff0c;就一定有 Bug。 只要是电子设备#xff0c;就一定会被强电磁干扰打挂#xff08;比如 PC 指针跑飞#xff0c;跳到了空地址死循环#xff09;。当 CPU “发疯”的时候#xff0c;谁来按下复位键#xff1f; 这就是今天我们要讲的主角——看门狗。这…只要是软件就一定有 Bug。 只要是电子设备就一定会被强电磁干扰打挂比如 PC 指针跑飞跳到了空地址死循环。当 CPU “发疯”的时候谁来按下复位键 这就是今天我们要讲的主角——看门狗。这看起来是一个很简单的外设但可能很多的工程师都用错了。为什么在中断里“喂狗”等于没喂看门狗Watchdog Timer, WDT本质上是一个独立的倒计时计数器。规则假如你设定了 1000ms 的超时。如果你的程序没有在 1000ms 内向它写入特定数值喂狗/Reload它就会归零并触发MCU 硬件复位。听起来很简单那我们一起来看看用法。1. 独立看门狗 (IWDG) vs 窗口看门狗 (WWDG)STM32以及大多数现代 MCU通常配备了两只狗。它们的性格完全不同。1.1 独立看门狗 (IWDG - Independent Watchdog)时钟源LSI (Low-Speed Internal)内部低速时钟通常 32kHz 或 40kHz。特点独立即使 MCU 的主晶振HSE坏了或者 PLL 锁相环挂了导致系统主时钟停摆IWDG 依然能独立工作把系统复位。精度低LSI 的温漂很大30kHz ~ 60kHz 都有可能所以 IWDG 适合做“大尺度”的监测比如 1秒、5秒。用途防止程序跑飞、死循环、硬件晶振故障。1.2 窗口看门狗 (WWDG - Window Watchdog)时钟源APB (PCLK)系统总线时钟分频。特点窗口机制这是它名字的由来。它不仅规定了“不能太晚喂”超时复位还规定了“不能太早喂”精度高跟随系统时钟非常精准。用途监测程序执行流程是否过快跳过逻辑或过慢。通常用于安规要求极高的场合如汽车 ABS、医疗设备。2. 致命误区千万不要在定时器中断里喂狗这是新手最容易犯的错误“我看门狗设定了 1s 超时。为了省事我在 SysTick 的 1ms 中断里或者一个专门的 100ms 定时器中断里写了一句HAL_IWDG_Refresh()。”为什么这是错的场景你的main()函数里有一个while(Flag 0);等待逻辑。有一天传感器坏了Flag 永远为 0主程序死锁在这里了。现象虽然主程序死了但中断Interrupt依然能响应定时器依然在欢快地跑每 100ms 喂一次狗。结果看门狗觉得“我很饱系统很正常”系统实际上已经变成了植物人永远不会复位。专家法则只允许在主循环Main Loop或低优先级的任务中喂狗。只有当“大脑”清醒时才能去喂狗。3. 高阶策略多任务系统的“逻辑看门狗”如果你的系统里有 3 个任务显示任务、电机任务、通信任务。 如果你只在main循环的末尾喂狗可能会出现电机任务死锁了但显示任务还活着主循环还在跑狗被喂了电机却烧了。我们需要设计一种**“任务签到”**机制。实战代码 (Task Monitor)// 定义任务标志位 #define TASK_FLAG_DISPLAY (1 0) #define TASK_FLAG_MOTOR (1 1) #define TASK_FLAG_COMMS (1 2) #define TASK_ALL_ALIVE (0x07) // 111 static uint8_t g_TaskSignaled 0; // 1. 各个任务定期汇报 我还活着 void Display_Task(void) { // ... 业务逻辑 ... g_TaskSignaled | TASK_FLAG_DISPLAY; } void Motor_Task(void) { // ... 业务逻辑 ... g_TaskSignaled | TASK_FLAG_MOTOR; } void Comms_Task(void) { // ... 业务逻辑 ... g_TaskSignaled | TASK_FLAG_COMMS; } // 2. 主循环统一检查 void Main_Loop(void) { while(1) { Display_Task(); Motor_Task(); Comms_Task(); // 核心逻辑只有所有人都签到了才喂狗 if (g_TaskSignaled TASK_ALL_ALIVE) { HAL_IWDG_Refresh(hiwdg); g_TaskSignaled 0; // 清空标志等待下一轮 } else { // 如果某人没签到这里不喂狗。 // 几个周期后IWDG 溢出系统复位。 } } }如果是 RTOS 系统可以建立一个低优先级的“看门狗守护任务 (Daemon Task)”去监视所有其他任务的事件标志组。4. WWDG 的正确打开方式防跳过WWDG 的“不可太早喂”有什么用 假设你有关键的安全逻辑void Safety_Check(void) { Step1_Check_Voltage(); // 耗时 2ms Step2_Check_Temp(); // 耗时 2ms Step3_Check_Speed(); // 耗时 2ms // 总耗时 6ms // WWDG 窗口设定必须在 5ms ~ 10ms 之间喂狗 Feed_WWDG(); }故障场景PC 指针因为干扰直接跳过了 Step1 和 Step2直接执行了Feed_WWDG()。结果此时只过了 0ms。WWDG 发现你喂得太早了判定为逻辑异常立即复位系统。结论IWDG 防死锁太慢WWDG 防跑飞太快。5. 最后的挣扎复位前能保存现场吗看门狗复位是瞬间发生的就像断电一样。 我们能不能知道“我是被看门狗复位的”甚至知道“死在哪里”复位源寄存器 (RCC_CSR):系统启动后的第一件事检查RCC-CSR寄存器。如果IWDGRSTF置位说明是看门狗咬死的。如果PINRSTF置位说明是被人按了复位键。专家技巧记录这个标志到 EEPROM统计设备的“非正常死亡率”。死前遗言 (难):WWDG 通常有一个“早期唤醒中断 (Early Wakeup Interrupt, EWI)”。 在计数器减到 0x40马上要复位之前会先触发一个中断。你可以在这个最高优先级的中断里把关键寄存器保存到 Flash 或 备份寄存器中作为“黑匣子”数据。总结本章看门狗不是“开了就行”的配置项它是系统稳定性的基石。IWDG:用来救命死机复位。必须在主循环或逻辑末端喂严禁在定时器中断喂。WWDG:用来体检流程监控。适合安规场景。多任务策略:使用“签到制”缺一不可。