看门狗定时器的工作频率是将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);
}
}
联系客服