STM32學習4——看門狗

爲什麼要有看門狗呢?
因爲程序在運行過程中是會跑飛的。我們也不知道飛了,就加一個狗狗看着,相當於一個倒計時,在一定時間內如果沒有接收到餵狗信號(倒計時重新開始),就意味着程序可能跑飛了。這時候處理器就會自動復位,重新開始運行啦。

一、獨立看門狗

獨立看門狗是從一個計數值,減小到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,歸根到底還是沒理解透,昨晚上又看一遍,查查資料,看看網課,窗口看門狗就順利得多。嘻嘻,真開心!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章