上次我们学完了STM32的低功耗模式,这次我们来学习一下看门狗。
一.简介
在程序卡死的情况下,自动复位一下。
1.看门狗简介

(1)独立看门狗
独立运行就是看门狗的时钟是专用的LSI,内部低速时钟,即使主时钟出现问题了看门狗也可以正常工作。这也是独立看门狗命名独立的原因。对时间要求低,就是独立看门狗只有一个最晚的时界限,喂狗的时间,只要不超过这个最晚的界限就行了。
(2)窗口看门狗
意思就是喂狗的时间有一个最晚的界限,也有个最早的界限,必须在这个界限的窗口内喂狗,这就是窗口看门狗命名窗口的原因。对世间要求严格,独立看门狗完不成的,它可以完成。窗口看门狗使用的是APB1的时钟。
二.硬件了解
1.独立看门狗框图
这个框图的结构和定时器是非常相似的,只不过是定时器溢出产生中断。而看门狗计数溢出直接产生复位信号。然后喂狗操作就是重置计数器,这是一个递减计数器减到0之后复位。那么程序正常运行时为了避免复位。就得在这个计数器减到0之前,及时把这个计数值加大点。这个把计数值加大一点的操作就是喂狗。如果程序卡死了,没有及时加大这个计数器,那么减到0之后就自动复位了。

可以类比时基单元的框图来看。区别就是,定时器自增或者自减到时间之后,会产生中断信号,而看门狗自减到0后,会产生复位信号。另外重装值定时器是在更新事件重装,然而看门狗需要我们在自减到0之前,手动重装。因为减到0就复位了。正常情况下是不允许减少到0的。
那么手动重装计数器的操作就叫做喂狗。

看到输入时钟是LSI内部低速时钟,时钟频率为40Khz。之后时钟进入预分频器进行分频,这个预分频器只有8位,所以最大只能进行256分频。上面的预分频寄存器IWDG_PR可以配置分频系数,这个PR和定时器的PSC是一个意思他们都是Prescaler的缩写。
之后后面经过预分频器分频之后,时钟驱动递减计数器,每来一个时钟自减一个数,另外这个计数器是12位的。所以最大值是2的12次方-1=4095。当自减到0之后产生IWDG复位。正常运行时为了避免复位,我们可以提前在重装寄存器写一个值,IWDG_RLR和定时器的ARR是一样的。
当我们写好值之后,在这个键寄存器里,写一个特定数据。控制电路进行喂狗。这时重装值就会复制到当前的计数器中。这样计数器就会回到重装值,重新进行自减运行了。
这里有个状态寄存器IWDG_SR,就是标志电路运行的状态。其实这个SR里没有什么东西,只有两个更新同步位基本不用看。
最后上面这些寄存器位于1.8V供电区。下面的主要电路都位于VDD供电区。所以下面写看门狗功能,处于VDD供电区,在停机和待机模式时,仍然可以正常工作。
上一次我们也说过,独立看门狗也是唤醒待机模式的四个条件之一。
(1)新知识-键寄存器
我们来介绍一下键寄存器,这个我们没有用过以前,属于新的知识。

因为独立看门狗的工作环境是程序可能跑飞,受到电磁干扰,程序作出任何操作都是有可能的,如果只在寄存器中设置一个位,那么这一位就有可能在误操作中,变成1或者变成0。这个概率是比较大的。所以单独设置一位,进行控制,在这里比较危险,这时我们就可以在整个寄存器写入一个特定值。代替写入一个位的操作。
这些数值也比较刁钻,都是1和0交替混合的键值。

这里还有这三个寄存器PR,SR,RLR,也需要保护,也需要防止误操作功能,SR暂时不用管,是只读的寄存器。剩下的,对PR和RLR的写操作,可以设置一个写保护措施,只有在键寄存器写入0x5555,才能解除写保护。一旦写入其他值,PR和RLR再次被保护。
2.独立看门狗的超时时间
也就是定时器的溢出时间。

LSI是输入时钟,40KHz,Flsi就是40K,Tlsi就是周期=1/40K,就是0.025ms。所以上面是0.025ms,每隔0.025ms来一个输入时钟。之后输入时钟进行分频,相当于计数时间加倍。加多少倍呢,图中有分析,这里并不是PR写几,就是几+1分频。只有固定的分频系数。比如PR写2就是16分频,对应的计数时间就要×16,最后RL就是RLR计数目标。比如RL给个99这样式子里的各部分值就确定好了。
计算一下,0.025ms×16×100=40ms。这就是当前参数下的超时时间。
3.窗口看门狗框图
左下角是时钟源部分,右边是预分频器。然后上面是六位递减计数器CNT是位于控制寄存器CR里面的,计数器和控制器和二唯一了。然后窗口看门狗没有重装寄存器,那么如何重装计数器进行喂狗呢。这个我们直接在CNT写入数据就可以了。想写多少就写多少。
之后上面部分是窗口值。也就是喂狗的最早时间界限。就写到这里存起来。最后左边就是输出信号的操作逻辑了。什么情况下会产生复位,就由这几个逻辑门来决定。

