STM32 看门狗彻底搞懂:硬件狗 vs 软件狗,区别、场景与实战代码
做嵌入式开发的同学几乎都逃不开「看门狗」这个话题。设备现场跑飞、程序死锁、任务卡死无人值守的时候总不能天天派人去按复位键。看门狗就是解决这类问题的核心方案但很多新手一直搞不清硬件看门狗和软件看门狗到底有什么区别分别用在什么场景能不能一起用本文结合真实业务场景和可直接复用的代码一次性讲透。一、硬件看门狗芯片自带的最后一道安全防线1. 到底是什么硬件看门狗是MCU 芯片内部集成的硬件外设最典型的就是 STM32 的 IWDG独立看门狗。 它最大的特点是自带独立的内部低速 RC 时钟完全不依赖 CPU 主系统时钟。哪怕 CPU 内核彻底卡死、主时钟停振看门狗的计数器依然在自己跑。2. 工作原理初始化时设定一个超时时间比如 1 秒看门狗的计数器从初始值开始递减程序正常运行时必须在超时到期之前主动「喂狗」重装载计数器值让计数器重新开始计数一旦程序卡死、死循环、跑飞无法按时喂狗计数器减到 0硬件会直接触发整个 MCU 复位让设备强制重启恢复。3. 实战代码STM32 独立看门狗#include stm32f10x_iwdg.h /** * brief 初始化独立看门狗 * param prer: 预分频系数 * param rlr: 重装载值 * note 示例IWDG_Init(IWDG_Prescaler_64, 625) → 溢出时间约1秒 */ void IWDG_Init(uint8_t prer, uint16_t rlr) { IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); // 开启寄存器写权限 IWDG_SetPrescaler(prer); // 设置预分频值 IWDG_SetReload(rlr); // 设置重装载值 IWDG_ReloadCounter(); // 首次喂狗重装计数器 IWDG_Enable(); // 使能独立看门狗 } /** * brief 喂狗重装载计数器防止溢出复位 */ void IWDG_Feed(void) { IWDG_ReloadCounter(); } int main(void) { // 系统时钟、外设初始化... IWDG_Init(IWDG_Prescaler_64, 625); while(1) { user_main_loop(); // 业务主循环 IWDG_Feed(); // 每次循环正常结束就喂狗 } }4. 典型应用场景户外温湿度采集节点、简单工业传感器、小家电控制器这类裸机单任务设备。功能逻辑简单不需要精确定位故障核心诉求是「卡死了能自己重启继续干活」纯硬件兜底几乎不占用 CPU 资源。二、软件看门狗多任务系统的精细监控器1. 到底是什么软件看门狗不是硬件外设是完全用代码 / 线程 / 定时器实现的逻辑监控机制。它基于系统时钟和线程调度用来精准监控单个任务、单个模块是否正常运行。2. 工作原理给每一个需要监控的业务线程设置一个「心跳计数器」和对应的超时时间业务线程正常运行时会定时给自己的心跳计数器刷新数值相当于「喂软狗」专门的监控线程 / 定时器定期巡检所有心跳计数器如果某个计数器超过设定时间没刷新就判定对应的线程死锁 / 卡死触发后可以自定义处理逻辑打印错误日志、保存故障现场、重启对应线程极端情况再触发系统复位。3. 实战代码RT-Thread 线程级软件看门狗#include rtthread.h #define TASK_NUM 2 // 监控的任务数量 #define HEARTBEAT_TIMEOUT 3 // 超时时间秒 // 心跳结构体每个任务对应一个 typedef struct { rt_uint32_t heartbeat; rt_uint8_t is_valid; const char* task_name; } wdt_soft_t; static wdt_soft_t soft_wdt[TASK_NUM]; /** * brief 任务上报心跳喂软狗 * param task_id: 任务ID */ void soft_wdt_feed(uint8_t task_id) { if(task_id TASK_NUM) return; soft_wdt[task_id].heartbeat rt_tick_get(); } /** * brief 监控线程每秒巡检一次所有任务心跳 */ static void wdt_monitor_thread(void *parameter) { while(1) { rt_thread_mdelay(1000); for(uint8_t i 0; i TASK_NUM; i) { if(!soft_wdt[i].is_valid) continue; // 计算超时 rt_tick_t delta rt_tick_get() - soft_wdt[i].heartbeat; if(delta HEARTBEAT_TIMEOUT * RT_TICK_PER_SECOND) { rt_kprintf([WARN] 任务%s超时卡死\n, soft_wdt[i].task_name); // 自定义处理打印日志、保存现场、尝试重启线程 // 极端情况调用NVIC_SystemReset()触发硬件复位 } } } } // -------------- 业务线程示例 -------------- // 运动识别线程 void motion_task(void *arg) { soft_wdt[0].task_name motion_task; soft_wdt[0].is_valid 1; while(1) { motion_detect_process(); // 运动识别业务逻辑 soft_wdt_feed(0); // 正常跑完一轮就喂狗 rt_thread_mdelay(10); } } // 蓝牙通信线程 void ble_task(void *arg) { soft_wdt[1].task_name ble_task; soft_wdt[1].is_valid 1; while(1) { ble_data_process(); // 蓝牙数据处理 soft_wdt_feed(1); // 正常跑完一轮就喂狗 rt_thread_mdelay(20); } }4. 典型应用场景智能手表、智能家居、工业控制器这类带操作系统的多任务设备。系统线程多不能因为一个功能卡死就整个设备复位需要精确定位哪个模块出了问题保留故障日志优先尝试恢复线程不直接重启整机提升用户体验。三、一张表看懂核心区别表格对比维度硬件看门狗硬狗软件看门狗软狗实现本质MCU 内置硬件外设代码 / 线程实现的逻辑时钟依赖独立内部 RC 时钟与主时钟无关依赖系统主时钟和线程调度复位能力CPU 彻底死机也能触发硬件复位CPU 全卡死时自身也失效只能触发软件逻辑检测粒度只能检测整个系统是否存活可精确到单个线程、单个模块处理方式只有复位一种动作可自定义打日志、存现场、重启线程、复位资源占用几乎不占用 CPU 资源需要占用线程、定时器资源定位系统最后一道安全兜底日常业务监控、故障定位四、企业级真实用法双看门狗组合架构真正的商用设备比如智能穿戴、车载设备从来不是二选一而是两者搭配使用软件看门狗在前监控每个业务线程出问题先打日志、尝试重启线程尽量不复位整机保证用户体验硬件看门狗在后做最终兜底。如果软件看门狗都失效了整个系统内核卡死、调度崩溃硬狗超时触发硬件复位保证设备最终能自己恢复。举个智能手表的真实例子运动识别线程死锁 → 软狗先检测到打印异常日志重启运动线程用户完全感知不到内核崩溃、整个系统调度挂死 → 软狗也跑不动了1 秒后 IWDG 硬狗触发复位手表重启恢复。五、新手常见误区有硬狗就够了不用软狗错。多任务系统里一个线程卡死就整机复位用户体验极差而且硬狗没法告诉你哪里出了问题排查故障全靠猜。软狗能替代硬狗错。如果整个系统彻底卡死、总线故障、主时钟停振软件看门狗自己也跑不起来必须靠硬狗做最终兜底。喂狗放在主循环末尾就万事大吉错。如果主循环里某个函数阻塞很久但最终还是返回了喂狗依然会执行硬狗检测不出来。这种场景必须靠软狗做细粒度监控。六、总结硬件看门狗是底线负责极端情况下的整机复位保证设备不死机软件看门狗是精细化管理负责单任务监控、故障定位提升系统稳定性和可维护性真正的工业级、消费级设备都是软硬结合双看门狗架构。如果觉得文章对你有帮助欢迎点赞收藏有不同观点也欢迎评论区交流。

