STM32-- 看门狗--介绍、使用场景、失效场景

STM32 中的看门狗(Watchdog Timer,简称 WDG)有两种主要类型:独立看门狗(IWDG)窗口看门狗(WWDG)。它们的喂狗机制各有特点,主要区别如下:


1. 独立看门狗(IWDG)

喂狗模式:常规定时喂狗
  • 喂狗方式: 调用 IWDG_ReloadCounter() 函数,在任何时刻都可以重装载计数器,从而避免超时复位。

  • 超时机制: 如果计数器倒计时到 0 且没有及时喂狗,系统会复位。

  • 特点

    • 喂狗没有时间窗口限制,只要在超时时间之前喂狗即可。
    • 内部低速时钟(LSI,约 32kHz) 提供时钟,不依赖主系统时钟。
    • 无法被软件或调试工具停止,一旦启用只能通过硬件复位重启。
优点
  • 配置简单,适用于通用场景。
  • 独立于主系统时钟(HCLK),可靠性高。
缺点
  • 无法防止程序在特定时间段反复喂狗(如错误逻辑进入喂狗环)。

2. 窗口看门狗(WWDG)

喂狗模式:窗口限制喂狗
  • 喂狗方式: 调用 WWDG_SetCounter() 函数时,喂狗必须在指定的时间窗口内完成。

    • 窗口时间是由 WWDG 的计数器和窗口寄存器共同决定的。
    • 如果喂狗太早(计数器值大于窗口值)或太晚(计数器倒计时到 0),系统会复位。
  • 超时机制

    • 必须在窗口时间内重装载计数器。
    • 超过窗口的时间范围(太早或太晚)都会导致复位。
  • 特点

    • 使用 APB1 时钟(PCLK1) 提供时钟源,依赖主系统时钟。
    • 可以通过调试工具暂停计数。
    • 可设置窗口值,要求喂狗在特定时间范围内完成,防止程序因逻辑错误频繁喂狗。
优点
  • 增强程序可靠性,防止错误逻辑无限循环喂狗。
  • 支持更精确的复位条件控制。
缺点
  • 配置稍复杂,需要合理选择窗口值和计数器初始值。
  • 依赖主系统时钟,可靠性略低于 IWDG。

两种模式的对比

特性独立看门狗(IWDG)窗口看门狗(WWDG)
时钟来源内部低速时钟(LSI,32kHz)APB1 时钟(PCLK1)
喂狗机制任何时间都可以喂狗必须在时间窗口内喂狗
配置复杂度简单较复杂
适用场景通用场景,保证基本的系统稳定性高可靠场景,防止逻辑错误频繁喂狗
可靠性更高略低,依赖主系统时钟
调试控制不可暂停支持暂停
可控性不限制喂狗时间支持细粒度时间窗口控制

选择建议

  1. 使用场景简单,侧重可靠性:选择 独立看门狗(IWDG)

    • 如在嵌入式系统中需要一个独立于系统时钟的简单复位保护机制。
  2. 高可靠性要求,需防止逻辑错误:选择 窗口看门狗(WWDG)

    • 如工业控制场景,程序卡死可能导致危险,需要精确控制喂狗行为。

代码示例

1. 独立看门狗喂狗
#include "stm32f10x_iwdg.h"

void IWDG_Init(void) {
    RCC_LSICmd(ENABLE); // 启用 LSI 时钟
    while (!RCC_GetFlagStatus(RCC_FLAG_LSIRDY)); // 等待 LSI 就绪

    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); // 使能配置
    IWDG_SetPrescaler(IWDG_Prescaler_64);        // 设置预分频器为 64
    IWDG_SetReload(625);                         // 设置重装载值(1 秒超时)
    IWDG_ReloadCounter();                        // 加载值到计数器
    IWDG_Enable();                               // 启动 IWDG
}

void Feed_Dog(void) {
    IWDG_ReloadCounter(); // 喂狗
}

/*上下两种初始化和使用,没有关系*********************/

