為了提搞系統(tǒng)的可靠性,STM32F4系列MCU有一個獨立看門狗(IWDG)和一個窗口看門狗(WWDG)。今天做的實驗是關(guān)于獨立看門狗的。
獨立看門狗使用的時鐘源是內(nèi)部低速振蕩器LSI。因為LSE可能沒接,HSE可能壞點,HSE耗著的時候HSI卻觀點了。。。諸多原因,LSI是最好的獨立看門狗時鐘。
【IWDG主要特性】
1、獨立的向下計數(shù)器 2、內(nèi)部RC振蕩器作為時鐘源 3、當(dāng)計數(shù)器值減到0時,復(fù)位MCU
【IWDG配置步驟】
1、設(shè)置KR寄存器,為向PR和RLR寫入數(shù)據(jù)做準(zhǔn)備。向KR寫入0x5555使能寫入PR和RLR
2、寫入預(yù)分頻值和重裝載值。預(yù)分頻是對LSI進行分頻,重裝載值是每次重新計數(shù)的開始值。
3、向KR寫入0xAAAA,使能計數(shù)。
4、向KR寫入0x5555,重新開始計數(shù)。否則計數(shù)到0就會reset。
【代碼實現(xiàn)】
本實驗依賴于前面的LED實驗。實驗第一步的現(xiàn)象是LED反復(fù)閃爍。第二步現(xiàn)象是LED亮一下后熄滅。
第一部分:
int main()
{
NVIC_Config();
LED_Init();
LEDOn(LED1);
delay_ms(500);
LEDOff(LED1);
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//使能寫入PR和RLR
IWDG_SetPrescaler(IWDG_Prescaler_128); //寫入PR預(yù)分頻值
IWDG_SetReload(100); //寫入RLR
IWDG_Enable();//KR寫入0xCCCC
while(1)
{
IWDG_ReloadCounter(); //KR寫入0x5555 重新開始計數(shù),不讓復(fù)位
}
}
在這次實驗中我們看到LED亮一下就保持常暗。說明MCU沒有被復(fù)位。
第二部分,我們不重裝RLR計數(shù)器,看看呢個不能復(fù)位mcu
int main()
{
NVIC_Config();
LED_Init();
LEDOn(LED1);
delay_ms(500);
LEDOff(LED1);
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//使能寫入PR和RLR
IWDG_SetPrescaler(IWDG_Prescaler_32); //寫入PR預(yù)分頻值
IWDG_SetReload(100); //寫入RLR
IWDG_Enable();//KR寫入0xCCCC
while(1)
{
//等待mcu被IWDG復(fù)位
}
}
這次可以看到LED在閃爍了。