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