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