//在main函数中的使用初始化看门狗,不同库函数,初始化函数不一样
// 启用 LSI 时钟,看门狗要用
    RCC_LSICmd(ENABLE);
    while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET); // 等待 LSI 就绪
    // 配置 IWDG,超时时间为 1 秒
    IWDG_Config(IWDG_Prescaler_64, 625);
    printf("初始化初始化喂狗\n");


// 定时喂狗,防止复位,放在while循环里面
IWDG_ReloadCounter();
printf("喂狗\n");
2. 窗口看门狗喂狗
#include "stm32f10x_wwdg.h"

void WWDG_Init(void) {
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // 启用 WWDG 时钟

    WWDG_SetPrescaler(WWDG_Prescaler_8);       // 设置预分频器
    WWDG_SetWindowValue(80);                   // 设置窗口值(喂狗窗口)
    WWDG_Enable(100);                          // 启动 WWDG 并设置计数器值
}

void Feed_Dog(void) {
    WWDG_SetCounter(100); // 喂狗(需在窗口时间内)
}


还没有使用过,用的时候再说

通过对比,可以根据实际场景选择合适的看门狗类型并合理设置喂狗机制。

看门狗使用场景

在嵌入式系统中,看门狗的主要目的是检测系统异常并自动复位,保障系统的稳定运行。以下是常见需要喂狗的场景:


1. 系统可能出现死循环或卡死的场景

  • 现象
    • 系统因软件错误、逻辑陷阱或资源争用导致无限循环或停止响应。
  • 应用
    • 工业自动化控制(PLC 等)。
    • 智能家居设备(如网关、传感器)。
    • 通信设备(如路由器、交换机)。
  • 原因: 看门狗可以在系统卡死时触发复位,避免长时间停机。

2. 系统存在较高可靠性要求的场景

  • 现象
    • 嵌入式设备长时间无人值守,需要保持长期稳定运行。
  • 应用
    • 医疗设备(监护仪、输液泵)。
    • 交通设备(信号灯控制、车载 ECU)。
    • 军事和航空航天设备。
  • 原因: 使用看门狗复位系统,可提高容错能力和整体可靠性。

3. 外设数据采集或处理超时的场景

  • 现象
    • 数据采集模块长时间未能完成任务,可能导致整个系统响应缓慢或失效。
  • 应用
    • 数据采集终端(温度、压力传感器)。
    • 多任务实时系统(RTOS)。
  • 原因: 配合看门狗的定期复位机制,避免单个模块卡死影响整体系统。

4. 系统通信异常的场景

  • 现象
    • 外部设备或模块因通信中断而停止响应。
  • 应用
    • 网络设备(IoT 网关、通信模组)。
    • 智能设备(摄像头、机器人)。
  • 原因: 如果通信超时,看门狗可复位系统重新尝试连接。

5. 电磁干扰或外界环境影响较大的场景

  • 现象
    • 嵌入式设备可能受到环境干扰(电磁干扰、静电等),导致系统异常。
  • 应用
    • 工业环境(高压设备、变电站)。
    • 军用电子设备。
  • 原因: 看门狗可检测因环境干扰导致的系统失效并触发复位,恢复正常运行。

6. 软件升级或运行复杂任务的场景

  • 现象
    • 系统执行复杂的算法或升级任务时,可能发生资源争用或异常。
  • 应用
    • 在线升级固件的 IoT 设备。
    • 人工智能推理设备(如车载计算机)。
  • 原因: 看门狗可以监控长时间任务运行,避免任务因不可预测的问题导致系统停滞。

7. 用户无法频繁维护设备的场景

  • 现象
    • 设备分布在偏远或不便维护的位置。
  • 应用
    • 太阳能监控设备。
    • 海上浮标、地震监测设备。
    • 无人机、卫星等。
  • 原因: 看门狗自动复位功能降低了人工干预的频率,提升系统可用性。

