使用的M4是TI的TM4C123型芯片
根据datasheet,该芯片的watchdog有两个watchdog Timer,WDT0与WDT1,WDT0使用的系统时钟,WDT1使用的是固定的比较精确的内部时钟,时钟频率固定为16MHz。另外,这两个watchdog Timer还有另外一个区别:访问或设置WDT0模块相关寄存器对时序无特殊要求(因其使用的是系统时钟),而访问或设置WDT1模块相关寄存器时对时序有要求(其使用的是内部其他时钟16MHz)。对WDT1访问的时序可通过查询WDTCTL寄存器中的WRC位来实现,当WRC=1时,WDT1可访问或设置,当WRC=0时,WDT1仍在设置且未完成。
TI M4的WDT是二次超时机制,第一次超时,产生中断,第二次超时,则产生复位信号(WDTCTL的RESEN=1)。
关于WDT的中断问题,对WDT的中断清除操作实际上即是喂狗操作。而是否需为WDT设定中断处理函数,则是看具体情况而定,即可设定中断处理函数也可不设定(不设定时芯片依然按照上述机制产生复位信号)。当设定了中断处理函数时,中断处理函数可为空函数(不做任何处理),或者是直接在函数内清除中断标志或重新载入超时值到计数器或直接喂狗。还是那一句话,具体怎么处理看情况,反正都可以。
WDT的初始化及配置参考datasheet:
1、载入超时值到WDTLOAD寄存器中;
2、如果是WDT1,等待WDTCTL的WRC=1;
3、如果WDT是配置成触发系统复位的目的,将WDTCTL的RESEN=1;
4、如果是WDT1,等待WDTCTL的WRC=1;
5、设置WDTCTL的INTEN=1使能WDT,使能中断及锁定WDTCTL寄存器;
6、为防止中途WDT的某些寄存器被不经意的更改,可将WDTLOCK寄存器设定为某个值锁定整个WDT模块寄存器,WDTICR(喂狗)寄存器除外。
以下为代码,使用的TI的库:
bool waitWRC()
{
return HWREG(WATCHDOG1_BASE + WDT_0_CTL) & WDT_CTL_WRC;
}
SysCtlPeripheralEnable(SYSCTL_PERIPH_WDOG1);
SysCtlDelay(SysCtlClockGet()/1000);
while(waitWRC()==0)
{}
if(WatchdogLockState(WATCHDOG1_BASE)==true)
{
while(waitWRC()==0)
{}
WatchdogUnlock(WATCHDOG1_BASE);
}
while(waitWRC()==0)
{}
//超时时间为 SysCtlClockGet()/16000000
WatchdogReloadSet(WATCHDOG1_BASE,SysCtlClockGet());
while(waitWRC()==0)
{}
WatchdogResetEnable(WATCHDOG1_BASE);
while(waitWRC()==0)
{}
WatchdogStallEnable(WATCHDOG1_BASE);
while(waitWRC()==0)
{}
WatchdogEnable(WATCHDOG1_BASE);
while(waitWRC()==0)
{}
WatchdogLock(WATCHDOG1_BASE);
上述是对WDT1的设置过程,对WDT0的设置只需将上面代码中的WATCHDOG1_BASE改写成WATCHDOG0_BASE,且把所有的while(waitWRC()==0){}代码去掉即可,而其超时时间则为1S。