WDG(Watchdog)看门狗
看门狗可以监控程序的运行状态,当程序因为设计漏洞、硬件故障、电磁干扰等原因,出现卡死或跑飞现象时,看门狗能及时复位程序,避免程序陷入长时间的罢工状态,保证系统的可靠性和安全性
看门狗本质上是一个定时器,当指定时间范围内,程序没有执行喂狗(重置计数器)操作时,看门狗硬件电路就自动产生复位信号
STM32内置两个看门狗
????????????????独立看门狗(IWDG):独立工作,对时间精度要求较低(独立的时钟)
????????????????窗口看门狗(WWDG):要求看门狗在精确计时窗口起作用(APB1的时钟)
对比定时器的时基单元来看,时基单元由:预分频器、计数器、重装寄存器组成。
定时器溢出,直接看门狗复位。重装值定时器是在更新事件重装,看门狗则是在自减等于0之前,手动重装。喂狗操作就是重置这个递减计数器。
LSI内部低速时钟,频率是40KHz,之后时钟进入预分频器进行分频,最大分频256,上面的预分频寄存器IWDG_PR可以配置分频系数,PR和定时器的PSC一个意思;经过预分频器分频之后,时钟驱动递减计数器,每来一个时钟,自减一个数,最大值是4095;当自减到0之后,产生IWDG复位;正常运行时,为了避免复位,提前在重装寄存器IWDG_PLR(和定时器的ARR一个意思)写一个值。在键寄存器中写一个特定的数据,控制电路,进行喂狗。这时重装值就会复制到当前的计数器中,这样计数器就会回到重装值,重新自减运行了。状态寄存器IWDG_SR标志电路运行的状态了。
上面这些寄存器位于1.8V供电区,下面主要的工作电路都位于VDD供电区。
键寄存器本质上是控制寄存器,用于控制硬件电路的工作
在可能存在干扰的情况下,一般通过在整个键寄存器写入特定值来代替控制寄存器写入一位的功能,以降低硬件电路受到干扰的概率
写入键寄存器的值 | 作用 |
0xCCCC | 启用独立看门狗 |
0xAAAA | IWDG_RLR中的值重新加载到计数器(喂狗) |
0x5555 | 解除IWDG_PR和IWDG_RLR的写保护 |
0x5555之外的其他值 | 启用IWDG_PR和IWDG_RLR的写保护 |
LSI是输入时钟:40KHz,FLSI = 40K
对应定时器就是72M/(PSC+1)/(ARR+1)
以第一行为例:
周期TLSI = 1/40K = 0.025ms
最短时间:TIWDG = 0.025ms * 4 * (0 + 1) = 0.1ms
最长时间:TIWDG = 0.025ms * 4 * (4095?+ 1) = 409.6ms
左下角是时钟源部分PCLK1(PPB1,36MHZ),右边是预分频器(WDGTB),接着上面是6位递减计数器CNT(T5~T0有效,T6是移出标志位,值是1时,计数器没有移出;为0时移出。把T6看作计数器的一部分,就是减到0x40(100 0000)后溢出;把T6看作溢出位,那就是低6位的数据减到0之后溢出),位于控制寄存器WWDG_CR里。窗口看门狗没有重装寄存器,直接在CNT写入数据就是了,最上面是窗口值(WWDG_CFR),也就是喂狗的最早时间界限,最后左边就是输出信号的逻辑了。
复位信号输出部分,WDGA就是窗口看门狗的激活位,也是就是使能。两个来源都可以复位,下面这一路来源于溢出标志位T6,溢出标志位为0,取反为1,或门为1,1&1=1,总的与门出去就是复位(避免T6位为0,避免复位)。
喂狗时间的最早界限由上面实现,首先要计算一个最早界限的计数值,写入到这里的W6~W0中,写入之后是不变的。一旦执行写入WWDG_CR操作时,这个与门就会打开写入CR就是写入计数器,也就是喂狗,在喂狗时,这个比较器开始工作,一旦比较当前计数器的值T6:0>窗口值W6:0,比较结果就是1,这个1通过或门也可以去申请复位,这就是喂狗最早时间窗口的实现流程。
递减计数器T[6:0]的值小于0x40时,WWDG产生复位(包含T6位)
递减计数器T[6:0]在窗口W[6:0]外被重新装载时,WWDG产生复位(不能过早喂狗)
递减计数器T[6:0]等于0x40时可以产生早期唤醒中断(EWI),用于重装载计数器以避免WWDG复位
定期写入WWDG_CR寄存器(喂狗)以避免WWDG复位
超时时间TWWDG就是喂狗的最晚时间;窗口时间TWIN就是喂狗的最早时间。有个固定4096分频。
只有1/2/4/8分频。不包含T6、W6。
以第一行为例:
TWWDG = 1/36M * 4096 * 1 * 1 = 113us;
TWIN = 1/36M * 4096 * 64 = 7.28ms
2倍递增
IWDG独立看门狗 | WWDG窗口看门狗 | |
复位 | 计数器减到0后 | 计数器T[5:0]减到0后、过早重装计数器 |
中断 | 无 | 早期唤醒中断 |
时钟源 | LSI(40KHz) | PCLK1(36MHz) |
预分频系数 | 4、8、32、64、128、256 | 1、2、4、8 |
计数器 | 12位 | 6位(有效计数) |
超时时间 | 0.1ms~26214.4ms | 113us~58.25ms |
喂狗方式 | 写入键寄存器,重装固定值RLR | 直接写入计数器,写多少重装多少 |
防误操作 | 键寄存器和写保护 | 无 |
用途 | 独立工作,对时间精度要求较低 | 要求看门狗在精确计时窗口起作用 |
手册