一.WDG简介
WDG(Watchdog)看门狗
看门狗可以监控程序的运行状态,当程序因为设计漏洞、硬件故障、电磁干扰等原因,出现卡死或跑飞现象时,看门狗能及时复位程序,避免程序陷入长时间的罢工状态,保证系统的可靠性和安全性 看门狗本质上是一个定时器,当指定时间范围内,程序没有执行喂狗(重置计数器)操作时,看门狗硬件电路就自动产生复位信号 STM32内置两个看门狗
独立看门狗(IWDG):独立工作,对时间精度要求较低 窗口看门狗(WWDG):要求看门狗在精确计时窗口起作用
键寄存器本质上是控制寄存器,用于控制硬件电路的工作 在可能存在干扰的情况下,一般通过在整个键寄存器写入特定值来代替控制寄存器写入一位的功能,以降低硬件电路受到干扰的概率
写入键寄存器的值 | 作用 |
0xCCCC | 启用独立看门狗 |
0xAAAA | IWDG_RLR中的值重新加载到计数器(喂狗) |
0x5555 | 解除IWDG_PR和IWDG_RLR的写保护 |
0x5555之外的其他值 | 启用IWDG_PR和IWDG_RLR的写保护 |
二.超时时间
例如要设置超时时间是1000ms,TLSI=1/FLSI=1/40kHz=0.025ms,所以预分频系数4和8太小,达不到1000,选16分频。PR预分频16,最后算RL,1000/0.025/16-1=2499
三.窗口看门狗
设置超时时间是50ms,窗口时间是30ms,因为超时时间是50ms只能选择WDGTB预分频系数是3,FPCLK1=36Mhz。算出T[5:0],这里只有5位,还要去加上一个标志位的值。
算出T[5:0]和WDGTB,在来算W[5:0],窗口时间就很轻松了。W[5:0]给21,还要去或上0x40给第六位标志位。
四.代码
int main(void)
{
KEY_Init();
OLED_Init();
OLED_ShowString(1,1,"IWDG TEST:");
if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST)==SET)
{
OLED_ShowString(2,1,"IWDGRST");
Delay_ms(500);
OLED_ShowString(2,1," ");
Delay_ms(100);
RCC_ClearFlag();
}
else
{
OLED_ShowString(3,1,"RST");
Delay_ms(500);
OLED_ShowString(3,1," ");
Delay_ms(100);
}
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//解除写保护
IWDG_SetPrescaler(IWDG_Prescaler_16);//配置预分频
IWDG_SetReload(2499);//配置重装值
IWDG_ReloadCounter();
IWDG_Enable();
while (1)
{
Key_GetNum();//按键一直按下,发生阻塞看门狗复位
IWDG_ReloadCounter();//不断喂狗
OLED_ShowString(4,1,"FEED");
Delay_ms(200);
OLED_ShowString(4,1," ");
Delay_ms(600);
}
}
int main(void)
{
KEY_Init();
OLED_Init();
OLED_ShowString(1,1,"WWDG TEST:");
if(RCC_GetFlagStatus(RCC_FLAG_WWDGRST)==SET)
{
OLED_ShowString(2,1,"WWDGRST");
Delay_ms(500);
OLED_ShowString(2,1," ");
Delay_ms(100);
RCC_ClearFlag();
}
else
{
OLED_ShowString(3,1,"RST");
Delay_ms(500);
OLED_ShowString(3,1," ");
Delay_ms(100);
}
//超时时间50ms,窗口时间30ms,喂狗时间在30ms-50ms
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);
WWDG_SetPrescaler(WWDG_Prescaler_8);
WWDG_SetWindowValue(21|0x40);
WWDG_Enable(0x40|54);//还有一个第六位标志位也要加上去
while (1)
{
Key_GetNum();
OLED_ShowString(4,1,"FEED");
Delay_ms(20);
OLED_ShowString(4,1," ");
Delay_ms(20);//20+20
WWDG_SetCounter(0x40|54);//喂狗
}
}