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

《第十四部分》WDG看门狗

定义与原理

  • 定义:WDG 是 Watchdog Timer 的缩写,即看门狗定时器,是一种用于计算机和嵌入式系统中的定时器,用来检测和恢复系统故障146.
  • 原理:本质上是一个定时器,系统运行时,看门狗的计数器开始自动计数,正常工作的主程序需在规定时间内给看门狗发送特定信号即 “喂狗” 来重置定时器,防止其超时。若超过规定时间未 “喂狗”,则认为系统出现故障,看门狗会触发复位信号使系统复位136.

主要功能

  • 系统监控:持续监控系统运行状态,确保系统不会因软件故障而停止响应,保障系统的稳定性和可靠性1.
  • 防止死锁:能检测到程序进入无限循环等异常情况,并及时重置系统,使系统恢复正常运行,避免系统长时间处于无响应状态124.
  • 安全机制:在某些关键系统中作为安全机制,确保系统在异常情况下能够安全地重启,防止因系统故障导致的数据丢失、设备损坏等严重后果1.

分类

  • 独立看门狗(Independent Watchdog, IWDG)123 :
    • 独立运行:具有自己的时钟源,通常使用内部低速时钟 LSI,即使主时钟出现问题,也能正常工作,不受系统时钟影响。
    • 计时要求低:只有一个最晚喂狗界限,只要喂狗时间不超过此界限,系统就不会复位,对喂狗时间的精度要求相对较低。
  • 窗口看门狗(Window Watchdog, WWDG)123 :
    • 时钟关联系统:与系统时钟相关联,使用 APB1 的时钟,计时更精确。
    • 严格计时窗口:有最早和最晚喂狗界限,喂狗操作必须在这个时间窗口内进行,提前喂狗或超过最晚界限都会导致系统复位,对喂狗时间的精度要求高,能检测到更细微的程序异常。
  • 软件看门狗:由软件实现,依赖于操作系统的调度和运行环境。优点是无需额外硬件支持,成本低;缺点是当系统存在严重错误,如中断服务出错时,可能导致软件看门狗失效16.
  • 硬件看门狗:具有独立的硬件结构,即使主程序卡死,也能独立于软件运行并触发系统复位,稳定性和可靠性高,但需要额外的硬件成本16.
  • 周期性看门狗(Alive Supervision):监控周期性程序是否能正常执行,保证程序处于活跃状态1.
  • 截止期限看门狗(Deadline Supervision):监督软件在两个状态之间的转换时间,确保在预定时间内完成特定任务1.
  • 逻辑看门狗(Logical Supervision):监督软件执行顺序的正确性,确保程序按照预定逻辑运行1.

1.独立看门狗

STM32自带的看门狗有独立看门狗和窗口看门狗

独立看门口相关库函数

函数名功能和作用解释
IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess)用于使能或者失能对独立看门狗(IWDG)相关寄存器的写访问权限。通过传入合适的参数(不同的值对应不同的使能 / 失能状态设定)来控制是否可以对诸如预分频器、重载值等寄存器进行写入操作,以此来配置独立看门狗的相关工作参数。
IWDG_SetPrescaler(uint8_t IWDG_Prescaler)用于设置独立看门狗(IWDG)的预分频系数。传入的参数 IWDG_Prescaler 会确定预分频的具体值,预分频系数决定了计数器时钟的分频情况,进而影响计数器的计数速度,最终对独立看门狗的超时时间等关键工作特性产生影响,帮助用户根据实际需求来合理配置独立看门狗的计时节奏。
IWDG_SetReload(uint16_t Reload)用来设置独立看门狗(IWDG)的计数器重载值。当计数器计数到 0 后,会根据该重载值重新进行计数,通过设定合适的 Reload 参数,可以确定独立看门狗每次复位后重新计数的初始值,以此调整独立看门狗的超时周期等关键工作参数,满足不同的系统监控时长需求。
IWDG_ReloadCounter(void)其功能是对独立看门狗(IWDG)的计数器进行手动重新加载操作。在一些特定情况下,比如在计数器还未减到 0 之前,需要重新开始计数周期时,可以调用该函数,让计数器立即重新加载之前设定好的重载值,重新开始计数,避免出现不必要的看门狗复位情况。
IWDG_Enable(void)用于使能独立看门狗(IWDG)。调用这个函数后,独立看门狗开始按照之前配置好的预分频系数、重载值等参数进行计数操作,当计数器减到 0 时,如果没有及时进行相关操作(比如重新加载等),就会触发系统复位,以此来监控系统运行状态,保障系统正常工作。
FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG)用于获取独立看门狗(IWDG)相关标志位的状态。传入特定的标志位参数 IWDG_FLAG 后,函数会返回对应的标志位是置位还是复位状态,通过检查这些标志位状态,可以了解独立看门狗当前的一些运行情况,例如是否已经发生了超时复位等事件,方便进行系统状态的监测和调试等操作。

