WWDG:
WWDG的作用:通常被用來監測,由外部幹擾或不可預見的邏輯條件造成的應用程式背離正常的運作序列而産生的軟體故障。
配置寄存器WWDG_CFR中W[6:0]是由使用者自己設定的上視窗值.可以控制中斷占空比範圍。
控制寄存器WWDG_CR 中T[6:0]就是視窗看門狗的計數器。當産生中斷後,計數器都會恢複到設定數值或預設最大數值0x7F(喂狗),之後每個視窗看門狗計數周期減1。
配置寄存器(WWDG_CFR)中WTGDB[1:0]設定分頻值,可以控制中斷的時間範圍。
視窗看門狗的逾時公式如下:
Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /Fpclk1;
其中:
Twwdg:WWDG逾時時間(機關為ms)
Fpclk1:APB1的時鐘頻率(機關為Khz)
WDGTB:WWDG的預分頻系數
T[5:0]:視窗看門狗的計數器低6位
T[5:0]+1:當複位産生時要從0x40到0x3F位上,既0x3F也工作了。
EWI是提前喚醒中斷,也就是在快要産生複位的前一段時間(T[6:0]=0X40)來提醒我們,需要進行喂狗了,否則将複位!是以,我們一般用該位來設定中斷,當視窗看門狗的計數器值減到0X40的時候,如果該位設定,并開啟了中斷,則會産生中斷,我們可以在中斷裡面向WWDG_CR重新寫入計數器的值,來達到喂狗的目的。注意這裡在進入中斷後,必須在不大于1個視窗看門狗計數周期的時間(在PCLK1頻率為42M且WDGTB為0的條件下,該時間為97.52us)内重新寫WWDG_CR,否則,看門狗将産生複位!
//*****************************************************************
#include "wwdg.h"
#include "led.h"
void WWDG_Init(u8 tr,u8 wr,u32 fprer)//wr:視窗值;fprer:分頻值;tr:計數值
{
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE); //使能視窗看門狗時鐘,WWDG使用的是PCLK1的時鐘
WWDG_SetWindowValue(wr); //設定視窗值 ,配置寄存器WWDG_CFR中W[6:0]
WWDG_SetPrescaler(fprer); //設定分頻值 配置寄存器(WWDG_CFR)中WDGTB[1:0]
WWDG_SetCounter(tr);//設定計數值,控制寄存器WWDG_CR 中T[6:0]
WWDG_Enable(tr); //開啟看門狗
NVIC_InitStructure.NVIC_IRQChannel=WWDG_IRQn; //視窗看門狗中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02; //搶占優先級為2
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子優先級為3
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能視窗看門狗
NVIC_Init(&NVIC_InitStructure);
WWDG_ClearFlag();//清除提前喚醒中斷标志位
WWDG_EnableIT();//開啟提前喚醒中斷,
*一般來說,這個"死前"中斷裡面不應該喂狗的,而是應該做系統臨死前的一些工作, 例如儲存重要資料之類的
}
void WWDG_IRQHandler(void)
{
WWDG_SetCounter(tr); //重設視窗看門狗值
WWDG_ClearFlag();//清除提前喚醒中斷标志位
}