目录
提示:以下是本篇文章正文内容,下面案例可供参考
一、WDG简介
在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog) 。
在启动正常运行的时候,系统不能复位,可以通过看门狗来复位单片机。
在系统跑飞(程序异常执行)的情况,系统复位,程序重新执行。
具有两个嵌入式看门狗外设,具有安全性高、定时准确及使用灵活的优点。两个看门狗外设(独立和窗口)均可用于检测并解决由软件错误导致的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。
二、IWDG和WWDG
1.IWDG框图
看门狗本质就是定时器,它的结构和定时器是非常相似的。
定时器溢出产生更新事件和中断。而看门狗定时器溢出,直接产生复位信号。
重装值:定时器是在更新事件重装,而看门狗需要我们自减到0之前,手动重装
喂狗操作:其实也就是重置一下递减计数器。递减计数器,减到0之后就复位,当程序正常运行时,为了避免复位,就得在这个计数器减到0之前,及时地把计数值加大,即喂狗。如果你程序卡死了,没有加大这个计数器,那减到0之后就自动复位了,这就是看门狗的工作逻辑。
IWDG(独立看门狗)特点:独立运行,对时间精度要求较低。(独立看门狗也是唤醒待机模式的四个条件之一)
独立运行,就是独立看门狗的时钟是专门的LSI,内部低速时钟,即使主时钟出现问题了,看门狗也能正常工作。对时间精度要求低,就是独立看门狗只有一个最晚时间界限,喂狗间隔不超过这个最晚界限就行了。
IWDG键寄存器:
键寄存器本质上就是控制寄存器,比如喂狗操作就是在键寄存器写入0xAAAA完成的。
那为什么要用键寄存器呢?
独立看门狗工作环境是程序可能跑飞,可能受到电磁干扰,程序做出任何操作都是有可能的。如果你只在寄存器中设置一个位,那这一位就有可能在误操作中变成1,或者变成0。所以单独设置1位就来执行控制,比较危险。这时,我们就可以通过在整个寄存器写入一个特定值来代替写入一个位的操作。0xAAAA(1010 1010 1010) ,0xCCCC(1100 1100 1100 1100) ,0x5555,这些都是很刁钻的值,都是1,0交替混合的键值。
IWDG框图中,还有PR,SR和RLR三个寄存器,它们也要有防止误操作的功能,SR是只读的,这个不用保护,剩下的对PR和RLR的写操作,可以设置一个写保护措施,然后只有在键寄存器写入0x5555,才能解除写保护。一旦写入其他值,PR和RLR再次被保护,这样PR和RLR就跟随键寄存器一起被保护了起来,防止误操作,这就是键寄存器设计的用途。
IWDG的超时时间
超时时间T = TLSI x PR预分频系数 x(RL+1) 对应定时器的话就是72M(PSC+1)(ARR+1)
TLSI = 0.025ms
每隔0.025ms来一个输入时钟,之后输入时钟进行分频,相当于计数时间加倍,加多少倍呢?
图中是PR寄存器和分频系数的对应关系,这里并不是PR写几,就是几+1分频,它只有表中这几个固定的分频系数,比如PR写入2,那就是16分频,对应的就是计数时间就要乘16。
最后RL,就是RLR(计数目标)乘个RL+1就是最终的超时时间了。
例:TLSI是固定的0.025ms,PR写入0时,预分频是4,最短时间RL给0,最后RL+1是1,所以
0.025ms x 4 x(0+1)=0.1ms
最长时间:(RL最大值为0xFFF即4095)
0.025ms x 4 x(4095+1) = 409.6ms
从图中整体来看,最短时间和最长时间,都是上一个预分频系数的二倍。
2.WWDG框图
WWDG(窗口看门狗)特点:要求看门狗在精确计时窗口起作用,意思就是喂狗的时间有个最晚时间界限,也有最早的界限,必须在这个界限的窗口内喂狗。这也是窗口看门狗,窗口,的得名原因。对于独立看门狗来说,可能程序就卡死在喂狗的部分,或者程序跑飞,但是喂狗代码也意外执行了,或者程序有时候很快喂狗,有时候又比较慢喂狗,那这些状态,独立看门狗就检测不到了,但是窗口看门狗是可以检测到这些问题的。因为它对喂狗的时间窗口,可以卡的很死。
窗口看门狗使用的是APB1的时钟,它没有专用的时钟,所以不算独立。
工作流程:
时钟来源:PCLK1,也就是APB1的时钟(这个时钟默认36MHz)
看门狗预分频器(WDGTB):时钟进来之后先经过预分频器进行分频(调节时钟频率)。
递减计数器:分频之后的时钟,驱动递减计数器进行计数,这个计数器比较特殊,只有T5~T0这六位是有效的计数值,最高位T6,这里用来当作溢出标志位。T6位等于1时,表示计数器没溢出,T6位等于0时,表示计数器溢出。
复位信号输出部分:图中左边,首先WDGA,是窗口看门狗的激活位,WDGA写入1,也就是使能,启动窗口看门狗,使能位作用于这个与门,与门右边就是复位信号的来源了,这里有两个来源,用或门连接,也就是两个来源任意一个,都可以复位
来源1溢出标志位T6:当计数器溢出时T6等于0,然后输入进去,这里或门有个小圆圈,代表输入取反所以0变为1,或门有效 输出1。当WDGA这个使能位给1,开启看门狗后,这个溢出信号就直接通向复位了。所以这一路的意思就是T6位一旦等于0,即表示计数器溢出,就产生复位信号,那在程序正常运行状态下,我们必须始终保证T6位为1,这样才能避免复位。
来源2看门狗配置寄存器:喂狗时间的最早界限由图中上面部分来实现。首先我们需要计算一个最早界限的计数值,写入到这里的W6~W0中,这些值,写入之后是固定不变的。一旦我们执行写入WWDG_CR操作时,图中连接比较器的与门开关就会打开。写入WWDG_CR,其实就是写入计数器,也就是喂狗,在喂狗时,比较器开始工作,比较两个寄存器(CFR和CR)的0~6位,当计数器T6:0>窗口值W6:0时比较结构就为1,通过或门去申请复位,这就是喂狗最早时间窗口的实现流程。
就是喂狗的时候,我把当前计数值和我预设的窗口值进行比较,如果发现狗余粮还非常充足时,你喂的那么频繁,那么肯定有问题啊,我帮你复位一下,不让你喂太早了。
与门:它的作用类似一个开关,左边是控制信号,右边是输入,上边是输出。
控制信号给1,则输出等于输入,开关导通。
控制信号给0,则输出等于0,与输入无关,开关断开。