相关新闻

大学生编程语言学习

大学生编程语言学习

我是一名虚拟现实技术专业的学生,网上说这个专业很难学,所以我打算从最基础的C语言开始,然后再深入。那我要如何学习编程?1 努力练习编程语言,遇到难题,想方设法去解决,问AI,问老师2…

2026/10/12 3:59:24 阅读更多 →
选题毫无头绪?师姐安利这几个AI论文写作软件

选题毫无头绪?师姐安利这几个AI论文写作软件

写论文总感觉无从下手?选题没方向、框架不清晰、内容不充实,是很多同学的共同困扰。其实,只要用对 AI 工具、走对写作流程,就能大幅提升效率——不少资深教授都建议学生提前尝试智能辅助工具。目前市面上有几款热门论文写作软件值…

2026/10/12 3:59:24 阅读更多 →
多终端CRM源码部署与二次开发实战:从环境搭建到上线避坑

多终端CRM源码部署与二次开发实战:从环境搭建到上线避坑

1. 先弄懂这份源码包的“多终端”是怎么实现的做系统选型或者拿到一套源码包准备部署之前,我最怕的就是开发者和老板对“多终端”这三个字的理解不一致。你以为的可能是三套独立代码、三个独立的系统分别维护,而实际上源码包里要实现的多终端&#xff0c…