8. 高安全性场景

  • 现象
    • 系统的异常可能带来严重后果(如数据丢失或生命危险)。
  • 应用
    • 银行 ATM 系统。
    • 医疗设备。
    • 车辆控制系统(自动驾驶)。
  • 原因: 看门狗能在意外时快速恢复系统,避免造成重大损失。

总结:典型需要喂狗的场景

场景主要原因示例应用
死循环或逻辑卡死防止程序因意外逻辑错误停滞工业设备、智能终端
高可靠性要求长期无人值守,需自我修复医疗设备、交通控制
数据采集或超时控制模块运行超时可能影响整个系统RTOS 系统、数据采集设备
通信异常网络或模块中断可能影响设备响应路由器、物联网设备
电磁干扰环境环境干扰可能引起系统故障工业控制、军事设备
复杂任务或软件升级防止任务中断导致系统不可恢复人工智能设备、在线升级
无法维护的设备减少人工维护频率,提高设备可靠性远程监控设备、无人机
高安全性需求确保关键设备在故障时快速恢复ATM 机、自动驾驶系统

在这些场景中,合理配置看门狗的超时时间和喂狗逻辑,可以有效提升系统的健壮性和可靠性。

看门狗失效的场景

理论上,看门狗是一种硬件模块,独立于主处理器运行,设计上可以在系统卡死时强制复位。但在某些特殊情况下,即使有看门狗,也可能无法复位。这种情况通常与硬件设计或系统架构有关。以下是可能的原因和解决方法:


1. 系统进入低功耗模式

  • 原因
    • 有些嵌入式设备在进入深度睡眠模式时,会关闭看门狗定时器。
    • 如果设备卡死在低功耗模式中,看门狗无法触发复位。
  • 解决方法
    • 确保看门狗模块在低功耗模式下仍保持工作(某些芯片支持此功能)。
    • 使用独立看门狗(如外部硬件看门狗),保证看门狗与主处理器的运行无关。

2. 系统总线或时钟停止工作

  • 原因
    • 系统因为严重错误(如总线死锁或时钟停止),导致看门狗依赖的时钟源失效。
  • 解决方法
    • 使用内部低速时钟(如独立的低速振荡器 LSI)驱动看门狗。
    • 确保时钟源具有高可靠性,并在设计中添加冗余机制。

3. 电源故障

  • 原因
    • 硬件因供电不足或瞬间断电,导致看门狗和主处理器均停止工作。
  • 解决方法
    • 添加稳压电路和电源监控芯片,确保系统供电稳定。
    • 使用外部看门狗模块,其独立供电可提升可靠性。

4. 看门狗配置或逻辑错误

  • 原因
    • 看门狗初始化错误或喂狗逻辑未正确实现,导致看门狗无法正常运行。
    • 误配置过长的超时时间,程序卡死后仍在喂狗。
  • 解决方法
    • 充分测试看门狗初始化和喂狗逻辑。
    • 使用合理的超时时间,避免因喂狗间隔过长或喂狗频率过高而失效。

5. 硬件设计缺陷

  • 原因
    • 某些硬件设计中,看门狗复位信号未正确连接或复位信号不起作用。
    • 外部硬件看门狗模块未正确实现逻辑复位。
  • 解决方法
    • 确保看门狗复位信号正确连接到处理器的复位引脚。
    • 测试硬件设计的复位功能是否正常。

6. 看门狗自身故障

  • 原因
    • 看门狗模块内部硬件故障,导致其无法工作。
    • 例如独立看门狗的振荡器损坏或芯片老化。
  • 解决方法
    • 定期检测和维护设备,确保硬件正常。
    • 使用多个看门狗模块(例如内部和外部看门狗结合)。

7. 看门狗复位后依旧死循环

  • 原因
    • 程序设计问题导致复位后重复进入死循环,触发看门狗再次复位。
  • 解决方法
    • 复位后执行硬件自检和初始化,避免问题反复发生。
    • 在看门狗超时后,将复位状态记录在非易失性存储器中,方便分析问题根源。