代码:用按键的方式模拟程序卡死,然后,通过独立看门狗让程序复位!

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Key.h"int main(void)
{/*模块初始化*/OLED_Init();						//OLED初始化Key_Init();							//按键初始化/*显示静态字符串*/OLED_ShowString(1, 1, "IWDG TEST");/*判断复位信号来源*/if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) == SET)	//如果是独立看门狗复位{OLED_ShowString(2, 1, "IWDGRST");			//OLED闪烁IWDGRST字符串Delay_ms(500);OLED_ShowString(2, 1, "       ");Delay_ms(100);RCC_ClearFlag();							//清除标志位}else											//否则,即为其他复位{OLED_ShowString(3, 1, "RST");				//OLED闪烁RST字符串Delay_ms(500);OLED_ShowString(3, 1, "   ");Delay_ms(100);}/*IWDG初始化*/IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);	//独立看门狗写使能IWDG_SetPrescaler(IWDG_Prescaler_16);			//设置预分频为16IWDG_SetReload(2499);							//设置重装值为2499,独立看门狗的超时时间为1000msIWDG_ReloadCounter();							//重装计数器,喂狗IWDG_Enable();									//独立看门狗使能while (1){Key_GetNum();								//调用阻塞式的按键扫描函数,模拟主循环卡死IWDG_ReloadCounter();OLED_ShowString(4, 1, "FEED");				//OLED闪烁FEED字符串Delay_ms(200);								//喂狗间隔为200+600=800msOLED_ShowString(4, 1, "    ");Delay_ms(600);}
}

2.窗口看门狗

窗口看门狗相关库函数

