看门狗实质上和其他的定时器功能相似,只是看门狗多了一个时间到就复位的功能,只要将WTCON的【0】设置成0就成了普通的中断,将进入中断处理程序中,如果设置成了1将复位。这样的话,我们可以使用看门狗来实现对程序的监视,定时的去喂狗也就是定时去给WTCNT复制,如果程序跑飞了话就不能定时去喂狗,系统将重启。
下面的程序中我使用了一个中断处理函数,中断处理程序中使蜂窝器响一下,如果开启了喂狗程序的话不会引发中断,
下面是测试程序:(特别注意延时的时间,否则不能正常工作)
- #include "watchdog.h"
- #include "def.h"
- #include "2440addr.h"
- #include "uart.h"
- void __irq watchdog_isr(void) //__irq是把中断现场保存和恢复工作交由编译器自动完成,如果碰到中断嵌套,则__irq容易引起混乱
- {
- 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);
- }
- }