S3C2440A 的看门狗定时器是用于当其由于噪声和系统错误引起的故障干扰时恢复控制器的工作。它也可以被用作普通 16 位内部定时器来请求中断服务。看门狗定时器产生 128 个 PCLK 周期的复位信号。
看门狗比较简单 ,在2440文档上才2页介绍。
看门狗定时器只使用 PCLK 作为其时钟源。预分频 PCLK 频率来产生相应看门狗定时器时钟,再将其结果频率分频。
看到了,跟前面的timer一样也是利用PCLK作为时钟源,可以使用以下等式来计算看门狗定时器的频率和每个定时器时钟周期的持续时间:
上面的预分频和分频系数可以在WTCON寄存器设置:
注意到里面有一个位是中断的禁止和使能,在这里我们不使能中断,时间到了之后就直接复位!
看门狗复位操作在正常工作状态下是不应该发生的,因此我们要想方设法地避免其发生。主要的方法就是在看门狗到时之前,重新对看门狗定时器的寄存器进行赋值,使它的定时器重新开始计时也就是喂狗.
看门狗定时器有两个寄存器WTDAT和WTCNT,WTDAT用于确定超时期限,WTCNT为当前看门狗定时器的计数值,在第一次设置看门狗超时时间时,这两个寄存器都要被写入超时时间的初始值。对于喂狗操作则是操作WTCNT寄存器。
这里实现的功能是上电之后30s看门狗复位,30s内如果有按键操作那么看门狗从初始值开始计数!
void init_wtdog(void) { rWTCON = 0xf939; ///enable reset;divider=128; Prescaler=0xf9=249 rWTDAT = 0xb70c; /// 30s rWTCNT = 0xb70c; }
在tq2440开发板上按键key4实现喂狗:
//key4 feed watchwog void key_int4(void) { rWTCNT = 0xb70c; }
注意到看门狗复位之后从0x0地址处开始执行,所以这里的程序要烧写到nandflash上,在 openjtag仿真环境下无法首先复位后继续运行!在系统启动时好像无法判断究竟是上电启动还是被看门狗复位的!。
参考链接:
blog.csdn.net/zhaocj/article/details/5331712