窗口看門狗與獨立看門狗最大的不同是中斷,窗口看門狗擁有一個提前喚醒中斷。也就是在快要產生復位的前一段時間(T[6:0]=0x40)來提醒需要進行喂狗,否則將復位。因此當窗口看門狗的計數器值減到0x40的時候,產生中斷,在中斷里向WWDG_CR重新寫入計數器的值,即喂狗。
注意進入中斷后,必須在不大于1個窗口看門狗計數周期的時間內重新寫WWDG_CR,否則,看門狗將產生復位!
T[6:0]就是WWDG_CR的低七位,就是窗口看門狗的計數器。
W[6:0]是WWDG->CFR的低七位,是窗口看門狗的上窗口,下窗口值是固定的0x40。
低于下窗口值會產生復位。要注意當窗口看門狗的計數器在上窗口值之外被刷新也會產生復位。
?
最后要注意的是狀態寄存器WWDG_SR,需要通過軟件置0。
?
窗口看門狗配置示例
/***********************************************************
* tr:計數器值
* wr:窗口值
* fprer:分頻系數,僅最低2位有效
* Fwwdg = PCLK1/(4096 * 2^fprer)
***********************************************************/
void WWDG_Init(u8 tr,u8 wr,u32 fprer)
{ RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);WWDG_CNT = tr&WWDG_CNT;WWDG_SetPrescaler(fprer);WWDG_SetWindowValue(wr);WWDG_Enable(WWDG_CNT); WWDG_ClearFlag();WWDG_NVIC_Init();WWDG_EnableIT();
} void WWDG_NVIC_Init()
{NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}
?
喂狗相關中斷和代碼
void WWDG_Set_Counter(u8 cnt)
{WWDG_Enable(cnt);
}void WWDG_IRQHandler(void)
{WWDG_SetCounter(WWDG_CNT);WWDG_ClearFlag();
}
?