对于s3c2410的watchdog来说,PCLK是它唯一的时钟信号源。
s3c2410用了3个寄存器对watchdog进行操作,3个寄存器分别为:WTCON,WTDAT,WTCNT。
WTCON:watchdog控制寄存器
WTDAT:watchdog数据寄存器
WTCNT:watchdog记数寄存器
Watchdog根据PCLK,Prescaler Value,Clock Select会产生一个watchdog自己的工作周期, t_watchdog= 1/ (PCLK / (Prescaler value + 1) / Division_factor)我们把这个工作周期记为,watchdog在一个 t_watchdog周期结束时会产生一个记数递减信号,每当这个信号产生时,WTCNT中的值便减1,若在WTCNT递减为0(Timer Out)的时候软件层还没有重新往WTCNT中写入数值(喂狗),则watchdog触发Reset Signal,系统重起。
根据上述的描述,我们可以更形象地描述watchdog的工作原理和3个寄存器之间的相互关系:
WTCNT通过WTDAT得到一个值,watchdog在每个t_watchdog周期里向WTCNT发送一个递减信号,当WTCNT的值递减到0的时候则发生time out,重而重起系统。
1:void enable_watchdog()
2:{
3: rWTCON=0x7F81;
4: rWTDAT=0x8000;
5: rWTCON|=1<<5;
6:}
rWTCON,rWTDAT分别为寄存器WTCON,WTDAT的地址解引用,我如下定义他们
#define rWTCON (*(volatile unsigned int *)0x53000000)
#define rWTDAT (*(volatile unsigned int *)0x53000004)
从上面的设置我们可知寄存器WTCON的值为0x7F81,分解出来得:
Prescaler Value =255
Division_factor =16(Clock Select=16)
Interrupt Generation =0(不产生中断)
Reset =1(开启Reset Signal)
注1:事实上,WTDAT和WTCNT这两个寄存器在系统上电之后会被硬件自动的填入两个初始值0x8000,开启watchdog之后, WTCNT并没有马上就把WTDAT中的值装入,而是使用初始值0x8000。在发生第一次time out之后,WTDAT寄存器中的值才会被真正的装载进WTCNT寄存器中
Prescaler Value位于寄存器WTCON的8至15位,其值为0~255
Division_factor由寄存器WTCON中的3~4位(Clock Select)决定,其值可以为00,01,10,11分别代表Division_factor的值为16,32,64,128
关于各个寄存器的详细信息请参考s3c2410的操作手册
看门狗应用程序的设计流程:
1设置看门狗中断操作,包括全局中断,看门狗使能,看门狗中断向量的定义
2看门狗WTCON的设计,其中包括预分频因子,分频器的分频值,中断使能和复位使能
3对看门狗寄存器WTDAT和看门狗计数寄存器WTCON的设置
4启动看门狗定时器