WATCHDOG 定时器 - jammy

来源:百度文库 编辑:神马文学网 时间:2024/04/24 07:33:46
s3c2440的看门狗定时器是当操作发生如噪声干扰、系统错误等故障时重启控制器。看门狗定时器是可以作为一般的16位定时器用于响应中断请求,也可以是用于产生复位信号。       看门狗定时器的工作频率是将PCLK经过8位预分频器后,再通过16分频、32分频、64分频、或者128分频后得到的。分频可在WTCON中设置。
用下面的公式算出watchdog定时器的工作频率:
看门狗定时器的工作频率
= 1/[ PCLK / (Prescaler value + 1) / Division_factor ]
Prescaler value = 0~255
Division_factor = {16,32,64,128}
WTDAT & WTCNT
当看门狗寄存器启动时,看门狗定时器数据寄存器(WTDAT)不能自动重装到定时计数器(WTCNT)。因此,初始值必须在看门狗定时器启动前写入定时计数寄存器(WTCNT)。
l         WATCHDOG TIMER CONTROL (WTCON) REGISTER
该寄存器用于允许/禁止看门狗定时器、中断,四种时钟信号的选择,以及预分频系数的设定。
寄存器
地址
R/W
描述
初始值
WTCON
0x53000000
R/W
看门狗定时控制寄存器
0x8021
WTCON
Bit
描述
初始值
Prescaler value
[15:8]
预分频系数,有效范围 0~255
0x80
Reserved
[7:6]
保留位,这两位在普通情况下必需为00
00
Watchdog timer
[5]
允许/禁止看门口定时器
0 = 禁止,1 = 允许
1
Clock select
[4:3]
决定时钟分频器因子
00:16  01:32
10:64  11:128
00
Interrupt generation
[2]
允许/禁止中断
0 = 禁止,1 = 允许
0
Reserved
[1]
保留位,这两位在普通情况下必需为0
0
Reset enable/disable
[0]
允许/禁止看门狗定时器复位信号输出
1:允许在看门狗定时器为0时,产生复位信号
2:禁止看门狗定时器的复位功能
1
l         WATCHDOG TIMER DATA (WTDAT) REGISTER
WTDAT寄存器用于设置看门狗定时持续时间。在初始化看门狗定时器WTDAT的数值不能自动重载到定时计数器。但是,当计数到0时,WTDAT会自动重载到WTCNT。
寄存器
地址
R/W
描述
初始值
WTDAT
0x53000004
R/W
看门狗定时数据寄存器
0x8000
WTDAT
Bit
描述
初始值
Count reload value
[15:0]
重载看门狗定时计数值
0x8000
l         WATCHDOG TIMER COUNT (WTCNT) REGISTER
WTCNT寄存器是当前看门狗定时器正常工作下的数值。注意,WTDAT寄存器的数值在初始化时不能重在到WTCNT寄存器,因此WTCNT寄存器需要在启动看门狗前设置好初始值。
寄存器
地址
R/W
描述
初始值
WTCNT
0x53000008
R/W
看门狗定时计数寄存器
0x8000
WTDAT
Bit
描述
初始值
Count reload value
[15:0]
重载看门狗定时计数值
0x8000
演示程序:
启动看门狗定时器后,程序进入LED闪烁循环,并且显示WTCNT的数值。当WTCNT到0时候,系统重启。
/******************************************************
函数名:void init_watchdog(void)
作  者:jammy-lee
创建日期:2009-02-21
说  明:初始化看门狗定时器
******************************************************/
void init_watchdog(void)
{
rWTCON = ((0x60<<8)|(3<<3));              //设置预分频值0x60,分频因子128
rWTDAT = 0x6000;
rWTCNT = 0x6000;
rWTCON &= ~(1<<2);                      //禁止中断
rWTCON |= ((1<<5)|(1<<0));            //启动看门狗,允许复位信号
}
/******************************************************
函数名:void Main(void)
作  者:jammy-lee
创建日期:2009-02-21
说  明:   主函数
******************************************************/
void Main(void)
{
int wt_count;
rGPBCON = 0x55555;
rGPBUP = 0x7ff;
while(1)
{
Led(1,1);
Uart_Printf("LED 1 power ON\n");
delay(100);
Led(1,0);
Uart_Printf("LED 1 power ON\n");
delay(100);
wt_count = rWTCNT;  //读取WTCNT寄存器当前的值
Uart_Printf("the value of WTCNT is %d\n",wt_count);
}
}