转载请注明出处:http://blog.csdn.net/charistain_huang
文章中有什么不正确的地方恳请请各位网友指点
********************************************************
*****作者:黄仁军 *******
*****联系email:957626485@qq.com *******
********************************************************
看门狗实质上和其他的定时器功能相似,只是看门狗多了一个时间到就复位的功能,只要将WTCON的【0】设置成0就成了普通的中断,将进入中断处理程序中,如果设置成了1将复位。这样的话,我们可以使用看门狗来实现对程序的监视,定时的去喂狗也就是定时去给WTCNT复制,如果程序跑飞了话就不能定时去喂狗,系统将重启。
下面的程序中我使用了一个中断处理函数,中断处理程序中使蜂窝器响一下,如果开启了喂狗程序的话不会引发中断,
下面是测试程序:(特别注意延时的时间,否则不能正常工作)
void __irq watchdog_isr(void)
{
uart_printf("Enter interrupt!/n");
Beep(2000, 100);
//清中断标志位
rSRCPND = 0x1<<9;
rSUBSRCPND = 0x1<<13;
rINTPND = 0x1<<9;
}
void watchdog_test()
{
// freq=PCLK / (Prescaler value + 1) / Division_factor
////prescaler =249 division factor = 16 freq = 12.5kHZ 如果[0]为1,但中断发生时将引起复位,
//这里设置成了普通的中断,中断发生时会进入中断处理程序
rWTCON = (249<<8) | (0<<3) |(0); //
rWTDAT = 50000; //看门狗计数4秒(4/(1/12500)
rWTCNT = 50000; //这两个值必须初始化
rWTCON |=(1<<5) |(1<<2); //开看门狗中断
rSRCPND = 1<<9;
rSUBSRCPND =1<<13;
rINTPND =1<<9;
rINTSUBMSK = ~(1<<13); //开中断子屏蔽
rINTMSK =~(1<<9);
pISR_WDT_AC97 = (U32)watchdog_isr; //安装中断处理句柄
Delay(1000);
while(1)
{
Delay(1000);
// rWTCNT = 50000; //喂狗,重新赋值,防止中断,果
//把这条语句打开的话,将进行喂狗,不会进入中断
Delay(1000);
}
}