環境
- 開發板:stm32F407ZG EXPLORER
- STM32CubeMX: Version 6.1.0
CubeMX設置
- PCLK1時鍾一般為42Mhz.
- wwdg時鍾頻率計算為:(42*1000*1000/4096/8 = 1281)
- downcounter 最大值為127,這里我們取127
- wwdg window value 最值范圍:64~127
- 127-64 + 1 = 64; 64/1281 = 49.96ms
- 因此,wwdg超時時間為49.96ms, 刷新窗口為24.98ms~49.96ms之間。
生成的代碼
- main.c
/**
* @brief WWDG Initialization Function
* @param None
* @retval None
*/
static void MX_WWDG_Init(void)
{
/* USER CODE BEGIN WWDG_Init 0 */
/* USER CODE END WWDG_Init 0 */
/* USER CODE BEGIN WWDG_Init 1 */
/* USER CODE END WWDG_Init 1 */
hwwdg.Instance = WWDG;
hwwdg.Init.Prescaler = WWDG_PRESCALER_8;
hwwdg.Init.Window = 95;
hwwdg.Init.Counter = 127;
hwwdg.Init.EWIMode = WWDG_EWI_ENABLE;
if (HAL_WWDG_Init(&hwwdg) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN WWDG_Init 2 */
/* USER CODE END WWDG_Init 2 */
}
添加代碼
/* USER CODE BEGIN 4 */
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
HAL_WWDG_Refresh(hwwdg);
HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
}
/* USER CODE END 4 */
窗口看門狗的真正作用
以下為轉載:
STM32有2個看門狗:獨立看門狗和窗口看門狗。
獨立看門狗IWDG--獨立於系統之外,因為有獨立時鍾,所以不受系統影響的系統故障探測器,主要用於監視硬件錯誤。
窗口看門狗WWDG----系統內部的故障探測器,時鍾與系統相同。如果系統時鍾不走了,這個狗也就失去了作用了,主要用於監視軟件錯誤。
簡單的講,看門狗就是檢測系統故障的,如果因為系統故障而沒有及時喂狗,則引發復位重啟。
對於一般的看門狗,程序可以在它產生復位前的任意時刻刷新看門狗,但是這樣有一個隱患,有可能程序跑亂了又跑回正常的地方,或者跑亂的程序正好執行了刷新看門狗操作,這樣的情況下一按的看門狗就檢測不出來故障了;但是如果使用窗口看門狗,程序員可以根據程序正常執行的時間設置刷新看門狗的一個時間窗口,保證不會提前刷新看門狗,也不會滯后刷新看門狗,這樣可以檢測出程序沒有按照正常的路徑運行,非正常地跳過了某些程序段的情況。
WWDG與IWDG的主要區別是有一個窗口控制,WWDG的中斷不是用於日常喂狗的,如果用於日常喂狗動作,那WWDG的相對於IWDG,功能也就沒什么特別了。WWDG的中斷是給程序員最后一次喂狗的機會,一般進入這個中斷時,表示你在其他地方安排的喂狗操不能湊效了,而發生這種現象時,肯定是系統有問題了,或者程序有Bug或者干擾,在這種情況下,這個中斷時為了讓你的程序在發生真正的看門狗復位前,有一個緊急處理的機會,如保存重要數據,或者系統剎車,說白了,就是讓CPU寫“遺囑”;
由此看出,簡單的在WWDG中斷中喂狗,既沒有發揮WWDG相對於IWDG的優勢,又因為在中斷中喂狗,而為以后的產品留下了隱患。