一、独立看门狗和窗口看门狗
看门狗:单片机系统在外界的干扰下会出现程序跑飞的现象导致死循环,或者崩溃,看门狗电路就是为了避免这种情况的发生,看门狗的作用就是在一定的事件内(通过计数器实现)若没有收到喂狗信号(表示MCU已经挂了),便实现处理器的自动复位重启(发送复位信号)
独立看门狗IWDG:独立于系统之外,因为有独立时钟30-60KHz,所以是不受系统影响的系统故障检测器,主要用于监视硬件错误。
窗口看门狗WWDG:系统内部的故障探测器,时钟与系统相同。如果系统时钟不走了,这个狗也就失去了作用,主要用于监视软件错误
二、两者区别
窗口看门狗实际上是设置一个窗口(上下限),这个范围内,你才允许喂狗,只要不在这个范围内,都会复位。独立看门狗只要规定的时间没到,都可以喂狗。
窗口看门狗计时的时间比独立看门狗精准,窗口看门狗使用的是系统时钟源。
三、软件设计(独立看门狗)
子函数
1 #include "iwdg.h" 2 //时间计算(大概):Tout=((4*2^prer)*rlr)/40 (ms). 3 void IWDG_Init(u8 prer, u16 rlr) 4 { 5 IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能对寄存器IWDG_PR和IWDG_RLR的写操作 6 IWDG_SetPrescaler(prer); //设置IWDG预分频值:64 7 IWDG_SetReload(rlr); //设置IWDG重装载值 8 IWDG_ReloadCounter(); //按照IWDG重装载寄存器的值重装载IWDG计数器 9 IWDG_Enable(); //使能IWDG 10 } 11 void IWDG_Feed(void) 12 { 13 IWDG_ReloadCounter();//reload喂狗 14 }
主函数
1 #include "led.h" 2 #include "key.h" 3 #include "delay.h" 4 #include "sys.h" 5 //#include "beep.h" 6 #include "iwdg.h" 7 8 int main(void) 9 { 10 delay_init(); 11 LED_Init(); 12 KEY_Init(); 13 //BEEP_Init(); 14 delay_ms(200); 15 IWDG_Init(4,625); 16 LED0 = 0; 17 while(1) 18 { 19 if(Key_Value(0)==WK_UP_DOWN) 20 { 21 IWDG_ReloadCounter(); //喂狗 22 } 23 delay_ms(10); 24 } 25 }