一、前因后果
工程中,設備為了穩定可靠,會增加外部看門狗,但是外部看門狗一旦啟動,就停不下來,必須在固定的時間范圍內進行喂狗,不然看門狗芯片就會產生一個復位信號復位MCU。以前大家都認為看門狗一旦工作,就不能進行控制,也不便於程序調試,所以在硬件上,會使用單片機來控制看門狗芯片的電源,原理圖如下:
最近在工程中由於MCU的復位信號一直是低電平,導致程序下不下去,最后查原因,發現是看門狗電路這一塊造成的,然后就仔細看SP706SEN的手冊,發現WDI引腳這樣描述:如果WDI引腳處於浮空或高阻狀態,則禁止看門狗功能;
二、程序處理
在程序中,初始化引腳時,把WDI初始化為浮空輸入,當需要開啟看門狗的時候,把WDI引腳設置為推挽輸出,開啟后,在定時器函數里翻轉該引腳狀態,以達到喂狗的目的,程序如下:
1 /*Configure GPIO pin : PtPin */ 2 GPIO_InitStruct.Pin = WATCHDOG_FLAG_Pin; 3 GPIO_InitStruct.Mode = GPIO_MODE_INPUT; 4 GPIO_InitStruct.Pull = GPIO_NOPULL; 5 HAL_GPIO_Init(WATCHDOG_FLAG_GPIO_Port, &GPIO_InitStruct); 6 7 } 8 9 /* USER CODE BEGIN 2 */ 10 // 開啟看門狗函數 11 void watchDogEN(void) 12 { 13 GPIO_InitTypeDef GPIO_InitStruct; 14 GPIO_InitStruct.Pin = WATCHDOG_FLAG_Pin; 15 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; 16 GPIO_InitStruct.Pull = GPIO_NOPULL; 17 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; 18 HAL_GPIO_Init(WATCHDOG_FLAG_GPIO_Port, &GPIO_InitStruct); 19 }
1 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) 2 { 3 if(htim == (&htim3)) // 定時1s 4 { 5 HAL_GPIO_TogglePin(WATCHDOG_FLAG_GPIO_Port, WATCHDOG_FLAG_Pin); // 喂狗 6 HAL_GPIO_TogglePin(RUN_GPIO_Port, RUN_Pin); 7 } 8 else if (htim == (&htim4)) 9 { 10 SensRxFlag = 1; 11 } 12 }