2026/10/12 3:59:24 阅读更多 →

最新新闻

Tortoise-ORM 与 Sanic 集成实战:register_tortoise 生命周期管理全解析

Tortoise-ORM 与 Sanic 集成实战:register_tortoise 生命周期管理全解析

数据库后端 【免费下载链接】tortoise-orm Familiar asyncio ORM for python, built with relations in mind 项目地址: https://gitcode.com/gh_mirrors/to/tortoise-orm 点击查看 免费下载 本文以 Tortoise-ORM 仓库中 Sanic 集成示例 为主线,系统讲解…

2026/10/12 6:02:32 阅读更多 →
从ABP到Clean DDD:中后台系统架构迁移实践与反思

从ABP到Clean DDD:中后台系统架构迁移实践与反思

做中后台和SaaS类系统的团队,大概率都绕不开 ABP 这个名字。它把模块化、仓储模式、工作单元、动态 API、审计日志、多租户这些东西一次性打包成开箱即用的起点,用 .NET 技术栈做内部系统,几乎第一天就能跑起来。我所在的团队也是这样起步的&…

2026/10/12 6:02:32 阅读更多 →
STM32 | CLion + ST-Link下载调试完整流程

STM32 | CLion + ST-Link下载调试完整流程

一、下载程序 先创建一个文件夹: 命名:stlink.cfg 写入以下代码: # choose st-link/j-link/dap-link etc. #adapter driver cmsis-dap #transport select swdsource [find interface/stlink.cfg]transport select hla_swdsource [find target/stm32f4x.…

2026/10/12 6:02:32 阅读更多 →
Python代码打包成exe文件详解

Python代码打包成exe文件详解

一、pyhon代码打包成exe文件1-1:安装打包工具在PyCharm底部的 终端(Terminal) 里输入:pip install pyinstaller1-2:输入打包命令在同一个终端里输入(直接复制):pyinstaller --onefile --noconsole --hidden…

2026/10/12 6:02:32 阅读更多 →
知识工作插件化:从信息捕获到配置同步的效率体系

知识工作插件化:从信息捕获到配置同步的效率体系

平时做知识工作,最耗时间的往往不是思考本身,而是信息的搬运。你从网页摘一段话,粘贴进笔记里,格式全乱;你复制了一段关键论述,过了几天想找来源,翻遍聊天记录和文档都找不到;你给十…

2026/10/12 6:02:32 阅读更多 →
DJL与Spring集成:Java后端部署深度学习模型的实践指南

DJL与Spring集成:Java后端部署深度学习模型的实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 6:01:32 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →