看门狗定时器的用途是在微控制器进入错误状态后的一段合理时间内将其复位。看门狗被是能后,如果用户没有在预先设定的时间内喂狗,那么会产生一个看门狗事件。
看门狗定时器的寄存器有看门狗定时器常数计数器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"
- #define rWDMOD (*(volatile unsigned*)0x40000000)
- #define rWDTC (*(volatile unsigned*)0x40000004)
- #define rWDFEED (*(volatile unsigned*)0x40000008)
- #define rWDTV (*(volatile unsigned*)0x4000000C)
- #define rWDWARNINT (*(volatile unsigned*)0x40000014)
- #define rWDWINDOW (*(volatile unsigned*)0x40000018)
- char str[]={"WDT_IRQ occur.\r\n"};
- void WDT_IRQHandler(void)
- {
- rICER0 |= 0x1;
- Uart2SendS(str);
- rWDMOD &= ~(0x1<<3|0x1<<2);
- rWDTC = 1000000;
- rWDMOD |= 0x1;
- rWDFEED = 0xAA;
- rWDFEED = 0x55;
- rISER0 |= 0x1;
- }
- int main(void)
- {
- unsigned int i,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++);
- }
- }
#include "LPC1788_REG.h" #include "uart.h" #define rWDMOD (*(volatile unsigned*)0x40000000) #define rWDTC (*(volatile unsigned*)0x40000004) #define rWDFEED (*(volatile unsigned*)0x40000008) #define rWDTV (*(volatile unsigned*)0x4000000C) #define rWDWARNINT (*(volatile unsigned*)0x40000014) #define rWDWINDOW (*(volatile unsigned*)0x40000018) char str[]={"WDT_IRQ occur.\r\n"}; void WDT_IRQHandler(void) { rICER0 |= 0x1; Uart2SendS(str); rWDMOD &= ~(0x1<<3|0x1<<2); rWDTC = 1000000; rWDMOD |= 0x1; rWDFEED = 0xAA; rWDFEED = 0x55; rISER0 |= 0x1; } int main(void) { unsigned int i,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两句代码,由于有喂狗,所以程序不会进入超时中断,串口也就不会有打印信息。