ARM+Linux下看门狗应用
2012-12-17深圳市安捷信电气有限公司冯瑞明
深圳市安捷信电气有限公司 冯瑞明
一、现象、问题描述
笔者在设计ARM+Linux的产品中,使用了看门狗ADM706.这款IC的定时间隔为1.6S。由于我们使用ARM9的内核,操作系统为Linux。整个系统完全启动时间较长,超出了看门狗的喂狗时间门限。因此在CPU能完全启动开始喂狗前,看门狗又给出了复位信号,导致CPU重启。由于成本的原因,此款看门狗IC的定时复位间隔时间已经定死,不能由CPU设置。我们无法通过更改看门狗的喂狗间隔时间,以满足CPU的启动要求。
图1 使用的看门狗电路图
图2 改进看门狗电路
图3 看门狗波形图
图4 ADM706内部框图
图5 最终版看门狗电路
二、关键过程及根本原因分析
使用的看门狗电路如图1所示:
RESET信号为看门狗输出的复位信号,WDI为CPU输出的喂狗信号。在1.6S的时间内,WDI信号有从高到低或者从低到高的变化,则看门狗内部的定时器清零,重新计数,无复位信号输出。
由于采用LINUX内核的操作系统,BOOTLOADER采用U-BOOT。在从U-BOOT跳转到LINUX内核的过程中,必须关闭定时器中断。CPU不能定时喂狗,且跳转执行的间隔时间都大于1.6S。因此需要关闭看门狗的复位输出信号,以使CPU能完全启动。
三、改进电路及问题
电路图更新为如图2所示:
采用此电路后,CPU启动后,在U-BOOT程序中设置CLOSE_WATCHDOG信号为高电平,可以关闭看门狗的复位信号输出,CPU可以正常启动完成。在装载完驱动程序后,定时每100ms在WDI管脚输出喂狗信号。设置CLOSE_WATCHDOG信号为低,打开看门狗的复位信号输出。当1.6S后,没有喂狗信号后,看门狗输出复位信号复位CPU,CPU重启。
后测试发现如下问题:
1.在U-BOOT下,按复位键,CPU不能复位;
2.在系统启动过程中,电源短时跌落后恢复,系统有时不能启动;
3.有时加载驱动完成后,打开看门狗复位信号时,系统会出现重启现象。
问题分析:
问题一,在U-BOOT下,由于关闭了看门狗的输出信号,因此没有复位信号输出到CPU上,CPU不能复位,表现为复位键不起作用。
问题二,在系统启动过程中,由于CLOSE_WATCHDOG信号为高,关闭看门狗的复位信号输出。当电源短时跌落后恢复,有时CLOSE_WATCHDOG信号依然保持高电平。没有看门狗复位信号输出到CPU上,CPU不能正常的复位,导致系统不能正常启动。
问题三,在加载完成驱动后,先给WDI输出一个脉冲信号喂狗。然后打开看门狗的复位信号。看门狗的波形如图3所示。
从图3中,我们可以看出,假如我们喂狗,MR信号变为高电平。可是RESET信号依然会维持200ms的低电平。此时,我们打开看门狗电路,给CPU输出一个复位信号引起CPU复位。当MR信号维持高电平1.6S,且WDI无电平变化,看门狗输出复位信号。因此打开看门狗电路会引起CPU复位的概率是:0.2/1.6=12.5%。
仔细阅读此看门狗IC的DATASHEET。看门狗IC的框图如图4。
此看门狗IC内部包括三部分功能:
1.看门狗定时器输出电路WDI、WDO管脚
看门狗的定时器,当MR为低电平或WDI有电平变化时清零。当定时器溢出,WDO输出低电平。一旦定时器清零,WDO输出高电平。
2.上电复位电路MR、VCC、RESET
当VCC失败或MR上有低电平,一旦上述条件消失,RESET输出一个200ms宽度的低电平信号。因此,当WDO直接连到MR管脚上后,RESET输出一个周期为1.6S,低电平宽度为200ms的复位信号。
3.电源监控电路PFI、PFO
PFI的输入电平低于1.25V时,PFO输出一个低电平。
根据IC的上述特点更改复位电路如图五所示。
四、总结
采用图五所示电路,使看门狗IC实现看门狗电路和上电复位电路两种功能。满足带操作系统的CPU启动时间长,需通过电压跌落试验等要求。也可以满足需要实现休眠功能要求的场景。此电路可以做为带操作系统CPU或需实现休眠功能的CPU标准复位电路。由于单片机的启动时间短,在无需休眠功能的场景下,单片机的复位电路可不使用图五推荐电路。
[1]ADM706R.