8. 极端硬件或环境问题

  • 原因
    • 硬件遭受极端环境干扰(如高强度电磁辐射、雷击)。
    • 存在硬件级别的设计缺陷或材料老化。
  • 解决方法
    • 提升设备抗干扰能力,例如添加屏蔽罩、滤波器。
    • 定期更新设备,避免使用超出寿命的硬件。

如何降低看门狗失效的可能性

  1. 设计冗余系统
    • 使用多个独立的看门狗模块,主从备份。
  2. 合理选择看门狗类型
    • 使用独立看门狗(如外部芯片)而非依赖于主处理器的内部看门狗。
  3. 测试看门狗功能
    • 定期在程序中模拟卡死场景,验证看门狗是否能正常复位。
  4. 使用外部复位电路
    • 配合电源管理芯片(如带复位功能的电源监控芯片),提供额外的复位保障。
  5. 做好复位后程序设计
    • 确保复位后系统能进入正常工作状态,避免重复复位。

总结

虽然看门狗是一种非常可靠的保护机制,但它并不是万能的。如果系统设计或硬件环境存在问题,看门狗也可能无法复位。通过合理设计、冗余机制和充分测试,可以最大程度地降低看门狗失效的风险。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/925230.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(0基础保姆教程)-JavaEE开课啦!--11课程(初识Spring MVC + Vue2.0 + Mybatis)-实验9

一、什么是Spring MVC? Spring MVC 是一个基于 Java 的 Web 框架,遵循 MVC 设计模式,用于构建企业级应用程序。它通过控制器(Controller)处理用户请求,模型(Model)处理业务逻辑,视图(View)展示数据,实现了请…

FCBP 认证考试要点摘要

理论知识 数据处理与分析:包括数据的收集、清洗、转换、存储等基础操作,以及数据分析方法,如描述性统计分析、相关性分析、数据挖掘算法等的理解和应用 。数据可视化:涉及图表类型的选择与应用,如柱状图、折线图、饼图…

「Qt Widget中文示例指南」如何为窗口实现流程布局?(二)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 本文将展示如何为不…

智能产品综合开发 - 手势识别

1 实训选题目的 本次实训选择的题目是“基于树莓派的手势识别系统”,旨在为人们提供一种便捷的交互方式,使用户能够通过手势控制智能设备,摆脱传统的物理按键操作。通过本项目,我们希望能实现快速、灵活的手势识别,提升…

Redis【1】- 如何阅读Redis 源码

1 Redis 的简介 Redis 实际上是简称,全称为 Remote Dictionary Server (远程字典服务器),由 Salvatore Sanfilippo 写的高性能 key-value 存储系统,其完全开源免费,遵守 BSD 协议。Redis 与其他 key-value 缓存产品(如…

git的使用(简洁版)

什么是 Git? Git 是一个分布式版本控制系统 (DVCS),用于跟踪文件的更改并协调多人之间的工作。它由 Linus Torvalds 在 2005 年创建,最初是为了管理 Linux 内核的开发。Git 的主要目标是提供高效、易用的版本控制工具,使得开发者…

用于高吞吐量和低延迟的 JVM 性能调优

Java 虚拟机 (JVM) 调优是调整默认参数以满足我们的应用程序需求的过程。这包括通过选择合适的垃圾回收器来使用优化版本的 getter 来调整堆的大小等简单调整。 了解 Java 虚拟机 (JVM) 什么是 JVM? Java 虚拟机 &…

django authentication 登录注册

文章目录 前言一、django配置二、后端实现1.新建app2.编写view3.配置路由 三、前端编写1、index.html2、register.html3、 login.html 总结 前言 之前,写了django制作简易登录系统,这次利用django内置的authentication功能实现注册、登录 提示&#xff…

Python+Pytest+Yaml+Allure数据参数化(DDT)数据驱动(一)

我们在做数据之前要知道几个问题 1、在代码层面怎么来数据驱动 2、yaml文件是什么 3、怎么用yaml文件实现对应的数据驱动 我们用的是pytest框架所以相对来说是简单的,我们通过pytest框架来实现,而框架中要数据驱动用到我们装饰器就好啦pytest.mark.p…

WaveForms™ SDK 参考手册(翻译笔记与总结)

概述 WaveForms 提供了一个接口,允许用户与 Digilent Analog Design 硬件进行交互,例如 Analog DiscoveryTM、Analog Discovery 2TM、Analog Discovery ProTM、Digital DiscoveryTM、Discovery Power SupplyTM 和 Electronics ExplorerTM。虽然 WaveForm…

Python基础学习-12匿名函数lambda和map、filter

目录 1、匿名函数: lambda 2、Lambda的参数类型 3、map、 filter 4、本节总结 1、匿名函数: lambda 1)语法: lambda arg1, arg2, …, argN : expression using arg 2) lambda是一个表达式,而不是一个语…

