爲什麼要有看門狗呢?
因爲程序在運行過程中是會跑飛的。我們也不知道飛了,就加一個狗狗看着,相當於一個倒計時,在一定時間內如果沒有接收到餵狗信號(倒計時重新開始),就意味着程序可能跑飛了。這時候處理器就會自動復位,重新開始運行啦。
一、獨立看門狗
獨立看門狗是從一個計數值,減小到0,若在這個過程中沒有餵狗,說明程序跑飛,處理器自動復位。
實現功能:
正常情況下是燈一直閃爍,按下按鍵,即餵狗後 ,燈一直亮。
各種bug,整了一下午,心塞塞。
主函數while前
HAL_Delay(500);
HAL_GPIO_WritePin(LED_G_GPIO_Port, LED_G_Pin, GPIO_PIN_RESET);
由於一直復位,所以燈閃爍。
while中
while (1)
{
//按鍵消抖
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin)==GPIO_PIN_SET)
{
HAL_Delay(10);
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin)==GPIO_PIN_SET)
{
HAL_IWDG_Refresh(&hiwdg);//餵狗
}
}
HAL_Delay(10);
}
這裏看門狗設置的時間是大約1s,預分頻係數64,重裝載值是625。
配置看門狗後,一直按鍵,不停餵狗,就不再復位。燈就不滅了。
二、窗口看門狗
相比於獨立看門狗,窗口看門狗有上限和下限。
上限最大爲0x7f,下限爲0x40,所以計數值在0x40-0x7f之間。只有在窗口之間餵狗纔不會復位。
窗口看門狗可以產生中斷,當使能提前喚醒中斷時,一旦進入中斷,說明程序真的出現了問題,所以要在中斷處理函數中處理一些比較重要的事,比如保存數據、報警等,也稱死前中斷。
實現功能:
紅燈亮300ms,然後綠燈閃爍,大概1s閃爍5下
main函數中
//main函數中
HAL_GPIO_WritePin(LED_R_GPIO_Port, LED_R_Pin, GPIO_PIN_RESET);
HAL_Delay(300);
while (1)
{
HAL_GPIO_WritePin(LED_R_GPIO_Port, LED_R_Pin, GPIO_PIN_SET);
}
中斷處理函數
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
HAL_WWDG_Refresh(hwwdg);//餵狗
HAL_GPIO_TogglePin(LED_G_GPIO_Port, LED_G_Pin);//綠燈翻轉
}
WWDG的計數值爲0x7f,上窗口值爲0x5f,分頻係數爲8分頻。
代碼的運行時間決定了上窗口的值(稍稍比程序運行時間多一點點)。在這個窗口時間內沒有餵狗的話,說明程序故障,提前喚醒中斷,系統復位。
總之,現在看門狗差不多算是理解了。還是得多練練,前前後後怕是有2天?開始寫獨立看門狗的時候一直出bug,歸根到底還是沒理解透,昨晚上又看一遍,查查資料,看看網課,窗口看門狗就順利得多。嘻嘻,真開心!