窗口看門狗( WWDG)通常被用來監(jiān)測由外部干擾或不可預(yù)見的邏輯條件造成的應(yīng)用程序背離正常的運(yùn)行序列而產(chǎn)生的軟件故障。 簡單來說,和IWDG的區(qū)別就是IWDG要靠手動去喂狗,而WWDG有內(nèi)置中斷,所以可以利用設(shè)置中斷服務(wù)函數(shù)去喂狗 首先還是設(shè)置WWDG (記得往工程里面添加頭文件)大致設(shè)置步驟如下: 1)使能 WWDG 時鐘(系統(tǒng)內(nèi)部時鐘)
2)設(shè)置窗口值和分頻數(shù)
3)開啟 WWDG 中斷并分組
4) 設(shè)置計(jì)數(shù)器初始值并使能看門狗
5) 編寫中斷服務(wù)函數(shù) - #include "led.h"
#include "wwdg.h"
//保存 WWDG 計(jì)數(shù)器的設(shè)置值,默認(rèn)為最大.
u8 WWDG_CNT=0x7f;
void WWDG_Init(u8 tr,u8 wr,u32 fprer)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);
WWDG_SetPrescaler(fprer);////設(shè)置 IWDG 預(yù)分頻值
WWDG_SetWindowValue(wr);//設(shè)置窗口值
WWDG_Enable(tr); //使能看門狗 , 設(shè)置 counter .
WWDG_ClearFlag();
WWDG_NVIC_Init();//初始化窗口看門狗 NVIC
WWDG_EnableIT(); //開啟窗口看門狗中斷
}
void WWDG_NVIC_Init(void)
{
NVIC_InitTypeDef NVIC_ist;
NVIC_ist.NVIC_IRQChannel=WWDG_IRQn;
NVIC_ist.NVIC_IRQChannelPreemptionPriority=2;
NVIC_ist.NVIC_IRQChannelSubPriority=3;
NVIC_ist.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_ist);
}
void WWDG_IRQHandler(void)
{
WWDG_SetCounter(0x7f);//喂狗
WWDG_ClearFlag();//清除提前喚醒標(biāo)志
LED1=!LED1;//檢測中斷函數(shù)是否工作了
- }
簡單來講(只是個人愚見)就是WWDG是一個遞減的計(jì)數(shù)器,從最大值遞減到0,到0的時候如果沒喂狗(就是重置計(jì)數(shù)器,比如說將它重置為最大值)就會復(fù)位,但中斷觸發(fā)是在中途進(jìn)行的,就是當(dāng)遞減到0x40的時候就會觸發(fā)中斷,這時候會轉(zhuǎn)到我們寫的中斷服務(wù)函數(shù)里面去,只要我們在中斷服務(wù)函數(shù)里面寫喂狗函數(shù)就可以一直喂狗了
|