Cortex-M3 (NXP LPC1788)之WDT窗口看門狗定時器
看門狗定時器的寄存器有看門狗定時器常數(shù)計數(shù)器WDTC,每當在喂狗寄存器WDFEED中寫入喂狗序列,WDTC中的值就會被寫入看門狗定時計數(shù)器WDTV,WDTV中的值在看門狗時鐘的驅(qū)動下遞減。我們可以通過設(shè)置看門狗定時器報警中斷寄存器WDWARNINT寄存器,當WDWARNINT中的值和WDTV中的值匹配時,可以形成中斷。最重要的還有看門狗模式寄存器WDMOD,它控制著看門狗的使能,復(fù)位,更新模式以及超時標識和中斷標志。此外還有一個看門狗定時器窗口寄存器WDWINDOW,它決定了喂狗過程中允許的最大的WDTV。
本文引用地址:http://butianyuan.cn/article/201611/318452.htm看門狗的時鐘有一個專用的振蕩器,提供了500KHZ的時鐘,該時鐘通過4分頻,提供DWTV計數(shù)。因此在下面的程序中給WDTC賦值1000000,則看門狗計數(shù)的周期為 (1/500KHZ)*1000000*4 = 8S .所以看門狗中斷每8秒產(chǎn)生一次。程序配置看門狗超時不復(fù)位,進入超時中斷以后軟件清除中斷標志和超時標識。
注意:為了程序的簡潔,省去了之前介紹了的系統(tǒng)時鐘配置和串口的配置。具體的信息可查詢之前的文章。
- #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.rn"};
- 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++);
- }
- }
如果打開rWDFEED = 0xAA;rWDFEED = 0x55兩句代碼,由于有喂狗,所以程序不會進入超時中斷,串口也就不會有打印信息。
評論