文章目錄
- 一、看門狗基礎介紹
- (一)看門狗概述:
- (二)看門狗的作用:
- (三)看門狗的原理:
- (四)為什么需要使用看門狗來提高系統的可靠性:(了解)
- (五)硬件配置
- (六)看門狗應用
- (七)想了解高級功能和技巧可以參考以下方式:
- 二、HAL庫獨立看門狗學習和時間溢出計算
- 三、HAL庫獨立看門狗配置流程
一、看門狗基礎介紹
(一)看門狗概述:
看門狗(Watchdog)是一種用于提高系統可靠性的硬件或軟件機制。它的作用是監控系統的運行狀態,并在系統出現故障或停止響應時采取相應的措施,如復位系統或執行預定義的異常處理程序。
(二)看門狗的作用:
通過使用看門狗,系統能夠在出現故障或停止響應時快速檢測并采取措施。它可用于監控各種硬件和軟件故障,如死鎖、無限循環、崩潰等。看門狗是特別有用的,當系統處于無人監視或遠程控制的環境中時,可以確保系統自動恢復或采取適當的應對措施。
(三)看門狗的原理:
1.監控系統狀態:看門狗定時器會周期性地計數,當系統正常運行時,軟件會定期“喂狗”,即重置看門狗計數器,防止計數器溢出。如果系統在規定的時間內未能喂狗,即未能刷新看門狗計數器,說明系統可能出現了故障或停止響應。
2.超時觸發復位:看門狗定時器的計數器達到預設的閾值(重裝載值)時,會觸發看門狗超時事件。這意味著系統在規定的時間內未能喂狗,被認為是異常狀態。超時事件可以觸發復位電路,導致系統執行復位操作,將系統恢復到初始狀態。
3.系統恢復:當看門狗超時事件發生時,系統會執行相應的恢復操作。這可以包括重新初始化系統、重新加載程序或執行特定的異常處理程序,以確保系統能夠正常運行。
(四)為什么需要使用看門狗來提高系統的可靠性:(了解)
1.異常恢復:看門狗可以在系統出現異常或故障時觸發重啟操作。如果系統在運行過程中發生了死鎖、崩潰、無限循環或其他異常情況,看門狗能夠檢測到這些情況并通過重啟系統來恢復正常運行。這有助于避免系統持續處于不可用或不穩定狀態。
2.軟件故障保護:即使在軟件出現故障或異常的情況下,看門狗也能夠確保系統的可靠性。通過定期喂狗操作,軟件可以證明自己仍在正常運行。如果軟件由于某種原因無法進行喂狗操作(如死循環或異常跳轉),看門狗將檢測到這種情況并采取相應的恢復措施。
3.系統穩定性監控:看門狗可以監控系統的運行狀態和穩定性。它會定期計時,如果系統在設置的時間間隔內沒有進行喂狗操作,說明系統可能出現了故障或停滯。在這種情況下,看門狗將觸發重啟操作,以確保系統恢復到可靠的狀態。
4.預防嵌入式系統停頓:在嵌入式系統中,可能會出現一些無法預料的情況,導致系統停頓或無響應。看門狗可以幫助預防這些停頓情況的發生。通過設置適當的看門狗定時器周期和喂狗操作,可以確保系統在規定時間內持續運行,避免長時間的停頓或無響應。
(五)硬件配置
學習如何配置單片機的時鐘源和時鐘分頻器,以確保看門狗定時器的時鐘頻率正確,具體查看對應芯片的數據手冊或參考手冊,我用的是stm32f103的板子,STM32 的獨立看門狗由內部專門的 40Khz 低速時鐘驅動,即使主時鐘發生故障,它也仍然有效。這里需要注意獨立看門狗的時鐘是一個內部 RC 時鐘,所以并不是準確的 40Khz,而是在 30~60Khz 之間的一個可變化的時鐘,只是我們在估算的時候,以 40Khz 的頻率來計算,看門狗對時間的要求不是很精確,所以,時鐘有些偏差,都是可以接受的。(本段參考正點原子STM32HAL庫開發指南)
至于看門狗硬件引腳如何設置需要硬件工程師決定。
(六)看門狗應用
看門狗在實際應用中的用途,如監控系統死鎖、處理器失效等
學習如何合理設置看門狗的預分頻器和重裝載值,以達到適當的超時時間
研究如何在系統中處理看門狗復位,以確保系統能夠正確恢復并繼續正常運行
(七)想了解高級功能和技巧可以參考以下方式:
1.學習如何在看門狗定時器中斷中執行特定的操作
2.探索看門狗模塊的其他功能,如窗口模式、硬件喂狗等
3.研究如何在系統中處理看門狗異常,如故障檢測和容錯機制
二、HAL庫獨立看門狗學習和時間溢出計算
學習看門狗需要了解以下幾個寄存器
1.IWDG_KR
在鍵寄存器(IWDG_KR)中寫入 0xCCCC,開始啟用獨立看門狗;此時計數器開始從其復位
值 0xFFF 遞減計數。當計數器計數到末尾 0x000 時,會產生一個復位信號(IWDG_RESET)。 無論何時,只要鍵寄存器 IWDG_KR 中被寫入 0xAAAA, IWDG_RLR 中的值就會被重新加載到計數器中從而避免產生看門狗復位。
IWDG_PR 和 IWDG_RLR 寄存器具有寫保護功能。要修改這兩個寄存器的值,必須先向
IWDG_KR 寄存器中寫入 0x5555。將其他值寫入這個寄存器將會打亂操作順序,寄存器將重新被保護。重裝載操作(即寫入 0xAAAA)也會啟動寫保護功能。
2.IWDG_PR 預分頻寄存器
該寄存器用來設置看門狗時鐘的分頻系數,最低為 4,最高位 256,該寄存器是一個 32 位的寄存器,但是我們只用了最低 3 位,其他都是保留位
3.IWDG_RL重裝載寄存器
4.獨立看門狗時間溢出計算
溢出時間Tout=重裝載值X看門狗時鐘周期
看門狗時鐘周期=1/(預分頻值X時鐘頻率)
預分頻值=1/(預分頻因子)
預分頻因子的確定要查看PR寄存器中的后三位,我們用的是100,對應的是64分頻因子,帶入上式子,如下所示就可以算出來溢出時間了,單位ms
Ps:有同學問為什么設置500重裝載值和64預分頻因子呢?
其實是我自己在問啦哈哈哈哈哈,因為我第一次學看門狗。
很簡單,就看你要多久的溢出時間,我這個設置大概是1s溢出時間,你想改時間再設置其他數值即可!
三、HAL庫獨立看門狗配置流程
1.定義看門狗句柄
IWDG_HandleTypeDef IWDG_Handler;
2.看門狗配置初始化
分頻系數
重裝載值
看門狗初始化
void IWDG_Init(u8 prer,u16 rlr)
{IWDG_Handler.Instance=IWDG;IWDG_Handler.Init.Prescaler=prer; //設置IWDG分頻系數IWDG_Handler.Init.Reload=rlr; //重裝載值HAL_IWDG_Init(&IWDG_Handler); //初始化IWDG,默認會開啟獨立看門狗
}
3.喂狗函數
void IWDG_Feed(void)
{ HAL_IWDG_Refresh(&IWDG_Handler); //喂狗
}
4.While(1)按鍵喂狗
if(KEY_Scan(0)==WKUP_PRES) //如果WK_UP按下,喂狗
{
IWDG_Feed(); //喂狗
}
delay_ms(10);