看门狗

看门狗
Kayer看门狗
1. 什么看门狗
看门狗是一种计时硬件电路。
当系统环境比较恶劣复杂的时候,程序可能会出现一些不可预料的错误,导致程序卡死,崩溃等情况。看门狗就可以及时的重置程序,使程序重新从头开始运行。
STM32 有2个看门狗,独立看门狗,窗口看门狗。独立看门狗号称宠物狗,窗口看门狗号称警犬。
独立看门狗(IWDG)由其自己的专用低速时钟(LSI)驱动,因此即使主时钟失败,它仍然保持活动。
窗口看门狗(WWDG)的时钟是从APB1时钟预分频的,并且具有可配置的时间窗口,可以编程以检测异常晚或早的应用程序行为。
IWDG最适合需要看门狗作为完全独立于主应用程序之外的过程运行的应用程序,但对定时精度的要求较低。
WWDG最适合需要看门狗在准确的定时窗口内做出反应的应用程序。
2. 独立看门狗
IWDG(Independent watchdog,独立看门狗)。独立看门狗是一个 12 位的递减计数器,当计数器的值从某个值一直减到 0 的时候,系统就会产生一个复位信号,即 IWDG_RESET。如果在计数没减到 0 之前,刷新了计数器的值的话,那么就不会产生复位信号,这个刷新计数器值的动作就是我们经常说的喂狗。
看门狗功能处于VDD供电区,即使在停机和待机模式时仍能正常工作。
2.1 计数器时钟
独立看门狗的时钟由独立的 RC 振荡器 LSI 提供,即使主时钟发生故障它仍然有效,非常独立(叫独立看门狗的由来)。
LSI 的频率一般在 30~60KHZ 之间,根据温度和工作场合会有一定的漂移,一般取 40KHZ,所以独立看门狗的定时时间并不一定非常精确,只适用于对时间精度要求比较低的场合。
2.2 预分频寄存器
Prescaler register (IWDG_PR)
只有PR[2:0]三位,其位于为保留位。
2.3 位递减计数器
独立看门狗的计数器是一个 12 位的递减计数器,最大值为 0XFFF,当计数器减到 0 时,会产生一个复位信号:IWDG_RESET,让程序重新启动运行,如果在计数器减到 0 之前刷新了计数器的值的话,就不会产生复位信号,重新刷新计数器值的这个动作我们俗称喂狗。
2.4 重装载寄存器
重装载寄存器(IWDG_RLR)是一个 12 位的寄存器,里面装着要刷新到计数器的值,这个值的大小决定着独立看门狗的溢出时间。
这里的超时时间是指如果超过这个时间不喂狗,就会产生复位信号。超时时间的计算公式:
注意:
(1)时钟频率是40KHz。
(2)预分频系数只有表中固定的这些值(3位PR值决定)。
(3)RL的值就是重装载寄存器中的值。计数器的初始值。
2.5 键寄存器
键寄存器(IWDG_KR)独立看门狗的一个控制寄存器,只能写入0-15位,读永远是0。三种控制方式,往这个寄存器写入下面三个不同的值有不同的效果。
写入的值 | 作用 |
---|---|
0xCCCC | 软件启动看门狗。若启用了硬件看门狗,则此命令无效。看门狗一旦启动,无法停止。 |
0xAAAA | 重装载计数器的值加入到计数器中。(喂狗) |
0X5555 | 允许访问IWDG_PR(预分频计数器)和IWDG_RLR(重装载计数器)寄存器。 |
其他值 | 开启IWDG_PR(预分频计数器)和IWDG_RLR(重装载计数器)寄存器的写保护。 |
2.6 状态寄存器
状态寄存器 (IWDG_SR) 只有位 0:PVU 和位 1:RVU 有效,这两位只能由硬件操作,软件操作不了。
Bit | 作用 |
---|---|
0 | PVU:看门狗分频器值更新(Watchdog counter reload value update) 此位由硬件设置,以指示正在持续进行重载值的更新。当在VDD电压域中完成重载值更新操作时(最多需要5个RC 40 kHz周期),硬件会将其重置。 只有当RVU位被重置时,才能更新重载值。 |
1 | RVU:看门狗计数器重载值更新(Watchdog prescaler value update) 此位由硬件设置,以指示正在持续进行分频器值的更新。当在VDD电压域中完成分频器更新操作时(最多需要5个RC 40 kHz周期),硬件会将其重置。 只有当PVU位被重置时,才能更新分频器值。 |
3. 窗口看门狗
WWDG(Window watchdog,窗口看门狗)。窗口看门狗跟独立看门狗一样,也是一个递减计数器不断的往下递减计数。窗口看门狗用于监测单片机程序运行时效是否精准,主要检测软件异常,一般用于需要精准检测程序运行时间的场合。
窗口看门狗的本质是一个能产生系统复位信号和提前唤醒中断的6位计数器。
产生复位条件:
当递减计数器值从 0x40 减到 0x3F 时复位(即T6位跳变到0)
计数器的值大于 W[6:0] 值时喂狗会复位。
产生中断条件:
- 当递减计数器等于 0x40 时可产生提前唤醒中断 (EWI)。
在窗口期内重装载计数器的值,防止复位。
当计数器减到一个固定值 0x40(T6位减到0)时还不喂狗的话,产生复位,这个值叫窗口的下限,是固定的值,不能改变。这个是跟独立看门狗类似的地方。
不同的地方是窗口看门狗的计数器的值在减到某一个数之前喂狗的话也会产生复位,这个值叫窗口的上限,上限值由用户独立设置。窗口看门狗计数器的值必须在上窗口和下窗口之间才可以喂狗。
3.1 窗口看门狗的时钟来源
来源于PCLK1,PCLK1的最大频率是36MHz,由RCC控制开启。
3.2 计数器的时钟频率
计数器时钟由 CK 计时器时钟经过预分频器分频得到,分频系数由配置寄存器WWDG_CFR的[8:7]两位配置,可以是 [0,1,2,3]。
所以计时器时钟频率 = PCLK1/4096/分频系数,这里先除以4096是因为PCLK1在进来之前有一个4096的分频。
Configuration register (WWDG_CFR) :
Bit | 作用 |
---|---|
Bit 9 | EWI:早期唤醒中断 当设置此位时,每当计数器达到0x40的值时,就会发生中断。此中断只能在复位后由硬件清除。 |
Bits 8:7 | 位8:7 WDGTB[1:0]:定时器基准 预分频器的时间基准可以按照以下方式修改: 00:CK计数器时钟(PCLK1除以4096)除以1 01:CK计数器时钟(PCLK1除以4096)除以2 10:CK计数器时钟(PCLK1除以4096)除以4 11:CK计数器时钟(PCLK1除以4096)除以8 |
Bits 6:0 | 位6:0 W[6:0]:7位窗口值 这些位包含要与下计数器比较的窗口值。 |
3.3 计数器
窗口看门狗的计数器是一个递减计数器,共有 7 位,其值存在控制寄存器 CR 的T[6:0]位,当 7 个位全部为 1 时是 0X7F,这个是最大值。
当递减到 T6 位变成 0 时,即从 0X40 变为 0X3F 时候,会产生看门狗复位。这个值 0X40 是看门狗能够递减到的最小值,所以计数器的值只能是:0X40~0X7F 之间。
实际上真正用来计数的是 T[5:0]。当递减计数器递减到 0X40 的时候,还不会马上产生复位,如果使能了提前唤醒中断:CFR 位 9 (EWI) 置 1,则产生提前唤醒中断,如果真进入了这个中断的话,就说明程序肯定是出问题了,那么在中断服务程序里面我们就需要做最重要的工作,比如保存重要数据,或者报警等,这个中断我们也叫它死前中断。
Control register (WWDG_CR)
Bit | 作用 |
---|---|
Bit 7 | WDGA:激活位 此位由软件设置,并且只有在复位后硬件才会清除。当WDGA = 1时,看门狗可以生成复位。 0:看门狗禁用 1:看门狗启用 |
Bits 6:0 | T[6:0]: 7位计数器(从最高有效位到最低有效位) 这些位包含了看门狗计数器的值。它每 (4096 x (2^WDGTB[1:0])) PCLK1 周期减一。当它从 0x40 回滚到 0x3F 时(T6 被清除),会产生一个复位。 |
3.4 窗口值
窗口看门狗必须在计数器的值在一个范围内才可以喂狗,其中下窗口的值是固定的0X40,上窗口的值可以改变,具体的由配置寄存器 CFR 的位 W[6:0] 设置。其值必须大于0X40,如果小于或者等于 0X40 就是失去了窗口的价值,而且也不能大于计数器的值,所以必须得小于 0X7F。
那窗口值具体要设置成多大?这个得根据我们需要监控的程序的运行时间来决定。如果我们要监控的程序段 A 运行的时间为 Ta,当执行完这段程序之后就要进行喂狗,如果在窗口时间内没有喂狗的话,那程序就肯定是出问题了。一般计数器的值设置成最大 0x7F,窗口值为 WR,计数器减一个数的时间为 T,那么时间:**(0x7F-WR)T* 应该稍微大于 Ta 即可,这样就能做到刚执行完程序段 A 之后喂狗,起到监控的作用,这样也就可以算出 WR 的值是多少。
在向WWDG_CR寄存器写入时,始终在T6位写入1以避免立即产生复位。
4. IWDG和WWDG对比
IWDG | WWDG | |
---|---|---|
复位 | 计数减到0 | 计数器T[5,0]减到0和过早重装计数器 |
喂狗方式 | 键寄存器写入0xAAAA,重装固定值RLR | 直接写入寄存器,写多少重装多少 |
中断 | 无 | 死前中断 |
时钟源 | LSI(40KHz) | PCLK1(36MHz) |
预分频系数 | 4,8 ,32, 64 ,128, 256 | 1,2, 4, 8 |
计数器 | 12位 | 6位 |
超时时间 | 0.1ms到26214.4ms | 113us到58.25ms |
用途 | 独立工作,对时间精度要求比较低 | 要求看门狗在计时窗口起作用 |