一、實驗?zāi)康?/p>
1)了解STM32窗口看門狗;
2)了解STM32窗口看門狗與獨立看門狗的異同;
3)會使用窗口看門狗;
4)利用STM32窗口看門狗的中斷功能來喂狗。
二、STM32 窗口看門狗簡介
窗口看門狗通常被用來監(jiān)測,由外部干擾或不可預(yù)見的邏輯條件造成的應(yīng)用程序背離正常的運行序列而產(chǎn)生的軟件故障。除非遞減計數(shù)器的值在T6位變成0前被刷新,看
門狗電路在達(dá)到預(yù)置的時間周期時,會產(chǎn)生一個MCU復(fù)位。在遞減計數(shù)器達(dá)到窗口寄存器數(shù)值之前,如果7位的遞減計數(shù)器數(shù)值(在控制寄存器中)被刷新, 那么也將產(chǎn)生一個MCU
復(fù)位。這表明遞減計數(shù)器需要在一個有限的時間窗口中被刷新。
簡而言之,窗口看門狗有兩個門限就上窗口和下窗口;下窗口值是固定的0x40;而上窗口由我們自己設(shè)置;當(dāng)看門狗的計數(shù)器在上窗口值之外被刷新,或者低于下窗口值都
會產(chǎn)生復(fù)位。
涉及的寄存器有:控制寄存器(WWDG_CR)、配置寄存器(WWDG_CFR)、狀態(tài)寄存器(WWDG_SR)。
配置步驟:
1) 使能 WWDG 時鐘
2) 設(shè)置窗口值和分頻數(shù)
3) 開啟 WWDG 中斷并分組
4) 設(shè)置計數(shù)器初始值并使能看門狗
5) 編寫中斷服務(wù)函數(shù)
獨立看門狗與窗口看門狗的異同:相同的地方就是二者在一定情況下都會產(chǎn)生MCU復(fù)位;而IWDG最適合應(yīng)用于那些需要看門狗作為一個在主程序之外,能夠完全獨立
工作,并且對時間精度要求較低的場合。 WWDG最適合那些要求看門狗在精確計時窗口起作用的應(yīng)用程序。
三、硬件設(shè)計
LED燈、窗口看門狗。
四、軟件設(shè)計
voidWWDG_Init(u8tr,u8wr,u32fprer)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);//WWDG時鐘使能
WWDG_CNT=tr&WWDG_CNT;//初始化WWDG_CNT.
WWDG_SetPrescaler(fprer);////設(shè)置IWDG預(yù)分頻值
WWDG_SetWindowValue(wr);//設(shè)置窗口值
WWDG_Enable(WWDG_CNT);//使能看門狗,設(shè)置counter.
WWDG_ClearFlag();//清除提前喚醒中斷標(biāo)志位
WWDG_NVIC_Init();//初始化窗口看門狗NVIC
WWDG_EnableIT();//開啟窗口看門狗中斷
}
//重設(shè)置WWDG計數(shù)器的值
voidWWDG_Set_Counter(u8cnt)
{
WWDG_Enable(cnt);//使能看門狗,設(shè)置counter.
}
//窗口看門狗中斷服務(wù)程序
voidWWDG_NVIC_Init()
{
NVIC_InitTypeDefNVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=WWDG_IRQn;//WWDG中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//搶占2,子優(yōu)先級3,組2
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;//搶占2,子優(yōu)先級3,組2
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);//NVIC初始化
}
voidWWDG_IRQHandler(void)
{
WWDG_SetCounter(WWDG_CNT);//當(dāng)禁掉此句后,窗口看門狗將產(chǎn)生復(fù)位
WWDG_ClearFlag();//清除提前喚醒中斷標(biāo)志位
LED1=!LED1;//LED狀態(tài)翻轉(zhuǎn)
}
五、實驗結(jié)果
成功!