看门狗可分为硬件看门狗和软件看门狗两种。
硬件看门狗的主体是一个定时电路,并由被监控CPU提供周期性“喂狗”信号,对定时器清零(俗称“清狗”)。CPU正常工作时,由于能定时“清狗”,看门狗内的定时器不会溢出。当CPU出现故障,则不能继续提供“清狗”信号,使得看门狗内定时器不断累加而溢出,从而触发一个复位信号对CPU进行复位,使CPU重新工作。
软件看门狗原理上一样,只是将硬件电路上的定时器用处理器的内部定时器代替,这样可以简化硬件电路设计,但在可靠性方面不如硬件定时器,比如系统内部定时器自身发生故障就无法检测到。当然也有通过双定时器相互监视,这不仅加大系统开销,也不能解决全部问题,比如中断系统故障导致定时器中断失效。
看门狗本身不是用来解决系统出现的问题,在调试过程中发现的故障应该要查改设计本身的错误。加入看门狗目的是对一些程序潜在错误和恶劣环境干扰等因素导致系统死机而在无人干预情况下自动恢复系统正常工作状态。看门狗也不能完全避免故障造成的损失,毕竟从发现故障到系统复位恢复正常这段时间内是不能正常工作的。同时一些系统也需要复位前保护现场数据,重启后恢复现场数据,这可能也需要一笔软硬件的开销。
常用的看门狗芯片有ADM706/MAX706/SP706,这几种芯片的封装方式一样,如下图所示:
1).MR#:Manual-Reset,手动复位输入信号,低电平有效,当此管脚的输入电平低于0.6V时,会触发Reset#管脚输出一个复位信号,此管脚内部有70uA上拉电流。如要不使用此管脚,需要将此管脚接到VCC或者悬空,不可接地;
2).VCC:芯片工作电压,接5V或3.3V;
3).GND:芯片参考地,直接与单板GND相连;
4).PFI:Power-FailComparatorInput,电压监控输入管脚,当此管脚的输入电压低于1.25V时,FPO#及Reset#会输出低电平信号;
5).PFO#:Power-FailOutput,电压监控输出管脚,当PFI的输入电平低于1.25V时,输出低电平,不使用此管脚时可将其悬空;
6).WDI:WatchdogInput,清狗信号输入,WDI遇到一个上升沿/下降沿,内部看门狗定时器都将清0。WDI的输入信号超过1.6S不发生跳变时,看门狗内部定时器将会溢出并触发WDO#输出低电平;
7).WDO#:WatchdogOutput,看门狗输出,WDI超过1.6S不发生跳变时,WDO#将输出低电平,另外,VCC低于1.25V时也会触发WDO#输出低电平;
8).RESET#:复位信号输出,低电平有效,低电平宽度为200ms,Reset#信号只会被VCC或MR#触发,WDO#有效时不会触发Reset#,除非将WDO#接到RESET#上。
MAX/ADM706芯片的功能框图如下所示:
虽然MAX706与ADM706芯片在封装上相互兼容,但两者还是存在一些差异,具体如下:
1).MAX706R是商业级器件,工作温度范围为:0-70oC,而ADM706R是工业级器件,工作温度范围为:-40-85oC,所以大家在选型的时候,一定要产品的工作环境是否对温度有要求;
2).MAX706R的最小复位脉冲宽度为140ms,ADM706R的最小脉冲宽度为160ms;
3).ADM706R的WDI管脚若悬空处于高阻状态时会禁止芯片工作,所以设计时,需要将WDI管脚通过4.7K电阻上拉到VCC。而MAX706不能被禁止,一上电就开始工作,所以WDI不需要上拉;
4).ADM706R的PFO#信号不但会被PFI信号触发,同时也会被MR#信号触发,当MR#出现负电平时,会触发PFO#输出10KHz方波并保持,但MAX706的PFO#仅仅和输入PFI有关,不会受MR#管脚电平的影响;
5).当MR#出现低电平时,对于MAX706芯片,WDO#将先于RESET#跳变,而ADM706却相反,WDO#后于RESET#跳变。
为了使硬件看门狗更可靠,使用起来更灵活,当今主流的设计方式都是看门狗芯片配合逻辑器件(CPLD)来使用。
此时,看门狗有三种清狗方式:
1).正常工作时,CPU输出WDI信号清狗;
2).CPU关闭看门狗(不输出WDI信号),由CPLD输出WDI清狗信号,此方法不推荐使用,容易出问题,有的设计规范中是严禁CPU关闭看门狗的;
3).CPU挂死后,CPLD主动输出WDI清狗信号一段时间,如果CPU仍未恢复正常,则不再继续清狗,等待看门狗芯片内部定时器溢出后输出复位信号对CPU进行复位。
在CPU上电启动期间内,是不能输出WDI信号去清狗的,而外部硬件看门狗是一上电就开始工作的,CPU的启动时间一般在一两分钟,而看门狗的定时器只有1.6s,超过这个时间不清狗就会输出复位信号对CPU进行复位,如果这样的话,CPU就会每隔1.6s重启一次,不能正常工作,如何规避这种问题的?
在实际设计中是这样做的,如下图所示,在CPU上电启动的这段时间内,利用系统时钟信号CLK清狗,等CPU启动完成后,SWITCH自动将清狗信号切换成WDI。定时器和切换开关(SWITCH)是用逻辑模拟的,定时器的溢出时间可设(一般比CPU启动时间稍长一点点),等CPU启动完成后,定时器也随之溢出,并产生溢出信号,SWITCH接收到此溢出信号后,立即采取动作,将清狗信号从系统时钟切换到WDI。
早期的硬件看门狗设计方式如下图所示,将WDO#通过100欧姆电阻接到MR#管脚上,当看门狗溢出时,WDO#输出低电平,并传递给MR#,触发看门狗RESET#管脚输出低电平去复位CPU。另外,MR#管脚还接了一个按键开关S1,当手动按下开关时,MR#被拉成低电平,从而触发RESET#信号产生。在MR#管脚上,我们还看到了一个二极管D1,这个二极管有何用?我们来分析下,在正常情况下,WDO#输出为高电平,它会对MR#管脚上的去抖电容C1充电,当WDO#输出低电平时,C1会通过WDO#放电,将MR#电平拉高,D1的作用就是防止C1通过WDO#放电对MR#电平产生影响。
现在主流设计方案中,不把手动复位按钮直接接到MR#管脚上,而是先接到逻辑器件中进行相关处理,然后再送到看门狗芯片的MR#管脚上,如下图所示: