第一章:看门狗概述

各位同学,咱们今天聊聊看门狗。别误会,不是你家楼下那条汪汪叫的宠物狗,而是嵌入式系统里一个特别重要的角色——看门狗定时器(Watchdog Timer,简称WDT)。

我刚开始做嵌入式开发那会儿,总觉得看门狗是个可有可无的东西。直到有一次,我做的智能家居控制板在客户现场跑着跑着就死机了,用户得拔电源重启……那叫一个尴尬。从那以后,我对看门狗的态度就彻底变了。

什么是看门狗?

看门狗,说白了就是一个硬件定时器。它的工作逻辑特别简单:

  • 启动后开始倒计时
  • 倒计时结束前,程序必须去“喂狗”(重置定时器)
  • 如果没及时喂狗,系统就认为出问题了,自动复位重启

嗯,就这么简单。但你别小看这个机制,它在嵌入式系统里可是保命的最后一道防线。

核心要点:看门狗不是用来防止出错的,而是用来在出错后让系统自己恢复的。

看门狗在嵌入式系统中的作用

嵌入式系统不像你的台式机,死机了按个重启键就行。很多设备装在产品里、埋在地下、甚至飞到天上,根本没人去手动复位。这时候看门狗就派上用场了。

我总结了一下,看门狗主要干这几件事:

  1. 检测死机——程序跑飞了、卡在死循环了,看门狗能发现
  2. 自动复位——发现问题后强制重启,让系统恢复正常
  3. 提高可靠性——尤其是7×24小时不间断运行的设备,看门狗是标配

你想想看,一个智能手表戴在手腕上,突然死机了,用户还得找根针去捅复位孔?那画面太美我不敢看。所以看门狗在可穿戴设备里几乎是必须的。

我的经验:在项目中,我习惯把看门狗的超时时间设为主循环周期的2-3倍。太短容易误触发,太长又起不到保护作用。这个平衡点需要根据实际场景去调。

为什么智能手表需要看门狗?

智能手表和普通嵌入式设备不太一样。它有几个特点,让看门狗变得特别重要:

特点 带来的问题 看门狗的作用
资源受限 CPU、内存都很有限,容易出bug 程序崩溃后自动恢复
多任务并发 传感器、蓝牙、显示同时跑,容易冲突 任务卡死时强制复位
低功耗要求 频繁休眠唤醒,状态切换容易出错 休眠异常时兜底恢复
用户不可干预 戴在手上,没法手动重启 自动完成复位操作

我记得有一次做智能手表的原型机,蓝牙驱动有个bug,偶尔会卡死在连接状态。如果没有看门狗,用户就得眼睁睁看着手表黑屏。加了看门狗之后,最多等几秒钟,手表自己就重启了,用户体验好很多。

注意:看门狗不是万能的。它解决的是“程序跑飞”这类问题,解决不了硬件损坏、电源不稳这些硬伤。我曾经遇到过看门狗频繁复位,查了半天发现是电源纹波太大导致的——这种情况看门狗反而掩盖了真正的问题。

看门狗的工作原理(简单版)

咱们用一段伪代码来理解看门狗的工作流程:

// 看门狗初始化
void watchdog_init() {
    // 设置超时时间为5秒
    set_timeout(5000);
    // 启动看门狗
    watchdog_enable();
}

// 主循环
void main_loop() {
    while(1) {
        // 处理传感器数据
        read_sensors();
        // 更新屏幕显示
        update_display();
        // 处理蓝牙通信
        handle_bluetooth();
        
        // 喂狗!告诉看门狗:我还活着
        watchdog_feed();
        
        // 进入低功耗模式
        enter_sleep_mode();
    }
}

你看,代码逻辑特别清晰。每次主循环跑完一圈,就去喂一次狗。如果某次循环卡住了,喂狗函数没被执行,看门狗就会在5秒后触发复位。

避坑指南:我曾经犯过一个错误——在中断服务函数里喂狗。结果主循环卡死了,中断还能正常触发,看门狗一直被喂着,系统死活不重启。后来排查了好久才发现这个问题。记住:喂狗一定要在主循环的关键路径上,别放在中断里。

看门狗的类型

市面上常见的看门狗有两种:

  • 内部看门狗——集成在MCU内部,不需要额外硬件,但精度一般
  • 外部看门狗——独立的芯片,精度高、更可靠,但增加成本和PCB面积

智能手表这种对体积和成本敏感的设备,通常用内部看门狗就够了。但如果是医疗设备、工业控制这类对可靠性要求极高的场景,我建议还是加一个外部看门狗,双重保险。

好了,这一章咱们把看门狗的基本概念讲清楚了。下一章我会带大家深入看门狗的寄存器配置,手把手教你怎么在STM32上把看门狗跑起来。到时候咱们再聊具体的实现细节。

本章小结:

  • 看门狗是一个硬件定时器,用于检测和恢复系统故障
  • 它的核心机制是“喂狗”——定期重置定时器
  • 智能手表因为资源受限、多任务、低功耗等特点,特别需要看门狗
  • 喂狗的位置很关键,别放在中断里