使用WATCHDOG定时器的“WATCHDOG”功能时,在正常的程序中,必须不断重新设置WTCNT寄存器使得它不为零,这个可以保证系统不被重新启动,这称为“喂狗”,当程序崩溃,不能喂狗,计数值达到0后系统将被重新启动,这样程序将重新运行。这就避免了各类系统错误时系统彻底死机。
WATCHDOG需要设置的三个寄存器:
(1)WTCON寄存器(WATCHDOG TIMER CONTROL):
[0]WATCHDOG功能 :定时器到达0时,0 不输出复位信号
1 输出复位信号
[1]中断使能 :0禁止中断
1使能中断
[4:3] :分频系数 00:16分频 divider value
01:32分频
10:64分频
11:128分频
[5]定时器启动 :0停止
1启动
[15:8]预分频系数:0~255 prescaler value
WATCHDOG工作的频率=PCLK/(prescaler value +1)/(divider value)。
(2)WTDAT(WATCHDOG TIMER DATA):
设定WATCHDOG定时器的超市周期,在定时器启动后,当计数到0时,WTDAT寄存器的值会自动传入WTCNT寄存器。不过第一次启动WATCHDOG寄存器时WTDAT的值会自动传入WTCNT寄存器
(3)WTCNT(WATCHDOG TIMER COUNT):启动关门狗前,不需赋予初值。启动定时器后,开始减一计数,当计数到0时,如果中断使能并WATCHDOG功能为输出复位信号,则发出复位信号,装在WTDAT的值重新开始计数。
在UBOOT中和KERNEL中常常关闭看门狗,防止重复启动。代码如下
# define pWTCON 0x53000000
ldr r0, =pWTCON
mov r1, #0x0
str r1, [r0]