看门狗守时器的用处是在微操控器进入过错状况后的一段合理时间内将其复位。看门狗被是能后,假如用户没有在预先设定的时间内喂狗,那么会发生一个看门狗事情。
看门狗守时器的寄存器有看门狗守时器常数计数器WDTC,每当在喂狗寄存器WDFEED中写入喂狗序列,WDTC中的值就会被写入看门狗守时计数器WDTV,WDTV中的值在看门狗时钟的驱动下递减。咱们能够经过设置看门狗守时器报警中止寄存器WDWARNINT寄存器,当WDWARNINT中的值和WDTV中的值匹配时,能够构成中止。最重要的还有看门狗形式寄存器WDMOD,它操控着看门狗的使能,复位,更新形式以及超时标识和中止标志。此外还有一个看门狗守时器窗口寄存器WDWINDOW,它决议了喂狗过程中答应的最大的WDTV。
看门狗的时钟有一个专用的振荡器,供给了500KHZ的时钟,该时钟经过4分频,供给DWTV计数。因而鄙人面的程序中给WDTC赋值1000000,则看门狗计数的周期为 (1/500KHZ)*1000000*4 = 8S .所以看门狗中止每8秒发生一次。程序装备看门狗超时不复位,进入超时中止今后软件铲除中止标志和超时标识。
留意:为了程序的简练,省去了之前介绍了的体系时钟装备和串口的装备。详细的信息可查询之前的文章。
- #include”LPC1788_REG.h”
- #include”uart.h”
- #definerWDMOD(*(volatileunsigned*)0x40000000)
- #definerWDTC(*(volatileunsigned*)0x40000004)
- #definerWDFEED(*(volatileunsigned*)0x40000008)
- #definerWDTV(*(volatileunsigned*)0x4000000C)
- #definerWDWARNINT(*(volatileunsigned*)0x40000014)
- #definerWDWINDOW(*(volatileunsigned*)0x40000018)
- charstr[]={“WDT_IRQoccur.\r\n”};
- voidWDT_IRQHandler(void)
- {
- rICER0|=0x1;
- Uart2SendS(str);
- rWDMOD&=~(0x1<<3|0x1<<2);
- rWDTC=1000000;
- rWDMOD|=0x1;
- rWDFEED=0xAA;
- rWDFEED=0x55;
- rISER0|=0x1;
- }
- intmain(void)
- {
- unsignedinti,j;
- rFIO1DIR|=(1<<18);//GPIO1.18->OUTPUT
- Init_Uart2();
- rWDTC=1000000;
- rWDMOD|=0x1;
- rWDFEED=0xAA;
- rWDFEED=0x55;
- rISER0|=0x1;
- while(1)
- {
- rFIO1PIN|=0x1<<18;
- for(i=0;i<10000;i++)
- for(j=0;j<1000;j++);
- //rWDFEED=0xAA;
- //rWDFEED=0x55;
- rFIO1PIN&=~(0x1<<18);
- for(i=0;i<10000;i++)
- for(j=0;j<1000;j++);
- }
- }
假如将程序中赤色的两句喂狗屏蔽,则程序每8S发生一次看门狗超时中止,而且LED灯业绩。串口打印信息如下。
假如翻开rWDFEED = 0xAA;rWDFEED = 0x55两句代码,我们有喂狗,所以程序不会进入超时中止,串口也就不会有打印信息。