看门狗简介
以下介绍来自百度百科
在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成各种寄存器和内存的数据混乱,会导致程序指针错误,不在程序区,取出错误的程序指令等,都有可能会陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续正常工作,导致整个系统的陷入停滞状态,发生不可预料的后果。
看门狗,又叫 watchdog,从本质上来说就是一个定时器电路,一般有一个输入和一个输出,其中输入叫做喂狗,输出一般连接到另外一个部分的复位端,一般是连接到单片机。 看门狗的功能是定期的查看芯片内部的情况,一旦发生错误就向芯片发出重启信号。看门狗命令在程序的中断中拥有最高的优先级。
STM32内部的看门狗
32内部有独立看门狗(IWDG)和窗口看门狗(WWDG)
IWDG以低速内部时钟(LSI)作为时钟源,即使主时钟发生了故障仍然可以正常运行,这也是“独立”一词的由来。但是时钟精度较低
WWDG由APB1时钟分频后驱动,时钟精度较高
看门狗原理
看门狗与定时器的原理相似,由设定的初始值开始向下递减,递减到达设定阈值时进行操作。不同的是定时器进行的操作是进入中断,而看门狗则是直接复位程序。
IWDG
想要使用IWDG,就需要对它进行配置,本人使用的是STM32CubeMX进行配置
首先将IWDG状态设置为Active,然后设置分频系数(PR)和计数重载值(RLR)
IWDG的溢出时间公式如下:
为溢出时间,PR为分频系数,RLR为重载值,T为时钟周期
实际上最基础的公式应该是
计数次数×每次计数的时间
计数次数即为RLR,而每次计数的时间却并不是时钟周期,因为时钟需要进行分频操作,查阅数据手册可得
PR的值与实际分频倍数有如下关系:
实际分频倍数 =
而T为LSI的周期,查数据手册可得
最后得到实际每次计数所需的时间为
即:
直接按照目标溢出时间进行配置即可
WWDG
WWDG有两种复位条件,如图(从数据手册截的)
所以如果想让程序正常运行,不复位,只能在上窗口和下窗口之间刷新WWDG_CR的内容(重载值),这也是“窗口”一词的由来
配置WWDG的溢出时间依然遵循这个公式:
计数次数×每次计数的时间
在WWDG中,计数次数 = 计数重载值 - 下窗口值(0x3F)
而每次计数的时间为
这里的4096来自于先前那张图标注的框,32数据手册上没有标出,但是它实际确实存在,因为APB1的时钟频率实在太高
而则是因为在WWDG_CFR中WDGTB与实际分频倍数有如下关系
实际分频倍数 =
所以最后可以得到最终溢出时间计算公式
数据手册内的公式其实与这个一样,因为T[6:0]如果想要大于0x3F,那么T[6]必须为1,也就是说将T的后6位减为0,再进行一次-1操作,得到的同样是计数次数
用纯数学计算方法同样可证
即: