本文共 1568 字,大约阅读时间需要 5 分钟。
看门狗定时器的主要作用是在程序因为干扰而跑飞后,能够使系统复位,不至于使系统永远的死下去。它的原理与一般的定时器没有多大区别,就是先要设置好一段时间,当超过这段时间后,就从当前运行的程序中跳出进入中断处理程序中。但两者的主要差别是,一般的定时器中断是我们希望它发生的,因此我们不会在定时器中断发生前的那个时间段内干预它;而看门狗定时器中断是我们不希望它发生的,因此我们要想方设法地避免其发生。主要的方法就是在中断发生前,重新对看门狗定时器的寄存器进行赋值,使它的定时器重新开始计时。
- #include "2440addr.h"
- #include "Option.h"
-
-
- #define LED1_ON (rGPBDAT &=~(1<<5))
- #define LED1_OFF (rGPBDAT |=(1<<5) )
- #define LED2_ON (rGPBDAT &=~(1<<6))
- #define LED2_OFF (rGPBDAT |=(1<<6))
- #define LED3_ON (rGPBDAT &=~(1<<7))
- #define LED3_OFF (rGPBDAT |=(1<<7))
- #define LED4_ON (rGPBDAT &=~(1<<8))
- #define LED4_OFF (rGPBDAT |=(1<<8))
-
- void __irq Wdt_Int(void);
-
- void Delay(void)
- {
- int i;
- for(i=0;i<1000000;i++);
- }
-
- void Main(void)
- {
- rGPBCON &=~((3<<10)|(3<<12)|(3<<14)|(3<<16)); //对GPBCON[10:17]清零
- rGPBCON |=((1<<10)|(1<<12)|(1<<14)|(1<<16)); //设置GPB5~8为输出
- rGPBUP &=~((1<<5)|(1<<6)|(1<<7)|(1<<8)); //设置GPB5~8的上拉功能
- rGPBDAT |=(1<<5)|(1<<6)|(1<<7)|(1<<8); //关闭LED
-
- rGPBCON |=1; //输出
- rGPBUP |=0;
- rGPBDAT|=0; //关闭蜂鸣器
-
- rWTDAT=50000; //设置看门狗定时器超时时间为4秒(50÷12.5)
- rWTCNT=50000;
- rWTCON=(249<<8)|(1<<5)|(0<<3)|(1<<2);//预分频值为249,使能看门狗,分频系数为16,中断使能
-
- rSRCPND |=BIT_WDT_AC97;
- rINTPND |=BIT_WDT_AC97;
- rSUBSRCPND |= BIT_SUB_WDT; //清除中断标志
-
- rINTMSK &= ~(BIT_WDT_AC97);
- rINTSUBMSK &= ~(BIT_SUB_WDT);//开中断
-
- pISR_WDT_AC97=(unsigned)Wdt_Int;//设置中断程序入口
- while(1)
- {
- LED1_ON;Delay();LED1_OFF;
- LED2_ON;Delay();LED2_OFF;
- LED3_ON;Delay();LED3_OFF;
- LED4_ON;Delay();LED4_OFF;
- rWTCNT=50000; //喂狗 没喂狗蜂鸣器很响
- }
- }
-
- void __irq Wdt_Int(void)
- {
- rSRCPND |=BIT_WDT_AC97;
- rINTPND |=BIT_WDT_AC97;
- rSUBSRCPND |= BIT_SUB_WDT; //清除中断标志
- rGPBDAT =1;
- Delay();
- rGPBDAT =0; //蜂鸣器响一段时间
- }
转载地址:http://glfxi.baihongyu.com/