看门狗定时器
1. 看门狗作用
看门狗定时器检测程序的正常运行,启动看门狗后,必须在看门狗复位之前向特定寄存器中写入数值,不让看门狗定时器溢出,这样看门狗就会重新计时。当用户程序溢出时在规定时间内没有向特定寄存器中依次写入数值,看门狗定时器记数溢出,引出看门狗复位,看门狗产生一个强制系统复位。这样可以使程序重新运行,减少程序跑死的危害。
2. Exynos4412看门狗定时器模块如下:
该模块包括时钟源PCLK, 8位预分频,一个四选一的分频器,一个16位的倒数计数器。
预分频和分频器都由WTCON看门狗控制寄存器决定。8位预分频比例因子的范围为
0~255, 分频器的分频比可以为16,32,64,128。看门狗定时器时钟周期的计算如下:
t_watchdaog = 1 / (PCLK / (Prescaler value + 1) / Division_factor)
Prescaler value为8位预分频比例因子;Division_factor 为16,32,64,128
3. 看门狗定时器寄存器详解
1)控制寄存器WTCON
如果配置成看门狗,配置参考值:249<<8 | 1<<5 |1<<2 | 1<<0
如果配置成普通定时器,配置参考值:249<<8 | 1<<5 | 1<<2
2)数据寄存器WTDAT
看门狗当作定时器使用:用于指定超时时间,在看门狗把复位功能禁掉并打开中断使能后,此时看门狗就是一个普看门狗
当作复位看门狗使用:当使用复位功能后,由于WTCNT 的值减到0时,系统就会复位,所以WTCNT的值就装不进看门狗计数寄存器
3)看门狗重载数值寄存器WTDAT, 在使用看门狗前先给这个寄存器赋值,否则该寄存器就用默认值0x8000
4)看门狗当前计数寄存器WTCNT
void wdt_init()
{
WDT.WTCNT = 0x8000; //initial value
/*
*Prescaler value:255, Enables WDT
*Prescaler clock division factor 128
*Enables WDT reset signal
*/
WDT.WTCON = 0xff<<8 |1<<5 | 3<<3 | 1;
}
/*-------------------------MAINFUNCTION------------------------------*/
/**********************************************************************
* @brief Mainprogram body
* @param[in] None
* @return int
**********************************************************************/
int main(void)
{
GPX2.CON = 0x1 << 28;
uart_init();
wdt_init();
printf("\n************* WDT RESET test!! ***************\n");
while(1)
{
//Turn on LED2
GPX2.DAT = GPX2.DAT | 0x1 << 7;
mydelay_ms(200);
#if 0
// Feed Dog
WDT.WTCNT = 0xA000;
#endif
printf("working...\n");
//Turn off LED2
GPX2.DAT = GPX2.DAT & ~(0x1 << 7);
mydelay_ms(200);
}
return 0;
}