文章目录
- 一、看门狗基础介绍
- (一)看门狗概述:
- (二)看门狗的作用:
- (三)看门狗的原理:
- (四)为什么需要使用看门狗来提高系统的可靠性:(了解)
- (五)硬件配置
- (六)看门狗应用
- (七)想了解高级功能和技巧可以参考以下方式:
- 二、HAL库独立看门狗学习和时间溢出计算
- 三、HAL库独立看门狗配置流程
一、看门狗基础介绍
(一)看门狗概述:
看门狗(Watchdog)是一种用于提高系统可靠性的硬件或软件机制。它的作用是监控系统的运行状态,并在系统出现故障或停止响应时采取相应的措施,如复位系统或执行预定义的异常处理程序。
(二)看门狗的作用:
通过使用看门狗,系统能够在出现故障或停止响应时快速检测并采取措施。它可用于监控各种硬件和软件故障,如死锁、无限循环、崩溃等。看门狗是特别有用的,当系统处于无人监视或远程控制的环境中时,可以确保系统自动恢复或采取适当的应对措施。
(三)看门狗的原理:
1.监控系统状态:看门狗定时器会周期性地计数,当系统正常运行时,软件会定期“喂狗”,即重置看门狗计数器,防止计数器溢出。如果系统在规定的时间内未能喂狗,即未能刷新看门狗计数器,说明系统可能出现了故障或停止响应。
2.超时触发复位:看门狗定时器的计数器达到预设的阈值(重装载值)时,会触发看门狗超时事件。这意味着系统在规定的时间内未能喂狗,被认为是异常状态。超时事件可以触发复位电路,导致系统执行复位操作,将系统恢复到初始状态。
3.系统恢复:当看门狗超时事件发生时,系统会执行相应的恢复操作。这可以包括重新初始化系统、重新加载程序或执行特定的异常处理程序,以确保系统能够正常运行。
(四)为什么需要使用看门狗来提高系统的可靠性:(了解)
1.异常恢复:看门狗可以在系统出现异常或故障时触发重启操作。如果系统在运行过程中发生了死锁、崩溃、无限循环或其他异常情况,看门狗能够检测到这些情况并通过重启系统来恢复正常运行。这有助于避免系统持续处于不可用或不稳定状态。
2.软件故障保护:即使在软件出现故障或异常的情况下,看门狗也能够确保系统的可靠性。通过定期喂狗操作,软件可以证明自己仍在正常运行。如果软件由于某种原因无法进行喂狗操作(如死循环或异常跳转),看门狗将检测到这种情况并采取相应的恢复措施。
3.系统稳定性监控:看门狗可以监控系统的运行状态和稳定性。它会定期计时,如果系统在设置的时间间隔内没有进行喂狗操作,说明系统可能出现了故障或停滞。在这种情况下,看门狗将触发重启操作,以确保系统恢复到可靠的状态。
4.预防嵌入式系统停顿:在嵌入式系统中,可能会出现一些无法预料的情况,导致系统停顿或无响应。看门狗可以帮助预防这些停顿情况的发生。通过设置适当的看门狗定时器周期和喂狗操作,可以确保系统在规定时间内持续运行,避免长时间的停顿或无响应。
(五)硬件配置
学习如何配置单片机的时钟源和时钟分频器,以确保看门狗定时器的时钟频率正确,具体查看对应芯片的数据手册或参考手册,我用的是stm32f103的板子,STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效。这里需要注意独立看门狗的时钟是一个内部 RC 时钟,所以并不是准确的 40Khz,而是在 30~60Khz 之间的一个可变化的时钟,只是我们在估算的时候,以 40Khz 的频率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。(本段参考正点原子STM32HAL库开发指南)
至于看门狗硬件引脚如何设置需要硬件工程师决定。
(六)看门狗应用
看门狗在实际应用中的用途,如监控系统死锁、处理器失效等
学习如何合理设置看门狗的预分频器和重装载值,以达到适当的超时时间
研究如何在系统中处理看门狗复位,以确保系统能够正确恢复并继续正常运行
(七)想了解高级功能和技巧可以参考以下方式:
1.学习如何在看门狗定时器中断中执行特定的操作
2.探索看门狗模块的其他功能,如窗口模式、硬件喂狗等
3.研究如何在系统中处理看门狗异常,如故障检测和容错机制
二、HAL库独立看门狗学习和时间溢出计算
学习看门狗需要了解以下几个寄存器
1.IWDG_KR
在键寄存器(IWDG_KR)中写入 0xCCCC,开始启用独立看门狗;此时计数器开始从其复位
值 0xFFF 递减计数。当计数器计数到末尾 0x000 时,会产生一个复位信号(IWDG_RESET)。 无论何时,只要键寄存器 IWDG_KR 中被写入 0xAAAA, IWDG_RLR 中的值就会被重新加载到计数器中从而避免产生看门狗复位。
IWDG_PR 和 IWDG_RLR 寄存器具有写保护功能。要修改这两个寄存器的值,必须先向
IWDG_KR 寄存器中写入 0x5555。将其他值写入这个寄存器将会打乱操作顺序,寄存器将重新被保护。重装载操作(即写入 0xAAAA)也会启动写保护功能。
2.IWDG_PR 预分频寄存器
该寄存器用来设置看门狗时钟的分频系数,最低为 4,最高位 256,该寄存器是一个 32 位的寄存器,但是我们只用了最低 3 位,其他都是保留位
3.IWDG_RL重装载寄存器
4.独立看门狗时间溢出计算
溢出时间Tout=重装载值X看门狗时钟周期
看门狗时钟周期=1/(预分频值X时钟频率)
预分频值=1/(预分频因子)
预分频因子的确定要查看PR寄存器中的后三位,我们用的是100,对应的是64分频因子,带入上式子,如下所示就可以算出来溢出时间了,单位ms
Ps:有同学问为什么设置500重装载值和64预分频因子呢?
其实是我自己在问啦哈哈哈哈哈,因为我第一次学看门狗。
很简单,就看你要多久的溢出时间,我这个设置大概是1s溢出时间,你想改时间再设置其他数值即可!
三、HAL库独立看门狗配置流程
1.定义看门狗句柄
IWDG_HandleTypeDef IWDG_Handler;
2.看门狗配置初始化
分频系数
重装载值
看门狗初始化
void IWDG_Init(u8 prer,u16 rlr)
{IWDG_Handler.Instance=IWDG;IWDG_Handler.Init.Prescaler=prer; //设置IWDG分频系数IWDG_Handler.Init.Reload=rlr; //重装载值HAL_IWDG_Init(&IWDG_Handler); //初始化IWDG,默认会开启独立看门狗
}
3.喂狗函数
void IWDG_Feed(void)
{ HAL_IWDG_Refresh(&IWDG_Handler); //喂狗
}
4.While(1)按键喂狗
if(KEY_Scan(0)==WKUP_PRES) //如果WK_UP按下,喂狗
{
IWDG_Feed(); //喂狗
}
delay_ms(10);