看门狗
参考网站:
(32条消息) STM32CubeMX之独立看门狗(IWDG)和窗口看门狗(WWDG)_独立看门狗与窗口看门狗用同一个时钟_while(1)的博客-CSDN博客
STM32单片机看门狗:独立看门狗和窗口看门狗有什么区别? - 知乎 (zhihu.com)
(32条消息) 【STM32】窗口看门狗概述、寄存器、库函数(WWDG一般步骤)_看门狗寄存器函数名_Yngz_Miao的博客-CSDN博客
(32条消息) 窗口看门狗WWDG实例解析&IWDG与WWDG的异同点_iwdg wwdg_肥肥胖胖是太阳的博客-CSDN博客
早期的MCU没有看门狗,就容易引起有些产品死机了不能重启工作。为了避免这个问题,后期的MCU在内部集成了看门狗的功能。
为了满足更多使用场景,现在很多MCU都集成了两个看门狗:独立看门狗与窗口看门狗。
拿现在大家熟悉的STM32来说,都集成了独立看门狗和窗口看门狗,下面就展开来讲讲这个两个看门狗以及它们的区别。
独立看门狗(IWDG)
独立看门狗,顾名思义,就是独立的一个看门狗,由其专用低速时钟 (LSI) 驱动,因此,即便在主时钟发生故障时仍然保持工作状态。
IWDG 最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的场合。
独立看门狗特性:
- 自由运行递减计数器
- 时钟由独立 RC 振荡器提供(可在待机和停止模式下运行)
- 当递减计数器值达到 0x000 时产生复位(如果看门狗已激活)
独立看门狗的时钟由独立的RC振荡器LSI提供,即使主时钟发生故障它仍然有效,非常独立。LSI的频率一般在30~60KHZ之间,根据温度和工作场合会有一定的漂移,我们一般取 40KHZ,所以独立看门狗的定时时间并一定非常精确,只适用于对时间精度要求比较低的场合。

独立看门狗用通俗一点的话来解释就是一个 12 位的递减计数器,当计数器的值从某个值一直减到 0 的时候,系统就会产生一个复位信号,即 IWDG_RESET。如果在计数没减到 0 之前,刷新了计数器的值的话,那么就不会产生复位信号,这个动作就是我们经常说的喂狗。
IWDG不足之处,以及WWDG的优势:
当我们需要在程序跑飞时保存一些珍贵的数据,IWDG真的是无能为力,IWDG的功能就是“当检测到程序跑飞立刻复位单片机,就相当于危险发生时不管你什么重要的数据,保住单片机的命要紧”;与IWDG不同的WWDG是“当检测到程序跑飞时,我们不急着作复位的决定,我们先进入中断服务函数进行一些必要的操作,比如保存数据……等关键操作,然后在紧急复位抢救单片机的生命”。
窗口看门狗(WWDG)
窗口看门狗,之所以称为窗口,是因为其喂狗时间是一个有上下限的范围内,你可以通过设定相关寄存器,设定其上限时间和下限时间:喂狗的时间不能过早也不能过晚。


除非递减计数器的值在T6位变成0前被刷新,否则看门狗电路在达到预置的时间周期时,会产生一个MCU复位。即时间计数超过了窗口下限;
在递减计数器达到窗口寄存器数值之前,如果7位的递减计数器数值(在控制寄存器中)被刷新, 那么也将产生一个MCU复位。即时间计数还没达到窗口的上限;
这表明递减计数器需要在一个有限的时间窗口中被刷新。


WWDG超时时间计算


这里需要注意的是:由于PCLK1默认情况下是36MHz,还是很大的。但是看门狗不需要这么大的频率,通常是需要除以4096。而预分频等操作是在除以了4096之后再进行的。
注:计数器重装值必须大于窗口阈值上限!

窗口型看门狗工作原理
上窗口的值可以只有设定,7位二进制数最大只可以设定为127(0x7F),最小又必须大于下窗口的0x40,所以其取值范围为64~127(即:0x40~0x7F);配置寄存器WWDG->CFR中为计数器设定时钟分频系数,确定这个计数器可以定时的时间范围,从而确定窗口的时间范围。
窗口看门狗的时钟来自于PCLK1,在时钟配置中,其频率为外部时钟经倍频器后的二分频时钟,即为36MHz,根据手册可以知道其定时时间计算方法:


两者使用调条件如下所示


两者区别
独立看门狗与窗口看门狗的区别如下:
- 独立看门狗没有中断,窗口看门狗有中断。
- 独立看门狗有硬件软件之分,窗口看门狗只能软件控制。
- 独立看门狗只有下限,窗口看门狗有下限和上限。
- 独立看门狗是12位递减的,窗口看门狗是7位递减的。
- 独立看门狗是用的内部大约40KHz的RC振荡器,窗口看门狗是用的系统时钟APB1ENR
独立看门狗没有中断功能,只要在计数器减到0(下限)之前,重新装载计数器的值,就不会产生复位。
要注意看门狗和外接复位IC同时存在的情况,外部电路可能会阻止看门狗复位。
窗口看门狗有中断,这个中断的作用是在计数器达到下限0x40的时候,产生中断,让你喂狗;如果你不喂狗,计数器的值变为0x3f的时候,将会产生系统复位;即使是喂狗,也应该在中断里快速喂狗,要不时间长了计数器减1也会变成0x3f产生复位。
窗口看门狗还有一个上限值,这个值如果大于计数器的初始值,那么就没有任何作用了;这个值小于计数器初始值的时候,当计数器的值大于上限值时你对计数器进行装载,将会产生复位,只有在计数器减到小于上限值时,你才能重新装载计数器。意思就是说只有计数器的值在上限值和下限值之间你才能装载计数器,否则就会产生系统复位,当上限值小于下限值,也没有意义。
思考?

已知:系统时钟72MHz,T = 13.89ns
窗口看门狗清狗时,对寄存器写两次,中间间隔不超过15个系统时钟(即208ns)。
首先分析失败场景:
假如软件在写寄存器两次过程中,中间产生高优先级中断,假设中断处理较长超过了15个系统时钟,会导致清狗失败;
15个系统时钟内,看门狗计数已到窗口上、下门限外。——这种情况不太可能。从上面计算,15个系统时钟内对寄存器写两次才208ns,而看门狗计数周期为113.778us。在一个看门狗周期内早就完成了清狗的操作。
PCLK1=36MHz,看门狗不需要这么大的频率,通常是需要除以4096。而预分频等操作是在除以了4096之后再进行的。假如预分频系数为1。此时T = 4096 * 1/PCLK1 = 113.778us
就是计数器减1的周期为113.778us。软件可以在1个看门狗计数周期内(113.778us),就做完清狗操作(对寄存器写两次,中间间隔不超过15个系统时钟即208ns)
如何能保证软件在208ns内清狗写寄存器两次能成功?软件层面的解释了。
WRITE_REG(WDG_REG)
WRITE_REG(WDG_REG)
这两次操作在208ns内完成?