前言: 今天我們來學習看門狗的配置與函數,看門狗可以有效解決程序的跑飛,在使用過程中比較常見,那麼我們一起來學習下HAL庫 STM32CubeMX的獨立看門狗,靠窗看門狗的使用。本系列教程將HAL庫與STM32CubeMX結合在一起講解,使您可以更快速的學會各個模塊的使用
所用工具:
1、芯片: STM32F407ZET6
2、STM32CubeMx軟件
3、IDE: MDK-Keil軟件
4、STM32F1xx/STM32F4xxHAL庫
知識概括:
通過本篇博客您將學到:
STM32CubeMX創建看門狗例程
獨立看門狗,靠窗看門狗 工作原理
看門狗
在由單片機構成的微型計算機系統中單片機的工作常常會受到來自外界電磁場的干擾,造成程序的跑飛,而陷入死循環;或者因爲用戶配置代碼出現BUG,導致芯片無法正常工作,出於對單片機運行狀態進行實時監測的考慮,便產生了一種專門用於監測單片機程序運行狀態的模塊或者芯片,俗稱“看門狗”(watchdog)
簡單說:看門狗的本質就是定時計數器,計數器使能之後一直在累加 而喂狗就是重新寫入計數器的值,時計數器重新累加,
如果在一定時間內沒有接收到喂狗信號(表示MCU已經掛了),便實現處理器的自動復位重啓(發送復位信號)
STM32的內置看門狗
STM32內置兩個看門狗,提供了更高的安全性、時間的精確性和使用的靈活性。兩個看門狗設備(獨立看門狗、窗口看門狗)可以用來檢測和解決由軟件錯誤引起的故障。當計數器達到給定的超時值時,觸發一箇中斷(僅適用窗口看門狗)或者產生系統復位。
- 獨立看門狗(IWDG)由專用的低速時鐘(LSI)驅動(40kHz),即使主時鐘發生故障它仍有效。獨立看門狗適合應用於需要看門狗作爲一個在主程序之外 能夠完全獨立工作,並且對時間精度要求低的場合。
- 窗口看門狗由從APB1時鐘(36MHz)分頻後得到時鐘驅動。通過可配置的時間窗口來檢測應用程序非正常的過遲或過早操作。 窗口看門狗最適合那些要求看門狗在精確計時窗口起作用的程序。
IWDG-獨立看門狗
工程創建
1設置RCC
- 設置高速外部時鐘HSE 選擇外部時鐘源
2配置IWDG
- IWDG時鐘預分頻係數 4分頻
- 計數器重裝載值 4095 RLR
超出(溢出)時間計算:
Tout=((4×2^PRER) ×RLR)/LSI時鐘頻率
對應不同預分頻係數的PRER值:
3時鐘源設置
- 1選擇外部時鐘HSE 8MHz
- 2PLL鎖相環倍頻72倍
- 3系統時鐘來源選擇爲PLL
- 4設置APB1分頻器爲 /2
32的時鐘樹框圖 如果不懂的話請看《【STM32】系統時鐘RCC詳解(超詳細,超全面)》
4項目文件設置
- 1 設置項目名稱
- 2 設置存儲路徑
- 3 選擇所用IDE
5創建工程文件
然後點擊GENERATE CODE 創建工程
配置下載工具
新建的工程所有配置都是默認的 我們需要自行選擇下載模式,勾選上下載後復位運行
HAL庫獨立看門狗函數庫講解:
看門狗初始化函數
HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg)
喂狗函數:
HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg)
舉例: HAL_IWDG_Refresh(&hiwdg); //看門狗喂狗
使用該函數定時喂狗即可
WWDG-窗口看門狗
窗口看門狗的定義
窗口看門狗跟獨立看門狗一樣,也是一個遞減計數器不斷的往下遞減計數,當減到一個固定值 0x3F 時還不喂狗的話,產生復位,這個值叫窗口的下限,是固定的值,不能改變。
窗口看門狗之所以稱爲窗口,就是因爲其喂狗時間是在一個有上下限的範圍內(計數器減到某個值~計數器減到0x3F),在這個範圍內纔可以喂狗,可以通過設定相關寄存器,設定其上限時間(但是下限是固定的0x3F)
- 1計數器的初始值
- 2 是我們設置的上窗口(W[6:0]值
- 3是下窗口值(0x3F)
窗口看門狗計數器的值只有在2和3 之間(上窗口和下窗口之間)纔可以喂狗
窗口看門狗中斷:
並且窗口看門狗還可以使能中斷,如果使能了提前喚醒中斷,系統出現問題,喂狗函數沒有生效,那麼在計數器由減到0x40 (0x3f+1) 的時候,便會先進入中斷,之後纔會復位,你也可以在中斷裏面喂狗
WDGG窗口看門狗配置
- 1.點擊WWDG
- 2.
- WWDG時鐘預分頻係數 8
- WWDG上窗口值 0x5F
- WWDG計數器值 : 0x7F
- 設置看門狗提前喚醒中斷
- 3
- 使能窗口看門狗中斷
其餘配置與獨立看門狗相同配置即可
HAL庫獨立窗口狗函數庫講解:
看門狗初始化:
HAL_WWDG_Init(WWDG_HandleTypeDef *hwwdg)
喂狗:
HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg)
看門狗中斷處理函數:
HAL_WWDG_IRQHandler(WWDG_HandleTypeDef *hwwdg)
功能: 判斷中斷是否正常,並進入中斷回調函數
看門狗中斷回調函數:
__weak HAL_WWDG_EarlyWakeupCallback(hwwdg);
在HAL庫中,每進行完一箇中斷,並不會立刻退出,而是會進入到中斷回調函數中,
看門狗中斷運行完成之後,便會進入看門狗的中斷回調函數
例程實現:
本例程實現LED點亮延時300ms閃爍
在main.c下方添加中斷回調函數
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(hwwdg);
HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_15); //LED翻轉 --閃爍表示喂狗成功
HAL_WWDG_Refresh(hwwdg); //喂狗
}