一、簡單介紹
窗口看門狗適合需要精確時序控制的場合,在一個受限的窗口期內喂狗,如果遞減計數器還沒有到窗口值就喂狗,會觸發復位
如果一直不喂狗,也會觸發復位,和之前的獨立看門狗的窗口選項有點類似
需要指出的是,有些STM32單片機的獨立看門狗是不具備窗口功能的,例如常見的F103C8T6
遞減計數器有7位,由于計數值 >= 窗口值 >= 64,則計數器最高位亦即T6就必定是1
只要使能了窗口看門狗,WDGA就是1,右上方的與門是否輸出1就取決于前一級的或門
或門的一個輸入是T6,窗口期的大小就是T[5:0]這6個位,當這6位數遞減至0時,最高位發生翻轉,T6變成0就會觸發復位
或門的另一個輸入是比較器,當比較器發現計數值比窗口值還大時且有喂狗動作就輸出1,也會立刻復位
二、特性
如果遞減計數器還沒有到窗口值就喂狗,會觸發復位
如果遞減計數器值小于0x40,會觸發復位
具有一個早起中斷,在復位前會執行這個中斷
三、設置窗口值
筆者設置系統時鐘為64MHz,同時也是64MHz的pclk,使用16分頻,則計數頻率為64MHz / 4096 / 16 = 0.976kHz,周期為1.024ms
在窗口內喂狗后計數器被賦值為T[6:0],也就是cubemx里counter的值
當計數器值介于down counter和window之間時不允許喂狗,只有計數器值介于window和0x3F之間才可以喂狗
四、cubemx配置
系統時鐘
窗口看門狗
設置counter為127,window為70,則只有在第58.36~64.51ms的范圍內(計數器落在[70:63])喂狗才不會復位(因為每計數一次大約1.024ms)
開啟early wakeup中斷
定時器
配置定時并開啟中斷
中斷優先級
需要給看門狗中斷較高的優先級
五、測試代碼
主循環顯示遞增數,定時器喂狗次數和看門狗中斷喂狗次數
/*** @brief The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_DMA_Init();MX_SPI1_Init();MX_TIM17_Init();
// MX_WWDG_Init();/* USER CODE BEGIN 2 */ST7735_Init();ST7735_ShowString(0, 0, "RESET", Font_11x18, RED, BLACK);HAL_Delay(1000);ST7735_Clear(BLACK);MX_WWDG_Init();HAL_TIM_Base_Start_IT(&htim17);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){static uint16_t wdg = 0;static uint16_t timer = 0;count++;sprintf(str, "%d ", count % 999);ST7735_ShowString(0, 0, str, Font_11x18, GREEN, BLACK);if (wdg != wdgcnt){wdg = wdgcnt;sprintf(str, "%d", wdgcnt);ST7735_ShowString(0, 30, str, Font_11x18, RED, BLACK);}if (timer != timercnt){timer = timercnt;sprintf(str, "%d", timercnt);ST7735_ShowString(0, 60, str, Font_11x18, BLUE, BLACK);}/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}
在看門狗中斷內喂狗
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{wdgcnt++;HAL_WWDG_Refresh(hwwdg);wdgFeedFlg = 1;
}
看門狗早起中斷內進行喂狗,并將喂狗標志位置位
?在1ms定時器中斷內進行喂狗,判斷是否已經通過看門狗中斷喂過。如果喂過了,遞減計數器會被重置,就不必再喂了
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{static uint8_t cnt = 0;if (cnt == 60){if (wdgFeedFlg == 0){HAL_WWDG_Refresh(&hwwdg);timercnt++;}else{wdgFeedFlg = 0;}cnt = 0;}cnt++;
}
實驗證明確實如此,如果cnt等于58就喂狗也會觸發復位,只有59~64才是合適的范圍
六、現象
當定時器喂狗時,屏幕最底下藍色的數字顯示通過定時器喂狗的次數
當看門狗中斷喂狗時,屏幕中間紅色的數字顯示看門狗中斷喂狗次數