pyqt5+yolo模型+多线程

界面开发 开发主窗口界面 from PyQt5 import QtWidgets from PyQt5 import QtCore,QtGui import sysclass MainWindow(QtWidgets.QMainWindow):def __init__(self):super().__init__()self.initUI()self.toolbar()# 创建菜单栏def initUI(self):menubar self.menuBar()file_m…

交通流量预测:基于交通流量数据建立模型

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

[Java]微服务配置管理

介绍 代码拆分为微服务后, 每个服务都有自己的配置文件, 而这些配置文件中有很多重复的配置, 并且配置变化后需要重启服务, 才能生效, 这样就会影响开发体验和效率 配置管理服务可以帮助我们集中管理公共的配置, 并且nacos就可以实现配置管理服务 配置共享 我们可以把微服务共…

【C++】入门【三】

本节目标 一、类的6个默认成员函数 二、 构造函数 三、析构函数 四、拷贝构造函数 五、赋值运算符重载 六、const成员函数 七、取地址及const取地址操作符重载 一、类的6个默认成员函数 如果类里一个成员都没有,简称空类空类中真的什么都没有吗?并不不是…

D78【 python 接口自动化学习】- python基础之HTTP

day78 pycharm创建项目并进行接口请求 学习日期:20241124 学习目标:http定义及实战 -- pycharm创建项目并进行接口请求 学习笔记: 安装requests 安装方式:pip/pip3 install requests 官网教程:Requests: HTTP fo…

UE5 实现组合键触发事件的方法

因为工作原因。 需要用大括号{和}来触发事件 但是在蓝图中搜了一下,发现键盘事件里根本就没有{}这两个键。 花费了一下午,终于找到解决的方法了,也就是增强输入的弦操作 首先创建一个项目 纯蓝图或者C都可行 进入到内容浏览器的默认页面 …

rabbitmq原理及命令

目录 一、RabbitMQ原理1、交换机(Exchange)fanoutdirecttopicheaders(很少用到) 2、队列Queue3、Virtual Hosts4、基础对象 二、RabbitMQ的一些基本操作:1、用户管理2、用户角色3、vhost4、开启web管理接口5、批量删除队列 一、Ra…

硬件基础22 反馈放大电路

目录 一、反馈的基本概念与分类 1、什么是反馈 2、直流反馈与交流反馈 3、正反馈与负反馈 4、串联反馈与并联反馈 5、电压反馈与电流反馈 二、负反馈四种组态 1、电压串联负反馈放大电路 2、电压并联负反馈放大电路 3、电流串联负反馈放大电路 4、电流并联负反馈放大…

新型大语言模型的预训练与后训练范式,苹果的AFM基础语言模型

前言:大型语言模型(LLMs)的发展历程可以说是非常长,从早期的GPT模型一路走到了今天这些复杂的、公开权重的大型语言模型。最初,LLM的训练过程只关注预训练,但后来逐步扩展到了包括预训练和后训练在内的完整…