stm32独立看门狗无效,STM32独立看门狗和窗口看门狗的使用

看门狗是一个定时器,可以设定一个固定的时间,时间到了会复位MCU,所以MCU必须在固定时间之前复位计数(这个动作通常叫做喂狗)。

在嵌入式系统中加入看门狗可以监控MCU是否还在正常运行。如果软件运行进入死循环或者出现其他错误,看门狗定时器不能及时复位,那么MCU就会复位,回到初始状态,从而跳出错误状态。

Stm32内部有独立的看门狗和窗口看门狗。使用独立看门狗时,只要喂食时间不长于设定时间,就是最常用的看门狗用法;窗口看门狗需要在上下限范围内喂狗,以重置看门狗定时器。

让我们分别了解一下这两种看门狗的用法。

1)stm32的独立看门狗(IWDG)

我们修改了之前的串口中断项目,方便打印数值。

使用cubemx打开串口中断的项目,然后保存为IWDG项目,打开独立的看门狗,设置分频系数和过载计数值:

然后,切换到时钟配置页面,可以看到IWDG的时钟来自内部低速RC振荡器,频率为40kHz:

结合设置的分频系数和过载计数值,我们可以计算看门狗计时时间:

64*1000/40kHz=1.6s

生成keil项目文件,打开,我们可以看到主函数已经有了初始化IWDG的代码,MX_IWDG_Init()函数设置了我们的分频和计数值,启动了看门狗。

使用时,我们需要在主循环中每隔1.6s喂一次狗(调用HAL_IWDG_Refresh()函数一次)。如下图所示,代码中每1s喂一次狗。从右边的运行结果可以看出,程序一直正常运行,没有被复位:

如果我们将延迟参数更改为每2秒喂一次狗,我们可以看到程序将被重置:

2)stm32的窗口监视器(WWDG)

还是在之前的串口中断项目中修改,以便打印数值查看。

使用cubemx打开串口中断项目,然后保存为WWDG项目,打开窗口看门狗,设置分频系数、窗口值和计数值,启用早期唤醒中断:

解释这些参数的含义:

分频系数很好理解。WWDG的主时钟是PCL k1(AP B1的时钟)。如果这里设置为8,则分频为PCLK1/8/4096。

窗口监视器的定时器是减法计数,从设定的WWDG自由运行递减计数器值开始递减计数。如果狗没有被喂,MCU将在达到0x3F时复位。因此,wwdg自由运行递减计数器值设置的值必须大于0x3F并且其最大值不能超过0x7F,这是图中设置的最大值0x7F;

WWDG窗口值的取值必须在0x3f和WWDG自由运行递减计数器值之间,图中设置的值为0x70,这意味着当wwdg定时器从0x7F向下递减时,必须降到0x70以下,才能有效喂狗(即喂狗的窗口间隔在0x3F和wwdg窗口值之间)。

启用早期唤醒中断并打开中断。此处中断主要用于指示是否在窗口时间内:

然后在时钟配置页面下,可以看到PCLK1的频率是36M:

根据以上信息,可以计算出喂狗的窗口:

PCL k1/8/4096=1099hz;

(0x7F-0x3F)/1099=58ms;

(0x7F-0x 70)/1099=14 ms;

所以喂狗的窗口时间大概是14 ms到58 ms。

生成keil项目,打开后在wwdg.c中添加早期窗口看门狗中断回调函数,只需设置一个标志位:

在主循环中,检测标志位,如果有,说明窗口时间到了,需要尽快喂狗;

程序代码和运行结果如下:

可见喂狗的操作起了作用,程序没有重置。

3)使用看门狗的几点注意事项。

在实际工程应用中,使用看门狗时要注意几点,否则可能发挥不了作用:

a)喂狗的操作必须在主循环中,不能在定时器中断中!这是很多初学者容易犯的错误!因为,如果主循环跑偏或者陷入死循环,定时器中断可能还在正常运行,看门狗无法复位系统,无法监控系统的正常运行。

b)如果是多任务系统,比如使用实时操作系统,有多个任务在运行,使用看门狗时,需要根据任务功能设置喂狗规则:一组在一定时间内绑定运行的任务,需要在每个任务执行后喂一次狗,保证所有任务都被监控;可能被阻塞或以长时间间隔(超过看门狗定时器)运行一次的任务不能与喂狗操作相关联,以避免在正常操作期间被意外重置。

好了,本节看门狗相关知识到此为止。