看门狗:
看门狗是一种计时硬件电路。
**作用:**当系统环境比较恶劣复杂的时候,程序可能会出现一些不可预料的错误,导致程序卡死,崩溃等情况。看门狗就可以及时的重置程序,使程序重新从头开始运行。
STM32 有2个看门狗,独立看门狗和**窗口看门狗,**独立看门狗号称宠物狗,窗口看门狗号称警犬。(是根据精度来定义命名的)
独立看门狗 :
IWDG(Independent watchdog,独立看门狗),独立看门狗用通俗一点的话来解释就是一个12 位的递减计数器,当计数器的值从某个值一直减到 0 的时候,系统就会产生一个复位信号,即 IWDG_RESET,如果在计数没减到 0 之前,刷新了计数器的值的话,那么就不会产生复位信号,这个刷新计数器值的动作就是我们经常说的喂狗。
独立看门狗的计数器是一个 12 位的递减计数器,最大值为 0XFFF,最小值 0 。
窗口看门狗号:
- WWDG(Window watchdog,窗口看门狗),窗口看门狗跟独立看门狗一样,也是一个递减计数器不断的往下递减计数,当计数器减到一个固定值 0x40(T6位减到0)时还不喂狗的话,产生复位,这个值叫窗口的下限,是固定的值,不能改变,这个是跟独立看门狗类似的地方。不同的地方是窗口看门狗的计数器的值在减到某一个数之前喂狗的话也会产生复位,这个值叫窗口的上限,上限值由用户独立设置,窗口看门狗计数器的值必须在上窗口和下窗口之间才可以喂狗,喂早了喂晚了都不行,这就是窗口看门狗中窗口两个字的含义。
 - 比如:上/下限:(10,5),如果在 10 之前喂狗也会产生复位,只能在 5-10 之间喂狗才不会产生复位。
 - 窗口看门狗的计数器是一个递减计数器,共有 7 位,其值存在控制寄存器 CR 的 T[6:0] 位,当 7 个位全部为 1 时是 0X7F,这个是最大值。
 - 当递减到 T6 位变成 0 时,即从 0X40 变为 0X3F 时候,会产生看门狗复位。值 0X40 是看门狗能够递减到的最小值,所以计数器的值只能是:0X40~0X7F 之间。
 - 当递减计数器递减到 0X40 的时候,不是马上产生复位,如果使能了提前唤醒中断:CFR 位 9 (EWI) 置 1,则产生提前唤醒中断,如果真进入了这个中断的话,就说明程序肯定是出问题了,那么在中断服务程序里面我们就需要做最重要的工作,比如保存重要数据,或者报警等,这个中断我们也叫它死前中断。
 
对比:
| 独立看门狗 | 窗口看门狗 | |
|---|---|---|
| 复位 | 计数减到0 | 计数器减到0X40和过早重装计数器 | 
| 喂狗方式 | 键寄存器写入0xAAAA,重装固定值RLR | 直接写入寄存器,写多少重装多少 | 
| 中断 | 无 | 死前中断 | 
| 时钟源 | LSI(40KHz) | PCLK1(36MHz) | 
| 预分频系数 | 4,8,32,64,128,256 | 1,2,4,8 | 
| 计数器 | 12位 | 6位 | 
| 超时时间 | 0.1ms到26214.4ms | 113us到58.25ms | 
| 用途 | 独立工作,对时间精度要求比较低 | 要求看门狗在计时窗口起作用 |