TA的每日心情 | 奋斗 2020-5-27 15:41 |
---|
签到天数: 868 天 连续签到: 1 天 [LV.10]以坛为家III
|
看门狗定时器是一个16位向下计数器,用来复位无效的软件状态,当程序陷入死循环的时候,WDT 超时会强制器件复位。由片内32K振荡器LFOSC、可编程预分频(1、16、256或4096)提供时钟。除了复位时,WDT一直计数。
看门狗定时器寄存器:
WDT使能时,需要周期性的清楚计数值,避免强制复位。用于调试时,可配置为产生中断。在复位后,WDT默认为使能,如果不使用或调试时,
可在用户代码的开头失能。当T3CON[5]=1,设置使能时,也对T3CON和T3LD写保护,这意味着内核执行后,用户失能WDT然后仅能配置一次T3CON[5]=1,然后T3CON和T3LD被写保护。T3STA5指示WDT被锁住状态。只有复位清除T3CON[5],解锁T3CON和T3LD后,才能配置WDT。如果不修改 T3CON,用户任何时候都改变不了T3LD。如果T3CON[5]=0,WDT失能,可以修改设置,可以重新使能。
WDT可工作在两种模式:
1:自由运行模式 T3CON[6]=0,WDT的值从0x1000减到0,溢出后装载载0x1000继续减。计数溢出32s默认预分频T3CON[3:2]=10,预分频256。
2:周期模式 T3CON[6]=1,为了得到大于或小于0X1000的计数,T3LD和T3CON[3:2]被写为相应的溢出周期值。最大溢出时间是大约为8192s,预分频T3CON[3:2]=11,预分频4096。
默认的溢出周期是32秒,当溢出时产生中断或复位由T3CON[1]位选择。当调试时设置为中断,通过写0xCCCC到只写寄存器T3CLRI清楚中断标志或。在计数周期到期前通过写0xCCCC到T3CLRI阻止复位或中断。写T3CLRI使WDT重载T3LD开始新的周期计数。如果写0xCCCC之外的值,会立刻产生中断或复位。
T3STA状态寄存器确保定时器时钟和处理器时钟域的同步。在写T3CON、T3LD或T3CLRI后,直到相应的状态为被清除之后开始用户代码。T3VAL保持计数值同步到核时钟域。使用WDT的周期模式产生1s的中断。32.768k时钟256分频后等于128Hz,只要装载T3LD=0X80,开始计数就会每秒溢出1次。使用板上的LED来验证。并且设置一个变量i验证写0xCCCC到T3CLRI会阻止中断的发生。换而言之,如果换成复位,用户代码中设置每隔一定时间就写0xCCCC到T3CLRI,就不会产生复位,一旦程序进入死循环,没有在WDT计数到0之前写0xCCCC到TECLRI,就会强制软件复位,保证了程序的正常运行。
#include <ClkLib.h>#include <WdtLib.h>#include <DioLib.h>unsigned char i=0;int main (void){ WdtLd(0x80); WdtCfg(T3CON_PRE_DIV256,T3CON_IRQ_EN,T3CON_PD_DIS); WdtGo(T3CON_ENABLE_EN); WdtSta(); DioOen(pADI_GP1,0x8); ClkDis(CLKDIS_DISSPI0CLK| CLKDIS_DISSPI1CLK| CLKDIS_DISI2CCLK| CLKDIS_DISUARTCLK| CLKDIS_DISPWMCLK| CLKDIS_DIST1CLK| CLKDIS_DISDACCLK| CLKDIS_DISDMACLK| CLKDIS_DISADCCLK); ClkCfg(CLK_CD0,CLK_HF,CLKSYSDIV_DIV2EN_DIS,CLK_UCLKCG); // Select CD0 for CPU clock NVIC_EnableIRQ(WDT_IRQn); while (1) { if(i>10) //如果中断超过10次,阻止中断 WdtClrInt(); }}void WDog_Tmr_Int_Handler (){ WdtClrInt(); i++; DioTgl(pADI_GP1,0x8);} 看门狗不仅能用来复位无效的软件,调试设置中断,还可以和普通定时器一样产生定时。 |
|