STM32——独立看门狗

文章目录

    • 一、看门狗基础介绍
      • (一)看门狗概述:
      • (二)看门狗的作用:
      • (三)看门狗的原理:
      • (四)为什么需要使用看门狗来提高系统的可靠性:(了解)
      • (五)硬件配置
      • (六)看门狗应用
      • (七)想了解高级功能和技巧可以参考以下方式:
    • 二、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
STM32——独立看门狗_第1张图片

在键寄存器(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 位,其他都是保留位
STM32——独立看门狗_第2张图片

3.IWDG_RL重装载寄存器
STM32——独立看门狗_第3张图片

4.独立看门狗时间溢出计算

溢出时间Tout=重装载值X看门狗时钟周期
看门狗时钟周期=1/(预分频值X时钟频率)
预分频值=1/(预分频因子)

预分频因子的确定要查看PR寄存器中的后三位,我们用的是100,对应的是64分频因子,带入上式子,如下所示就可以算出来溢出时间了,单位ms
STM32——独立看门狗_第4张图片
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);

你可能感兴趣的:(STM32单片机的开发,stm32,嵌入式硬件,c语言,单片机)