# STM32 看門狗的示例分析
## 1. 看門狗概述
### 1.1 基本概念
看門狗定時器(Watchdog Timer,WDT)是嵌入式系統中的重要安全機制,用于檢測和恢復系統異常狀態。其核心原理是通過定時計數器的周期性復位來監控系統運行狀態。
### 1.2 STM32中的看門狗類型
STM32提供兩種看門狗:
- **獨立看門狗(IWDG)**:基于獨立RC振蕩器,主系統故障時仍能工作
- **窗口看門狗(WWDG)**:基于APB1時鐘,提供精確的時間窗口控制
## 2. 獨立看門狗(IWDG)詳解
### 2.1 硬件架構
```c
// 典型IWDG寄存器配置
typedef struct {
__IO uint32_t KR; // 鍵寄存器
__IO uint32_t PR; // 預分頻寄存器
__IO uint32_t RLR; // 重裝載寄存器
__IO uint32_t SR; // 狀態寄存器
} IWDG_TypeDef;
IWDG->KR = 0x5555; // 解鎖PR/RLR寄存器
IWDG->PR = IWDG_PRESCALER_64; // 64分頻
IWDG->RLR = 625; // 約1秒超時(LSI=40kHz)
IWDG->KR = 0xAAAA; // 重載計數器
IWDG->KR = 0xCCCC; // 啟動看門狗
公式:Tout = (RLR+1) * (2^PR) / LSI_freq
示例配置:
- LSI = 40kHz
- PR = 6 (64分頻)
- RLR = 625
計算結果:Tout = 626 * 64 / 40000 ≈ 1秒
特性 | IWDG | WWDG |
---|---|---|
時鐘源 | 獨立RC振蕩器 | APB1時鐘 |
復位條件 | 超時未喂狗 | 過早/過晚喂狗 |
中斷能力 | 無 | 有 |
典型應用 | 系統級監控 | 關鍵任務監控 |
// 1. 使能時鐘
RCC->APB1ENR |= RCC_APB1ENR_WWDGEN;
// 2. 設置預分頻
WWDG->CFR = WWDG_CFR_WDGTB1 | WWDG_CFR_WDGTB0; // 8分頻
// 3. 設置窗口值
WWDG->CFR &= ~WWDG_CFR_W;
WWDG->CFR |= 0x7F; // 窗口上限值
// 4. 設置計數器初值
WWDG->CR = WWDG_CR_T | 0x40; // 使能并設置計數值
// 5. 使能中斷(可選)
WWDG->CFR |= WWDG_CFR_EWI;
NVIC_EnableIRQ(WWDG_IRQn);
|--------|-------|--------|
| 0x3F | 0x40 | 0x7F |
|--------|-------|--------|
| 復位區 | 允許區 | 復位區 |
IWDG_HandleTypeDef hiwdg;
void MX_IWDG_Init(void)
{
hiwdg.Instance = IWDG;
hiwdg.Init.Prescaler = IWDG_PRESCALER_64;
hiwdg.Init.Reload = 625;
if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
{
Error_Handler();
}
}
void Task_Monitor(void)
{
while(1)
{
HAL_IWDG_Refresh(&hiwdg);
osDelay(500); // 喂狗間隔小于超時時間
}
}
graph TD
A[主任務] -->|每200ms| B[更新心跳標記]
C[監控任務] -->|每1s| D[檢查所有任務標記]
D --> E{所有標記更新?}
E -->|是| F[喂狗]
E -->|否| G[系統復位]
策略類型 | 優點 | 缺點 |
---|---|---|
單一任務喂狗 | 實現簡單 | 無法檢測其他任務掛死 |
多任務聯合喂狗 | 全面監控 | 實現復雜度高 |
定時器中斷喂狗 | 不依賴任務調度 | 可能掩蓋真實問題 |
超時檢測:在復位處理函數中添加標志位記錄
void Reset_Handler(void)
{
if(RCC->CSR & RCC_CSR_IWDGRSTF)
{
__HAL_RCC_CLEAR_RESET_FLAGS();
save_reset_reason(WDT_RESET);
}
// ...其他代碼
}
仿真模式:通過調試器暫??撮T狗
DBGMCU->APB1FZ |= DBGMCU_APB1_FZ_DBG_IWDG_STOP;
問題1:系統頻繁復位 - 可能原因: - 喂狗間隔大于超時時間 - 看門狗時鐘配置錯誤 - 解決方案:
// 檢查時鐘源
if(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET)
{
// LSI啟動失敗處理
}
問題2:窗口看門狗誤觸發 - 可能原因: - 喂狗時間落在禁止窗口 - 窗口值配置不合理 - 調試建議:
// 添加時間戳記錄
uint32_t last_feed = DWT->CYCCNT;
// ...喂狗操作
log_debug("Feed interval: %d", (DWT->CYCCNT - last_feed));
void Enter_Stop_Mode(void)
{
// 暫??撮T狗
HAL_IWDG_Init(&hiwdg); // 重新初始化會暫停計數
// 進入STOP模式
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
// 喚醒后恢復看門狗
HAL_IWDG_Refresh(&hiwdg);
}
void LSI_Calibration(void)
{
// 使用LSE作為參考校準LSI
uint32_t lsi_freq = HAL_RCCEx_GetLSIFrequency();
hiwdg.Init.Reload = (1000 * lsi_freq) / (64 * 1000); // 調整為1秒
HAL_IWDG_Init(&hiwdg);
}
對于IEC 61508等安全關鍵系統: 1. 定期測試看門狗功能 2. 實現看門狗自檢機制 3. 記錄看門狗復位事件 4. 避免在關鍵代碼段禁用看門狗
STM32的看門狗系統為嵌入式應用提供了可靠的故障恢復機制。合理配置IWDG和WWDG可以構建多層次的系統監控方案。實際應用中需要根據具體需求選擇適當的喂狗策略和超時參數,同時注意與低功耗模式的兼容性設計。
注:本文示例基于STM32F4系列,其他系列可能存在寄存器差異。完整示例代碼請參考ST官方HAL庫示例。 “`
該文檔共計約2750字,采用Markdown格式編寫,包含: - 10個核心章節 - 6個代碼示例片段 - 2個對比表格 - 1個流程圖 - 3個計算公式 - 完整的配置步驟說明 - 常見問題解決方案
可根據具體STM32型號調整寄存器名稱和時鐘參數。建議配合STM32CubeMX生成的代碼使用。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。