看门狗
一、
独立看门狗一般用来检测和解决由程序引起的故障,比如一个程序正常运行的时间是50ms,在运行完这个段程序之后紧接着进行喂狗,我们设置独立看门狗的定时溢出时间为60ms,比我们需要监控的程序 50ms 多一点,如果超过 60ms 还没有喂狗,那就说明我们监控的程序出故障了,跑飞了,那么就会产生系统复位,让程序重新运行。
STM32 有两个看门狗,一个是独立看门狗另外一个是窗口看门狗,独立看门狗号称宠物狗,窗口看门狗号称警犬,本章我们主要分析独立看门狗的功能框图和它的应用。独立看门狗用通俗一点的话来解释就是一个 12 位的递减计数器,当计数器的值从某个值一直减到0的时候,系统就会产生一个复位信号,即 IWDG RESET。如果在计数没减到 0之前,刷新了计数器的值的话,那么就不会产生复位信号,这个动作就是我们经常说的喂狗。看门狗功能由 VDD 电压域供电,在停止模式和待机模式下仍能工作。
二、
void iwdg_init() { if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET) { RCC_ClearFlag(); //清除标志 } //溢出时间 Tout = prv/40 * rlv = 64/40 * 625 = 1000 ms = 1s //使能预分频寄存器PR和重装载寄存器RLR可写 IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); IWDG_SetPrescaler(IWDG_Prescaler_64); //prv //设置重装载寄存器值 IWDG_SetReload(625);//rlv //把重装载寄存器的值放到计数器中 IWDG_ReloadCounter(); //喂狗 IWDG_Enable(); //使能独立看门狗 } void iwdg_feed() { //把重装载寄存器的值放到计数器中,喂狗,防止IWDG复位 //当计数器的值减到0的时候会产生系统复位 IWDG_ReloadCounter(); } int main(void) { Init_GPIO(); iwdg_init(); LED_R_ON; while(1) { if(KEY_0_READ)//按键喂狗 { //喂狗,如果不喂狗,系统则会复位,红灯闪烁 //在时间准时喂狗的话,则绿灯会常亮 iwdg_feed(); LED_G_ON; } } }