1.WDG简介
WDG(Watchdog)看门狗(简单来说就是程序运行的保障措施,我们的在程序中定期的喂狗,如果程序出问题卡死了,没有在规定的时间去喂狗,那么看门狗硬件就会自动帮我们复位一下,防止程序长时间卡死)
看门狗可以监控程序的运行状态,当程序因为设计漏洞、硬件故障、电磁干扰等原因,出现卡死或跑飞现象时,看门狗能及时复位程序,避免程序陷入长时间的罢工状态,保证系统的可靠性和安全性
看门狗本质上是一个定时器,当指定时间范围内,程序没有执行喂狗(重置计数器)操作时,看门狗硬件电路就自动产生复位信号
STM32内置两个看门狗
独立看门狗(IWDG):独立工作(就是独立看门狗的时钟时专用的LSI,内部低速时钟,即使主时钟出现问题,看门狗也能正常工作),对时间精度要求较低
窗口看门狗(WWDG):要求看门狗在精确计时窗口起作用(使用APB1的时钟)
2.IWDG
2.1 IWDG框图
输入时钟是LSI,内部低速时钟,时钟频率为40KHz,之后,时钟进入预分频器进行分频,这个预分频器只有8位,所以最大只能进行256分频,上面这个预分频寄存器,可以配置分频系数,这个PR和定时器的PSC是一个意思,之后后面,经过预分频器分频之后,时钟驱动递减计数器,每来一个时钟,自减一个数,另外这个计数器是12位的,所以最大值是2的12次方减1,然后,当自减到0之后,产生IWDG复位,正常运行时,为了避免复位,我们可以提前在重装载寄存器写一个值,IWDG_RLR和定时器的ARR一样,那当我们写好值之后,在运行过程中,我们在这个键寄存器里,写一个特定数据,控制电路进行喂狗,这时重装值,就会复制到当前的计数器中,这样记数器就会回到重装值,重新自减运行了,然后,这里有个状态寄存器SR,就是标志电路运行的状态。最后上面的寄存器位于1.8V供电区,下面主要工作的电路,都在VDD供电区。
2.2 IWDG键寄存器
键寄存器本质上是控制寄存器,用于控制硬件电路的工作
在可能存在干扰的情况下,一般通过在整个键寄存器写入特定值来代替控制寄存器写入一位的功能,以降低硬件电路受到干扰的概率
指令的抗干扰能力强,对PR和RLR的写操作,可以设置一个写保护措施,只有键寄存器写入5555,才能解除写保护,一旦写入其他值,PR和RLR再次被保护起来,这样PR和RLR,就跟键寄存器一起被保护了起来,防止误操作
2.3 IWDG超时时间
超时时间:TIWDG = TLSI × PR预分频系数 × (RL + 1)
其中:TLSI = 1 / FLSI
FLSI就是40K,TLSI就是周期,等于40k分之1,等于0.025ms,之后输入时钟进行分频,相当于计数时间加倍,上图是PR和分频系数的关系,最后RLR计数目标乘个RLR+1,就是最终的超时时间。
3.WWDG
3.1 WWDG框图
时钟来源是PCLK1,也就是APB1的时钟,这个时钟默认是36MHz,所以就是36M的时钟进来,进来之后,还是先经过一个预分频器进行分频(灵活调节后面计数器的时钟频率,同时预分频系数也是计算计数器溢出时间的重要参数),那接着,分频之后的时钟,驱动这个计数器进行计数, T5—T0是有效计数位,T6是标志位。左边是复位信号输出部分,首先这个WDGA,是窗口看门狗的激活位,也就是使能,WDGA写入1,启用窗口看门狗。 上面这一块实现喂狗时间的最早界限,首先,我们需要计算一个最早界限的计数值,写入这里的W6~W0中,这里的值写入之后是固定不变的,之后这里,一旦我们执行写入CR操作时,这个与门开关就会打开,写入CR,就是写入寄存器,也就是喂狗。在喂狗时,这个比较器开始工作,一旦它比较,我们当前计数器T6:0>窗口值W6:0,比较结果就等于1。
3.2 WWDG工作特性
递减计数器T[6:0]的值小于0x40时,WWDG产生复位
递减计数器T[6:0]在窗口W[6:0]外被重新装载时,WWDG产生复位
递减计数器T[6:0]等于0x40时可以产生早期唤醒中断(EWI),用于重装载计数器以避免WWDG复位(一般用来执行紧急操作,比如保存重要数据、关闭危险设备等,或者还有一种写法,虽然超市喂狗了,但是我们可以在中断里执行一些代码解决,或者任务不危险,超时了就想做一些提示,不不想让它复位,这样的话,我们就可以在这个早期唤醒中断里,直接执行喂狗,阻止系数复位,然后提示一些信息)
定期写入WWDG_CR寄存器(喂狗)以避免WWDG复位
3.3 WWDG超时时间
超时时间:
TWWDG = TPCLK1 × 4096 × WDGTB预分频系数 × (T[5:0] + 1)
窗口时间:
TWIN = TPCLK1 × 4096 × WDGTB预分频系数 × (T[5:0] - W[5:0])
其中:TPCLK1 = 1 / FPCLK1
多乘一个4096,时因为PCLK进来之后先执行一个4096的分频,WDGTB的值与分频系数的关系,就是分频系数=2^WDGTB,对应上表。
4.IWDG和WWDG对比
5.独立看门狗配置
1.开启时钟,只有LSI时钟开启,独立看门狗才能运行(如开启了独立看门狗,那么LSI就会跟随强制打开,等LSI稳定后,就可以自动为独立看门狗提供时钟,这步可以不用写代码)
2.解除写保护
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
3.写入预分频器和重装寄存器
IWDG_SetPrescaler(IWDG_Prescaler_x);
IWDG_SetReload(x);
4.配置工作完成后,执行启动看门狗的指令
IWDG_ReloadCounter();
IWDG_Enable();
5.在主循环里,不断执行喂狗指令
IWDG_ReloadCounter();
6.窗口看门狗配置
1.开启独立看门狗APB1的时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
2.配置各个寄存器,比如预分频、窗口值
WWDG_SetPrescaler(WWDG_Prescaler_x);
WWDG_SetWindowValue(0x40 | xx);
3.写入控制寄存器CR,控制寄存器,包含看门狗使能位,计数器溢出位和计数器有效位
WWDG_Enable(0x40 | xx);(使能第一次喂狗,参数与下方函数相同)
WWDG_SetCounter(0x40 | xx);(主循环喂狗,注意与使能函数的时间间隔)