当前位置: 首页 > java >正文

STM32中,如何理解看门狗

在STM32微控制器中,看门狗(Watchdog)是一种硬件计时器,用于监控系统运行状态,防止软件死锁或跑飞。其核心机制是:系统需定期“喂狗”(复位看门狗计数器),若未及时喂狗,则触发系统复位,使程序恢复至初始状态。


看门狗类型及特点

STM32提供两种看门狗,各有适用场景:

1. 独立看门狗(IWDG)
  • 时钟源:独立内部低速时钟(LSI,~32-40kHz),不受主时钟影响(即使主时钟故障仍有效)。

  • 特点

    • 配置后无法停止(只能通过复位关闭)。

    • 超时时间范围宽(毫秒到秒级)。

    • 适合监控严重故障(如程序跑飞、死循环)。

  • 工作流程

初始化 → 启动计数器 → 定期喂狗(复位计数器)→ 若超时未喂狗 → 触发系统复位
2. 窗口看门狗(WWDG)
  • 时钟源:APB1总线时钟(PCLK1)分频。

  • 特点

    • 必须在指定时间窗口内喂狗(既不能过早也不能过晚)。

    • 提供提前唤醒中断(EWI),允许在复位前执行紧急操作。

    • 适合监控代码执行时效性(如任务调度超时)。

  • 工作流程

初始化 → 启动计数器 → 在窗口期内喂狗 → 若喂狗过早/过晚 → 触发复位

关键概念详解

超时时间计算
  • IWDG公式

    示例(LSI=40kHz,预分频=32,RLR=1000):
    Ttimeout=100040000×32=0.8秒Ttimeout​=400001000​×32=0.8秒

  • WWDG公式

喂狗操作
  • IWDG喂狗:向键寄存器(IWDG_KR)写入0xAAAA

  • WWDG喂狗:向控制寄存器(WWDG_CR)写入值(需在0x40~0x7F之间)。


配置步骤(以IWDG为例,HAL库)

#include "stm32f1xx_hal.h"IWDG_HandleTypeDef hiwdg;void IWDG_Init(void) {hiwdg.Instance = IWDG;hiwdg.Init.Prescaler = IWDG_PRESCALER_32;  // 预分频系数hiwdg.Init.Reload    = 1000;               // 重载值(超时时间)HAL_IWDG_Init(&hiwdg);                     // 初始化HAL_IWDG_Start(&hiwdg);                    // 启动看门狗
}void main(void) {IWDG_Init();while (1) {// ... 正常代码 ...HAL_IWDG_Refresh(&hiwdg);  // 定期喂狗(需在超时前执行)}
}

使用注意事项

  1. 喂狗位置

    • 放在主循环或关键任务中,避免在阻塞函数中饿死看门狗

    • 若使用RTOS,可在空闲任务中喂狗(但需确保任务调度正常)。

  2. 调试影响

    • 调试时暂停MCU会导致看门狗复位,可通过DBGMCU模块临时冻结看门狗。

  3. 窗口看门狗窗口期

    • 窗口上限由WWDG_CFR寄存器设定,喂狗需在[窗口值, 0x3F]之间。


应用场景对比

场景推荐看门狗原因
高可靠性系统(工业控制)IWDG独立时钟,抗干扰能力强
实时任务监控WWDG精确时间窗口,可捕获逻辑错误
低功耗应用IWDGLSI功耗低于主时钟

通过合理配置看门狗,可显著提升STM32系统的抗故障能力,确保设备在异常状态下自动恢复。

http://www.xdnf.cn/news/9835.html

相关文章:

  • WebSocket与实时对话式AI服务的集成
  • MySQL ALTER TABLE 组合操作时导致的错误
  • GPU 图形计算综述 (二):固定管线
  • dto vo类为什么要序列化?
  • 相量法正弦稳态电路的分析(面向题目)
  • 从汇编的角度揭秘C++函数重载,原来这么简单
  • 【最小生成树】Prim 算法、Kruskal 算法
  • 基于vue框架的独居老人上门护理小程序的设计r322q(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 42道CSS高频题整理(附答案背诵版)
  • Java AQS(Abstract Queued Synchronized)深度解析
  • MyBatisPlus(2):常用注解
  • 【MATLAB例程】基于脉冲雷达的TDOA目标定位,适用于四个锚点、三维空间的环境,附代码下载链接
  • 亚远景-ASPICE与ISO 26262:适用范围与应用场景的差异分析
  • 国产化redis 替代产品tendis 安装
  • 1Panel v2 首发体验(alpha)
  • Ubuntu 24.04 LTS Chrome 中文输入法(搜狗等)失效?一行命令解决
  • 项目管理进阶:精读78页 IPD+CMMI+Scrum一体化研发管理解决方案【附全文阅读】
  • 初学python的我开始Leetcode题10-1
  • 递归与递推算法详解(C++版)教案——以斐波那契数列为例
  • MySQL高可用革命:Orchestrator实现零干预的故障转移与智能拓扑管理
  • 自动驾驶与智能交通:构建未来出行的智能引擎
  • LangFuse:开源LLM工程平台的革新实践
  • SpringBoot使用ThreadLocal保存登录用户信息
  • 搭建frp内网穿透
  • 每日c/c++题 备战蓝桥杯(洛谷P1481 魔族密码 题解)
  • MySQL索引:原理、类型与使用指南
  • 高速收发器
  • 67常用控件_QTreeWidget的使用
  • 多部手机连接同一wifi的ip一样吗?如何更改ip
  • SQL的查询优化