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