函数名功能和作用解释
void WWDG_DeInit(void)用于将窗口看门狗(WWDG)的相关寄存器恢复为默认值,也就是执行复位初始化操作,将之前对窗口看门狗所做的配置全部清除,使其回到初始状态,方便后续重新进行完整的配置。
void WWDG_SetPrescaler(uint32_t WWDG_Prescaler)用于设置窗口看门狗(WWDG)的预分频系数。传入的参数 WWDG_Prescaler 决定了对时钟进行分频的具体情况,以此来调节计数器的计数速度,进而影响窗口看门狗整体的计时特性,可根据实际系统需求来合理配置其预分频情况,确定合适的超时周期等相关参数。
void WWDG_SetWindowValue(uint8_t WindowValue)用来设定窗口看门狗(WWDG)的窗口值。窗口值在窗口看门狗机制中有重要作用,计数器的值必须在递减到窗口值之后且未减到 0 之前进行喂狗(重新加载等操作)才被视为正常,通过设定合适的 WindowValue 可精准定义这个有效的操作区间,确保系统按照期望的规则来监控运行状态。
void WWDG_EnableIT(void)用于使能窗口看门狗(WWDG)的中断功能。当窗口看门狗相关的特定事件发生时(比如计数器值达到某些临界状态等符合触发中断的条件时),使能该功能后就可以触发相应的中断,便于在中断服务程序中执行一些如记录日志、进行系统状态调整等特定操作,增强系统对异常情况的响应能力。
void WWDG_SetCounter(uint8_t Counter)其功能是设置窗口看门狗(WWDG)的计数器当前值。可以通过传入合适的 Counter 参数来手动给定计数器的初始值或者在运行过程中修改其当前值,以此来灵活控制窗口看门狗的计数状态,满足一些特殊场景下对计数器数值的特定要求。
void WWDG_Enable(uint8_t Counter)用于使能窗口看门狗(WWDG)开始工作。同时传入的 Counter 参数可以设置计数器的初始值,使能后窗口看门狗就会按照之前配置好的预分频系数、窗口值等参数开始计数,若计数器未在规定窗口区间内被正确处理(喂狗等),则会触发相应的系统行为(如复位等),以保障系统正常运行。
FlagStatus WWDG_GetFlagStatus(void)用于获取窗口看门狗(WWDG)相关标志位的状态。调用该函数后能知晓当前窗口看门狗是否出现了某些特定的事件(比如超时、进入窗口区间等对应的标志位情况),方便根据这些标志位来判断窗口看门狗的运行状态,进而对系统整体状态进行监测和分析。
void WWDG_ClearFlag(void)用于清除窗口看门狗(WWDG)的相关标志位。当获取到某些标志位并进行相应处理后,为了避免对后续的标志位状态判断造成干扰,需要调用该函数来将已经处理过的标志位清零,确保标志位状态能准确反映后续窗口看门狗新出现的情况。

  1. 基本概念
    • 独立看门狗(IWDG)
      • 独立看门狗是基于一个 12 位的递减计数器和一个 8 位的预分频器,它使用的是独立于系统时钟的低速时钟(LSI)。当计数器的值从某个初始值递减到 0 时,会产生一个复位信号(如果在递减过程中没有及时 “喂狗”)。这个过程不依赖于系统主时钟,即使系统主时钟出现故障,独立看门狗依然可以正常工作,起到监控系统是否 “死机” 的作用。
    • 窗口看门狗(WWDG)
      • 窗口看门狗也有一个递减计数器,它的时钟源是系统时钟经过预分频后的时钟。窗口看门狗主要用于检测软件异常,它不但要求在计数器减到 0 之前进行 “喂狗” 操作(防止复位),而且 “喂狗” 的时间必须在一个规定的窗口时间范围内。这个窗口时间是由计数器的上下限设定的,超出这个窗口范围进行 “喂狗” 操作同样会导致系统复位。
  2. 功能特点
    • 复位条件
      • 独立看门狗:只要计数器递减到 0 就会产生复位信号,其主要目的是防止系统长时间 “卡死”。例如,在一个简单的嵌入式系统中,如果主程序进入一个死循环,无法正常执行其他任务,独立看门狗的计数器会持续递减,最终复位系统,使系统重新启动,恢复正常运行。
      • 窗口看门狗:复位条件相对更复杂。当计数器的值小于一个下限时(表示 “喂狗” 太晚)或者在计数器的值大于一个上限时(表示 “喂狗” 太早)进行 “喂狗” 操作,都会产生复位信号。这就像是给 “喂狗” 操作设置了一个合理的时间窗口,只有在这个窗口内进行 “喂狗” 才能保证系统正常运行。例如,在一个对实时性要求较高的通信系统中,软件任务的执行顺序和时间有严格要求,窗口看门狗可以确保软件按正确的时间节奏执行任务。
    • 时钟源
      • 独立看门狗:通常使用内部低速时钟(LSI),这种时钟源相对独立,不受系统主时钟的干扰。其频率一般较低,例如在某些芯片中 LSI 频率可能是 32kHz 左右。
      • 窗口看门狗:使用系统时钟经过预分频后的时钟。系统时钟频率一般较高,而且可以根据系统的需求进行配置,比如系统时钟为 72MHz,经过适当的预分频后用于窗口看门狗的计数时钟。这使得窗口看门狗的计时精度可以根据系统时钟的精度进行调整,更好地适应对时间精度要求较高的应用场景。
  3. 应用场景
    • 独立看门狗
      • 适用于对系统可靠性要求较高,需要在系统出现意外故障(如程序跑飞、死循环等情况)时能够自动恢复的场合。例如,在一些工业控制设备中,如电机控制器,一旦程序出现异常导致电机失控,独立看门狗可以及时复位系统,避免安全事故的发生。
    • 窗口看门狗
      • 更适合于对软件运行时间精度有要求的场合,用于监控软件是否按照预定的时间顺序和时间间隔执行任务。比如在实时操作系统(RTOS)环境下,不同任务的调度和执行时间有严格要求,窗口看门狗可以确保各个任务在规定的时间窗口内完成相应的操作,保证系统的实时性和稳定性。


http://www.mrgr.cn/news/81747.html

相关文章:

  • 【LeetCode: 3159. 查询数组中元素的出现位置 + 统计下标】
  • Github优质项目推荐(第九期)
  • 深度学习助力股市预测:LSTM、RNN和CNN模型实战解析
  • docker项目部署流程(Vue+Spingboot)
  • android jetpack compose Model对象更新变量 UI不更新、不刷新问题
  • 【JavaEE】网络(6)
  • List详解
  • 【Linux命令】`ps -a` , `ps -ef` 和 `ps aux` 的区别
  • 【虚拟机网络拓扑记录】
  • 快速掌握Elasticsearch检索之二:滚动查询(scrool)获取全量数据(golang)
  • 代码随想录算法训练营第十六天-二叉树-513.找树左下角的值
  • 《机器学习》——利用OpenCV库中的KNN算法进行图像识别
  • IPD管理体系框架架应用实践
  • GFPS扩展技术原理(十)-FMDN Notification
  • 【测试】接口测试
  • 使用 Spring Boot 实现文件上传:从配置文件中动态读取上传路径
  • 计算机体系结构期末复习1:分支预测
  • 本地部署 LLaMA-Factory
  • Rectified Flow 原理简介与示例代码解读
  • provider-10000模块、consumer-80[RestTemplate远程调用]
  • Java编程规约:命名风格
  • C++第五六单元测试
  • Java - 日志体系_Apache Commons Logging(JCL)日志接口库
  • sqlserver 数据库误删-用mdf和ldf文件恢复
  • C# 窗体应用程序嵌套web网页(基于谷歌浏览器内核)
  • 获取页面上所有的img,并保存到本地