一、看门狗的介绍
(1)独立看门狗(IWDG):独立看门狗由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。因此叫独立,同时因此在低功耗模式下不能启动看门狗,低功耗详情见之前文章。IWDG比WWDG更精确。只要没有到时间,都能喂狗。IWDG挂载在LSI上
(2)窗口看门狗(WWDG):设置一个窗口值,窗口下限一般是定死的,窗口上限可以自定义(肯定要比自动重装载值小),只有在这个窗口内喂狗才行,否则将引起芯片复位。WWDG最适合那些要求看门狗在精确计时窗口起作用的应用程序。严格限定喂狗时间段。WWDG挂载在APB1总线上。
T[6:0]就是 WWDG_CR 的低七位,W[6:0]即是 WWDG->CFR 的低七位。T[6:0]就是窗口看门狗的计数器,而 W[6:0]则是窗口看门狗的上窗口,下窗口值是固定的(0X40)。当窗口看门狗的计数器在上窗口值之外被刷新,或者低于下窗口值都会产生复位。上窗口值(W[6:0])是由用户自己设定的,根据实际要求来设计窗口值,但是一定要确保窗口值大于 0X40,否则窗口就不存在了。
二、独立看门狗配置
//看门狗初始化
void MX_IWDG_Init(void)
{
hiwdg.Instance = IWDG;
hiwdg.Init.Prescaler = IWDG_PRESCALER_4;
hiwdg.Init.Reload = 4095;
if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
{
Error_Handler();
}
}
//需要511ms以内喂狗
HAL_IWDG_Refresh(&hiwdg);
三、窗口看门狗配置
也就是程序不得早于14.336ms进行刷新,不得晚于65.536ms进行刷新。否则系统将会产生复位。在窗口刷新喂狗示意图如下。 32000的值由来是APB1时钟
//窗口看门狗初始化
void MX_WWDG_Init(void)
{
hwwdg.Instance = WWDG;
hwwdg.Init.Prescaler = WWDG_PRESCALER_8;
hwwdg.Init.Window = 113;
hwwdg.Init.Counter = 127;
hwwdg.Init.EWIMode = WWDG_EWI_ENABLE;
if (HAL_WWDG_Init(&hwwdg) != HAL_OK)
{
Error_Handler();
}
}
//测试代码
HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_SET);//关灯
while (1)
{
HAL_Delay(50);//14-65ms以内喂狗,则不会产生看门狗复位
HAL_WWDG_Refresh(&hwwdg);
HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_RESET);//开灯
}
看门狗复位的现象就是灯长灭