#define WDT 0 // WDT中断号<br /><br />#define WDTTIMES 5 // WDT 时间S<br /><br />/**********************************************************************************************<br />功能:进入临界段。<br />入口参数:无。<br />返回:无。<br />备注:该函数使用的是将中断分配寄存器清0的方法来关中断。比起用软中断,运行速度要快。<br /> 如果要开某个中断,则应该先调用一次该函数,然后再修改中断备份变量CopyOfVICIntEnable<br /> 的值,而不能直接修改VICIntEnable的值。否则会出错。<br />**********************************************************************************************/<br />void IRQDisable(void)<br />{<br />if(OSEnCrCount==0) //如果前面未关中断<br /> {<br /> IRQREG = VICIntEnable ;<br /> VICIntEnClr=0xFFFFFFFF; //将VICIntEnable清除,禁止中断<br /> }<br />OSEnCrCount++; //进入临界段次数加1<br />}<br />//////////////////////////////////End of function//////////////////////////////////////////////<br /><br /><br />/**********************************************************************************************<br />功能:退出临界段<br />入口参数:无。<br />返回:无。<br />备注:无。<br />**********************************************************************************************/<br />void IRQEnable(void)<br />{<br />if(OSEnCrCount>=1) //如果进入临界段的次数大于等于1次<br /> {<br /> OSEnCrCount--; //则次数减1<br /> if(OSEnCrCount==0) //如果减次数减到0,则要开中断<br /> {<br /> VICIntEnable = IRQREG ;<br /> //打开所需要开的中断<br /> }<br /> }<br />}<br />/*<br />*********************************************************************************************************<br />** 函数名称 :WDT_Int()<br />** 函数功能 :看门狗中断服务程序<br />** 入口参数 :无<br />** 出口参数 :无<br />*********************************************************************************************************<br />*/<br />void __irq WDT_Int (void)<br />{<br />WDMOD = 0x00 ; // 清除看门狗超时位WDTOF<br />VICIntEnClr = 1 ; // 看门狗溢出中断只能通过禁止VIC的方式返回<br />VICVectAddr = 0x00; // 通知VIC中断结束<br />}<br /><br /><br />//喂狗涵数两秒种之内调用一次<br />void WEIWDT(void)<br />{<br />IRQDisable();<br /> WDFEED = 0xAA; // 看门狗喂狗<br /> WDFEED = 0x55;<br />IRQEnable();<br />}<br /><br />//看门狗设置<br /> void WDTinit(void)<br /> {<br /> WDTC = 15000000 * WDTTIMES ;<br /> WDMOD = 0x03 ;<br /> //WDMOD = 0x01 ; //看门狗中断使能位(只能置位)<br /> //WDMOD = 0x03 ; //看门狗复位使能位/ 中断使能位(只能置位)<br /> WDFEED = 0xaa ;<br /> WDFEED = 0x55 ;<br /><br /> VICVectCntl12 = 0x20 | WDT; // 分配WDT中断到slot0<br /> VICVectAddr12 = (uint32)WDT_Int; // 中断服务程序地址<br /> VICIntEnable = 1 << WDT; // 中断使能<br /> } |
|