1. 程式人生 > >HAL--獨立看門狗、視窗看門狗

HAL--獨立看門狗、視窗看門狗

一、看門狗簡介

        看門狗其實就是一個定時器,從功能上說它可以讓微控制器在程式發生意外(程式進入死迴圈或跑飛)的時候,能重新回覆到系統剛上電狀態,以保障系統出問題的時候可以重啟一次。說的複雜一點,看門狗就是能讓程式出問題是能重新啟動系統。

獨立看門狗(IWDG)

         前文再續,書接上一會,上一章說到待機模式可以通過IWDG喚醒,獨立看門口功能框圖如下。實際上獨立看門口狗就是一個遞減計數器,當計時器的值減到0時,IWDG會產生一個復位訊號,系統復位重新啟動。為避免產生看門狗復位,則需在計數器減到0之前過載計數器,即“喂狗”。當程式出錯時沒有重新整理計數器,計數器遞減到0,系統復位重新啟動,避免程式繼續錯誤執行。

    本章程式在串列埠printf工程的基礎上修改,複製串列埠printf的工程,修改資料夾名。擊STM32F746I.ioc開啟STM32cubeMX的工程檔案重新配置,開啟獨立看門狗(IWDG)。

  

        IWDG引數配置如下。IWDG的時鐘為32kHz,此時設定計數器時鐘為32分頻,則分頻後的時鐘頻率為1KHz.遞減基礎器過載值(down-counter reload value)配置為1000,即1000ms不重新整理IWDG系統復位。IWDG視窗值(windows value)為預設不修改。當計數器的值大於視窗值時,如果執行過載操作,則會產生復位。

在main()函式中開啟IWDG.

 

在while迴圈中每延時800ms重新整理一次IWDG,過載計數器。

  編譯程式並下載到開發板。開啟串列埠除錯助手,設定波特率為115200,串列埠助手上面會顯示如下資訊。

當在while迴圈中註釋掉HAL_IWDG_Refresh(&hiwdg)語句,不重新整理計數器。重新編譯程式時串列埠會輸出如下訊號,由於不重新整理計數器,獨立看門狗每1000ms復位重啟一次。

再實際應用中,獨立看門狗重新整理操作不會再while迴圈中,而且也不好計算時間。一般都是通過定時器中斷處理函式中重新整理IWDG。

視窗看門狗(WWDG)

   視窗看門狗相對獨立看門狗對計數器的重新整理時間要求更加嚴格。必須在限定的時間視窗內重新整理計數器。

視窗看門狗啟用情況下,滿足以下條件會產生復位。

    1.當遞減計數器的值小於0x40時(即從0x40滾到0x3F)會產生復位。

    2.當計數器值大於視窗暫存器的值時,如果軟體過載計數器,則會產生復位。

        從上面的時序圖中可以看到,如果遞減計數器的值(T[6:0])大於視窗暫存器(W[6:0])的值,過載計數器會產生復位。當遞減計時器的值小於0x40時,也會產生復位。所以只能在W[6:0] ~ 0x3F之間重新整理,在視窗之外過載遞減計數器時復位。儲存在視窗暫存器(WWDG_CR)中的值必須介於0xFF和0xC0之間。開啟視窗看門狗中斷時,當遞減計數器的值等於0x40時觸發中斷。

 

配置WWDG計數器預分頻為8,視窗暫存器的值為90,遞減計數器重新整理值為127。

WWDG時鐘是掛接到APB1上,系統時鐘為180MHz時,PCLK1時鐘為54MHz。

則WWDG計數器的頻率為:(PCLK1 (45MHz)/4096)/8) = 1648 Hz (~607 us) 

WWDG計數器重新整理值為127,則超時時間為:~607 us * (127-63) = 39 ms

F7


 

WWDG時鐘是掛接到APB1上,系統時鐘為216MHz時,PCLK1時鐘為45MHz。

則WWDG計數器的頻率為:(PCLK1 (54MHz)/4096)/8) = 1373Hz (~728us) 

WWDG計數器重新整理值為127,則超時時間為:~728 us * (127-63) ~= 47 ms

F4

開啟視窗看門狗中斷。

在main()函式中開啟WWDG.

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_WWDG_Init();

 
  MX_NVIC_Init();
  printf("main \r\n");
  __HAL_WWDG_ENABLE_IT(&hwwdg,WWDG_IT_EWI);//開啟WWDG並使能中 HAL_WWDG_EarlyWakeupCallback
  printf("\n\r***** start main before while*****\n\r");
 
  while (1)
  {
	 printf(" Refreshes the WWDG !!!\n\r");
	 HAL_Delay(200);
  }

}

//視窗程式的中斷並不是重新整理計數器 而是儲存程式重要資料,不然沒任何意義
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef* hwwdg)
{
		HAL_WWDG_Refresh(hwwdg);//喂狗,當改行被註釋掉則無限重啟主程式
}
 

在main.c檔案後面新增WWDG中斷回撥函式,當遞減計數器的值為0x40觸發中斷,中斷處理函式中重新整理WWDG。

編譯程式並下載到開發板。開啟串列埠除錯助手,設定波特率為115200,串列埠助手上面會顯示如下資訊。

當在WWDG中斷回撥函式中註釋掉HAL_WWDG_Refresh 語句,不重新整理計數器。重新編譯程式時串列埠會輸出如下訊號,由於不重新整理計數器,獨立看門狗每47ms復位重啟一次。