1 看门狗基础知识
1.1 看门狗的概念
看门狗(WDT)是一个定时器,开启看门狗定时器之后(比如定时100ms),在单片机程序中每隔一段时间(小于100ms)就要"喂狗"一次,即将看门狗定时器清零。这样做的用处是,一旦单片机程序跑飞,没有在定时的时间之内去喂狗,那么定时达到200ms时,看门狗自动将单片机复位。
在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片,俗称“看门狗”(watchdog)。
根据功能不同,通常分为独立看门狗和窗口看门狗。因为独立看门狗受工作场合因素的影响会多一点,仅适用于一些对时间精度要求较低的场合;窗口看门狗适用于对时间精度高的场合。
1.2 独立看门狗(IWDG)
1.2.1 IWDG简介

1.2.2 IWDG寄存器
IDWG主要用到三个寄存器,一个预分频寄存器(IWDG_PR),键寄存器(IWDG_KR),重载寄存器(IWDG_RLR)。
键寄存器(IWDG_KR)
键寄存器是独立看门狗的控制寄存器。下面是使用其的规则:
1. 写入0xCCCC,开始启用独立看门狗,计数器开始从复位值0xFFF递减计数,当计数器计数到0x000时开始产生复位信号。
2. 写入0xAAAA,IWDG_RLR中的值会被加载到计数器中从而避免复位。
3. 需要先写入0x5555,IWDG_PR和IWDG_RLR的值才能修改,如果将其他值写入这个寄存器将会打乱操作顺序,寄存器将会重新被保护。


1.2.3 独立看门狗的溢出时间计算
1.2.4 独立看门狗的配置步骤
1. 取消寄存器保护,向键寄存器写入0x5555, 然后设置预分频系数和重装载值。2. 在键寄存器写入0xCCCC,开始启动看门狗,计数器从0xFFF开始计数。3. 在溢出时间内重载计数值喂狗,把0xAAAA写入到键寄存器,从而触发计数器重载也就是喂狗,否则发生复位。
1.3 窗口看门狗(WWDG)
1.3.1 WWDG简介
窗口看门狗(WWDG)通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。窗口看门狗跟独立看门狗一样,也是一个递减计数器不同的是它们的复位条件不一样。窗口看门狗产生复位信号有两个条件:
1) 当递减计数器的数值减到0x40时还不喂狗的时候,到下一个计数0X3F就会产生复位,这个值称为窗口的下限值,这个是固定的值,不能改变。
2) 当喂狗的时候如果计数值大于看门狗配置寄存器WWDF_CFR的低七位数值,也会产生复位,这个值叫窗口的上限,上限值由用户设置。,这个数值要大于0x40.
1.3.2 WWDG框图
1.3.3 WWDG寄存器
控制寄存器(WWDG_CR)


1.3.4 窗口看门狗配置步骤
1. 使能WWDG时钟,WWDG时钟与IWDG不同,IWDG有自己独立的40kHZ时钟,而WWDG使用的是PCLK1的时钟,需要先使能时钟。
2. 设置窗口值,分频数和计数器初始值
3. 开启WWDG,通过设置控制寄存器的WDGA(bit7)位为1实现开启窗口看门狗
4. 使能中断通道和配置优先级(如果开启了WWDG中断),如果在配置寄存器中将
EWI 位置1则需要开启中断函数使能并设置相应优先级,并编写相应的中断服务函 数。
5.在相应的窗口时间内喂狗,如果使能了中断可以在中断回调函数中进行喂狗,但是
喂狗要快,否则当窗口看门狗计数器值减到 0X3F 的时候,就会引起软复位了。
1.3 独立看门狗和窗口看门狗的区别
1. 独立看门狗没有中断,窗口看门狗有中断。独立看门狗没有中断功能,只要在计数器减到0(下限)之前,重新装载计数器的值,就不会产生复位,窗口看门狗有中断,这个中断的作用是在计数器达到下限0x40的时候,产生中断,让你喂狗;如果你不喂狗,计数器的值变为0x3f的时候,将会产生系统复位;即使是喂狗,也应该在中断里快速喂狗,要不时间长了计数器减1也会变成0x3f产生复位。
2. 窗口看门狗有上限和下限值,独立看门狗只有下限。窗口看门狗还有一个上限值,这个值如果大于计数器的初始值,那么就没有任何作用了;这个值小于计数器初始值的时候,当计数器的值大于上限值时你对计数器进行装载,将会产生复位,只有在计数器减到小于上限值时,你才能重新装载计数器。意思就是说只有计数器的值在上限值和下限值之间你才能装载计数器,否则就会产生系统复位,当上限值小于下限值,也没有意义。
3. 独立看门狗是12位递减,独立看门狗从0xFFF开始递减,窗口看门狗的初始值是七位递减,初始值需要自己设置,最大为0x7F.
4.独立看门狗使用的是内部大约为40kHZ的RC振荡器,窗口看门狗使用的是系统时钟APB1CLK。
5. 独立看门狗一般用于避免程序跑飞或者死循环,窗口看门狗避免程序不按预定逻辑执行,比如先于理想环境完成,或者后于极限时间超时。
常见面经
1. 什么是嵌入式系统中的看门狗定时器(Watchdog Timer)?
看门狗本质是一个定时器电路,一般有一个输入叫“喂狗”,一个输出连接到MCU的复位端。在MCU正常工作的时候,每隔一段时间输出一个信号到喂狗端,给看门狗电路清零,如果在超过规定的时间不喂狗,WDT定时超时,就会回给一个复位信号到达MCU,使MCU复位,MCU认为系统故障,会进入中断处理程序或强制系统复位。。
2. 看门狗的作用是什么?
答:在系统跑飞或者系统运行错误后无法喂狗时,看门狗超时重启系统,恢复正常程序逻辑。
3. 看门狗的原理是什么?
看门狗的工作原理:在整个系统运行以后就启动了看门狗的计数器,此时看门狗就开始自动计时,如果到达了一定的时间还不去给它清零,看门狗计数器就会溢出从而引起看门狗中断,造成系统的复位。
4. 窗口看门狗和独立看门狗的区别?
- 独立看门狗没有中断,窗口看门狗有中断。窗口看门狗可以通过设置配置寄存器的提前唤醒中断位实现在计数器减少到0x40时产生中断,可以通过这个中断实现按时喂狗。
- 独立看门狗有软件硬件之分,窗口看门狗只能软件控制。
- 窗口看门狗有上限和下限值,独立看门狗只有下限。独立看门狗计数器减少为0会产生复位,窗口看门狗计数器在窗口上限值(自己设置)和下限值(0x40)内喂狗就不会产生复位。
- 独立看门狗是12位递减,独立看门狗从0xFFF开始递减,窗口看门狗的初始值是七位递减,初始值需要自己设置,最大为0x7F.
- 独立看门狗使用的是内部大约为40kHZ的RC振荡器,窗口看门狗使用的是系统时APB1CLK。
- 独立看门狗一般用于避免程序跑飞或者死循环,窗口看门狗避免程序不按预定逻辑执行,比如先于理想环境完成,或者后于极限时间超时。
链接