时钟来源是PCLK1也就是APB1的时钟,这个时钟默认是36Mhz。之后经过预分频器进行分频,这个和定时器的预分频器,独立看门狗的预分频器都是一个作用。就是灵活的,调节后面的时钟频率,同时预分频系数,也是计算计数器溢出时间的重要参数。之后分频的时钟,驱动递减计数器进行计数,来一个时钟自减一次。不过这个计数器比较特殊,从图上来看,这里写了T6-T0,总共是7个位。但是下面写的却是6位递减计数器。这是因为这个计数器,只有T5-T0这六位是有效的计数值。最高位T6用来当作溢出标志位。T6位等于1时表示最高位没有溢出。T6位等于0时表示计数器溢出。不过对于硬件电路来说,T6位也是计数器的一部分。

如果我们一开始全部写入0,然后进行自减,当其余六位都减到0的时候,此时T6是1,在减的话,T6变为0,其余位变为1,代表计数器溢出。

这时最高值T6就会通过这个线路,产生复位信号。这就是这个计数器的工作流程和溢出条件。总结一下,如果你把T6位看作计数器的一部分。那就是整个计数器值减到0x40之后,才会溢出。而如果你把T6位当作溢出标志位。低六位当作计数器,那就是低6位的计数值,减到0之后溢出。

之后看复位信号的输出部分,首先是WDGA是窗口看门狗的激活位,也就是使能,WDGA写入1,启用窗口看门狗。使能位作用与这个与门,与门的逻辑关系就是全1出1,有0出0。
右边的控制信号,这里有两个来源用或门连接。也就是两个来源,任意一个都可以复位。下面的一路来源于溢出标志位T6,当计数器溢出时,T6为0,经过非门变为1。输出为1,开启看门狗后,这个溢出信号就通向复位了。
如果不及时喂狗,那么这个计数器就会一直减,减到T6为0,就会复位。
喂狗的最早界限是由上面这一块实现。首先我们要计算一个最早界限的计数值。写入这里的W6-W0之中。这些值写入之后是固定不变的。之后这里一旦我们执行写入CR操作时这个与门开关就会打开。写入CR其实就是写入计数器,也就是喂狗,在喂狗时,这个比较器开始工作,一旦他开始比较,我们当前的计数器T6-0>窗口值W6-0,比较结果就等于1。这个1通过或门,也可以申请复位。这就是喂狗最早时间窗口的实现流程。
就是喂狗的时候,我把当前计数值,和预设窗口值进行比较。如果发现够余粮充足,你喂的这么频繁,那肯定是有问题。我就复位一下,不让你喂太早了。
比较的不是写入的值,而是现在还剩的值,若大于W说明当前值还没减次呢,现在重置的话太早,喂狗太早会复位,不喂狗也会复位,只有在特定的时间喂狗,才不会复位。
4.窗口看门狗工作特性
第二条的意思就是不能过早喂狗。
第三条的意思,是=0x40时候可以产生早期的唤醒中断,而,第一条是,小于0x40时,才能产生复位。0x40这时候T6还是1还没有溢出,再减一个数变为0x3F之后才会溢出。,所以说这里的意思就是,减到0x40时,产生一个中断,然后再次减一个数,变为0x3F时,产生复位。所以说这个中断是在溢出的前一刻发生的。所以这个中断也被称作死前中断。马上就要溢出中断了,再提醒一下你,要不要干点啥。所以在这个早期唤醒中断里,我们一般可以用来执行一些紧急操作。比如保存重要数据,关闭危险设备等等。也可以在这个超时系统里直接喂狗,然后给系统提示一些信息就可以了。

看图就可以得知,再写入CNT之后,CNT开始自减,如果CNT没有减少到W6-0这个窗口值的话,就不能喂狗,也就是图下面的不允许刷新。之后当计数值小于窗口值了进入到刷新窗口,可以喂狗,当然,喂狗也不能太晚,要在减到3F之前喂3F这个值就是T6位,刚等于0的时刻,所以下面的图,T6位在这个时刻变为0,同时复位信号也在这里产生。
5.窗口看门狗的超时时间
超时时间是喂狗的最晚时间,窗口时间是喂狗的最早时间。

这里×一个4096的原因是PCLK1再进入到看门狗预分频器之前,先执行了一个固定的4096分频。因为36M频率还是太快了,所以来个固定地分频给降一降。
然后分频系数=2的WTGB次方。然后后面的计算是T5-0之前我们都是T6-0,这是需要注意的。
窗口时间的话,上面是计数器减到0的时间,下面是计数器减到窗口值的时间。
6.窗口看门狗和独立看门狗的区别

三.手册查询

主要是手册的这里,窗口看门狗和独立看门狗。

之后还有硬件看门狗。

之后是还有注意事项。

之后是键寄存器。这里可以看到只有启用看门狗的,没有关闭看门狗的,实际上,看门狗一旦启用,就无法关闭了。

可以看到,看门狗的CNT计数器,并没有提供给我们进行读写。所以看门狗运行的时候,内部计数器记录到那个值了。我们是不知道的。不过影响不大。

然后就是窗口看门狗。注意的是,我们首次开启看门狗的时候,一定要给一个重装值并且T6位给1。防止刚开的时候立刻就复位了。

最后就是寄存器描述,大家可以看看。