WDG(Watchdog)看门狗
作用:
看门狗可以监控程序的运行状态,当程序因为设计漏洞、硬件故障、电磁干扰等原因,出现卡死或跑飞现象时,看门狗能及时复位程序,避免程序陷入长时间的罢工状态,保证系统的可靠性和安全性。
看门狗本质上是一个定时器,当指定时间范围内,程序没有执行喂狗(重置计数器)操作时,看门狗硬件电路就自动产生复位信号。
STM32内置两个看门狗
- 独立看门狗(IWDG):独立工作,对时间精度要求较低
- 窗口看门狗(WWDG):要求看门狗在精确计时窗口起作用
独立看门狗 最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精 度要求较低的场合。 窗口看门狗 最适合那些要求看门狗在精确计时窗口起作用的应用程序。
独立看门狗(IWDG)
主要性能
- 自由运行的递减计数器
- 时钟由独立的RC振荡器提供 (可在停止和待机模式下工作)
- 看门狗被激活后,则在计数器计数至0x000时产生复位
功能框图
看门狗功能处于VDD供电区,即在停机和待机模式时仍能正常工作。
键寄存器
- 键寄存器本质上是控制寄存器,用于控制硬件电路的工作
- 在可能存在干扰的情况下,一般通过在整个键寄存器写入特定值来代替控制寄存器写入一位的功能,以降低硬件电路受到干扰的概率
写入键寄存器的值 | 作用 |
0xCCCC | 启用独立看门狗 |
0xAAAA | IWDG_RLR中的值重新加载到计数器(喂狗) |
0x5555 | 解除IWDG_PR和IWDG_RLR的写保护 |
0x5555之外的其他值 | 启用IWDG_PR和IWDG_RLR的写保护 |
超时时间
- 超时时间:TIWDG = TLSI × PR预分频系数 × ( RL + 1)
- 其中:TLSI = 1 / FLSI
- TIWDG =1/ 40 *1000 × PR预分频系数 × ( RL + 1) ----RL =(11位,最大4095)
初始化代码
/*IWDG初始化*/
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //独立看门狗写使能
IWDG_SetPrescaler(IWDG_Prescaler_16); //设置预分频为16
IWDG_SetReload(2499); //设置重装值为2499,独立看门狗的超时时间为1000ms
IWDG_ReloadCounter(); //重装计数器,喂狗
IWDG_Enable(); //独立看门狗使能
窗口看门狗(WWDG)
窗口看门狗通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运
行序列而产生的软件故障。
主要特性
- 递减计数器T[6:0]的值小于 0x40 时,WWDG产生复位
- 递减计数器T[6:0]在窗口W[6:0]外被重新装载时,WWDG产生复位
- 递减计数器T[6:0]等于0x40时可以产生早期唤醒中断(EWI),用于重装载计数器以避免WWDG复位
- 定期写入WWDG_CR寄存器(喂狗)以避免WWDG复位
框图
如果看门狗被启动
(WWDG_CR
寄存器中的
WDGA
位被置
’1’)
, 并且当
7
位
(T[6:0])
递减计数器从0x40翻转到
0x3F(T6
位清零
)
时,则产生一个复位。如果软件在计数器值大于窗口寄存器中的数
值时重新装载计数器,将产生一个复位。
应用程序在正常运行过程中必须定期地写入
WWDG_CR
寄存器以防止
MCU
发生复位。只有当计数器值小于窗口寄存器的值时,才能进行写操作。
超时时间
- 超时时间: TWWDG = TPCLK1 × 4096 × WDGTB预分频系数 × ( T[5:0] + 1 )
- 窗口时间: TWIN = TPCLK1 × 4096 × WDGTB预分频系数 × ( T[5:0] - W[5:0] )
其中:TPCLK1 = 1 / FPCLK1
初始化代码
/*开启时钟*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);//开启WWDG的时钟
/*WWDG初始化*/
WWDG_SetPrescaler(WWDG_Prescaler_8); //设置预分频为8
WWDG_SetWindowValue(0x40 | 21); //设置窗口值,窗口时间为30ms
WWDG_Enable(0x40 | 54); //使能并第一次喂狗,超时时间为50ms
IWDG和WWDG对比