窗口看門狗(WWDG)

窗口看門狗(WWDG)

1. WWDG 簡介

  • 作用:在應用跑飛、死循環、長時間被中斷占用等異常時,強制復位 MCU,提高系統可靠性。

  • 時鐘來源:來自 APB1 時鐘 (PCLK1) 的分頻(與 IWDG 的 LSI 獨立時鐘不同)。

  • 核心特性

    • 7 位遞減計數器 T[6:0]:從 0x7F 遞減到 0x40,再到 0x3F 時復位。

    • 窗口值 W[6:0]:喂狗必須在“窗口”內進行(T ≤ W 且 T > 0x3F);

      • 喂早了(T > W)立刻復位

      • 喂晚了(T ≤ 0x3F)復位

    • EWI(Early Wakeup Interrupt)提前喚醒中斷:當 T 遞減到 0x40 時產生中斷,給你“最后一次機會”喂狗。


2. 工作原理與簡化框圖

計數與窗口規則

T: 0x7F ──… 遞減 …── 0x5F ──…── 0x40 ── 0x3F↑允許最早喂的位置=W (例如0x5F)     ↑EWI中斷      ↑復位點
必須在 T∈(0x3F, W] 這個區間喂狗;早于W立即復位;晚于0x3F也復位

時鐘鏈路與計數

PCLK1 ──÷4096──÷(1/2/4/8)──> 計數時鐘tick  ──> 7位遞減計數器 T[6:0]├─ T==0x40  → 觸發EWI└─ T==0x3F  → 復位MCU

3. 寄存器與 HAL 函數

關鍵寄存器(STM32F1 系列)

  • WWDG_CR(控制/計數器寄存器)

    • WDGA(bit7):1=啟動 WWDG

    • T[6:0]:當前計數值(寫入相當于刷新/喂狗)

  • WWDG_CFR(配置寄存器)

    • W[6:0]:窗口值

    • WDGTB[1:0]:預分頻(1/2/4/8)

    • EWI(bit9):提前喚醒中斷使能

  • WWDG_SR(狀態寄存器)

    • EWIF(bit0):EWI 標志位(到 0x40 時置位,軟件寫 0 清除)

HAL 屏蔽了直接位操作,底層完成上述寫寄存器邏輯。

HAL 相關 API

  • HAL_WWDG_Init(&h):配置并啟動 WWDG(設定 Counter、Window、Prescaler、EWI)。

  • HAL_WWDG_Refresh(&h)喂狗(刷新計數器)。

  • HAL_WWDG_EarlyWakeupCallback(&h)EWI 回調(T==0x40 時被調用)。

  • HAL_WWDG_IRQHandler(&h):在 WWDG_IRQHandler 里調用它,才能觸發回調。

  • 復位來源判斷:

    • __HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST):是否 WWDG 復位;

    • __HAL_RCC_CLEAR_RESET_FLAGS():清除復位標志。


4. 溢出時間與“喂狗窗口”計算

計數器遞減 tick 周期

  • Prescaler ∈ {1,2,4,8}(HAL:WWDG_PRESCALER_1/2/4/8

  • 例:72 MHz 系統 + 默認 APB1=36 MHz,若 Prescaler=8:

代入你代碼的參數

T_init=0x7FW=0x5FPrescaler=8PCLK1≈36 MHz

  • t_tick ≈ 0.910 ms

  • t_min = (0x7F-0x5F)*t_tick = 32*tick ≈ 29.1 ms

  • t_EWI = (0x7F-0x40)*t_tick = 63*tick ≈ 57.3 ms

  • t_reset = (0x7F-0x3F)*t_tick = 64*tick ≈ 58.3 ms

  • 允許喂狗窗口[29.1 ms, 58.3 ms)窗口寬度約 29.1 ms

  • 你主循環 delay_ms(50)50 ms 恰好落在窗口內,所以正常不會復位。

    • 若偶爾卡住,EWI 在 ~57.3 ms 觸發回調,回調里你又 wwdg_feed(),可兜底避免復位。

5. 配置步驟(HAL 版)

  1. 打開 WWDG 時鐘 + 中斷(在 HAL_WWDG_MspInit 里)

__HAL_RCC_WWDG_CLK_ENABLE();
HAL_NVIC_SetPriority(WWDG_IRQn, 2, 2);
HAL_NVIC_EnableIRQ(WWDG_IRQn);

2.初始化并啟動

wwdg_handle.Instance      = WWDG;
wwdg_handle.Init.Counter  = 0x7F;                 // 初值(7位)
wwdg_handle.Init.Window   = 0x5F;                 // 窗口
wwdg_handle.Init.Prescaler= WWDG_PRESCALER_8;     // 預分頻
wwdg_handle.Init.EWIMode  = WWDG_EWI_ENABLE;      // 開EWI
HAL_WWDG_Init(&wwdg_handle);

3.中斷服務與回調

void WWDG_IRQHandler(void){ HAL_WWDG_IRQHandler(&wwdg_handle); }void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *h){wwdg_feed();          // 最后時刻兜底喂狗led2_toggle();        // 觀測EWI是否發生
}

4.周期性喂狗(窗口內)

HAL_WWDG_Refresh(&wwdg_handle);

5.復位來源識別

if(__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST)) { /* ... */ }
__HAL_RCC_CLEAR_RESET_FLAGS();

調試注意:單步/斷點會讓時間停住。建議在調試時凍結 WWDG:
DBGMCU->APB1FZ |= DBGMCU_APB1_FZ_DBG_WWDG_STOP;(CubeMX 可勾選)

6.HAL 可選值速查

  • wwdg_handle.Init.Prescaler

    • WWDG_PRESCALER_1 / _2 / _4 / _8

  • wwdg_handle.Init.EWIMode

    • WWDG_EWI_DISABLE / WWDG_EWI_ENABLE

  • 復位標志(__HAL_RCC_GET_FLAG()):

    • RCC_FLAG_WWDGRST / IWDGRST / PINRST / PORRST / SFTRST

  • 計數/窗口范圍

    • CounterWindow 都是 7 位有效0x40 ~ 0x7F

7. IWDG vs WWDG(差異對照)

特性

IWDG(獨立看門狗)WWDG(窗口看門狗)
時鐘源LSI(約40kHz,獨立)APB1(PCLK1)/4096/Presc
能否停表一旦啟動不可停可在調試時凍結(DBGMCU)
喂狗限制只要周期內喂即可必須在窗口內喂(太早/太晚都復位)
預警EWI(T==0x40)
典型用途無人值守、兜底安全需要“節拍約束”的系統(防止過早喂狗掩蓋問題)

main.c

#include "sys.h"       // 系統時鐘初始化函數
#include "delay.h"     // 延時函數
#include "led.h"       // LED 控制
#include "uart1.h"     // 串口1
#include "wwdg.h"      // 窗口看門狗驅動int main(void)
{HAL_Init();                         /* 初始化 HAL 庫(NVIC 分組、SysTick 定時器等) */stm32_clock_init(RCC_PLL_MUL9);     /* 設置系統時鐘為 72MHz(HSE=8MHz * 9) */led_init();                         /* 初始化 LED GPIO */uart1_init(115200);                 /* 初始化串口1,波特率 115200 *//* 初始化窗口看門狗* 參數1 tr:計數器初值(0x40 ~ 0x7F,最高7位有效)* 參數2 wr:窗口值(0x40 ~ 0x7F),喂狗時計數器必須 <= wr 才有效* 參數3 psc:分頻器* 本例:Counter=0x7F (127),Window=0x5F (95),Prescaler=8*/wwdg_init(0x7f, 0x5f, WWDG_PRESCALER_8);printf("hello world!\r\n");/* 判斷上次復位原因 */if(__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST) != RESET){printf("窗口看門狗復位!\r\n");__HAL_RCC_CLEAR_RESET_FLAGS();  /* 清除復位標志 */}elseprintf("外部復位!\r\n");while(1){ delay_ms(50);          /* 延時 50ms */wwdg_feed();           /* 喂狗(刷新計數器) */led1_toggle();         /* 翻轉 LED1,觀察程序是否在運行 */}
}

wwdg.c

#include "wwdg.h"
#include "led.h"WWDG_HandleTypeDef wwdg_handle = {0};   // 窗口看門狗句柄/* 初始化窗口看門狗* tr: Counter 初值 (0x40 ~ 0x7F)* wr: Window 窗口值 (0x40 ~ 0x7F)* psc: 預分頻系數*/
void wwdg_init(uint8_t tr, uint8_t wr, uint32_t psc)
{wwdg_handle.Instance = WWDG;             // 指定實例 = 窗口看門狗外設wwdg_handle.Init.Counter = tr;           // 設置計數器初值wwdg_handle.Init.Window = wr;            // 設置窗口值wwdg_handle.Init.Prescaler = psc;        // 設置分頻系數wwdg_handle.Init.EWIMode = WWDG_EWI_ENABLE; // 使能提前喚醒中斷(EWI)HAL_WWDG_Init(&wwdg_handle);             // 初始化硬件
}/* MSP 初始化:底層硬件配置 */
void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg)
{__HAL_RCC_WWDG_CLK_ENABLE();   // 打開 WWDG 時鐘/* 配置中斷優先級 */HAL_NVIC_SetPriority(WWDG_IRQn, 2, 2);  // 搶占優先級2,子優先級2HAL_NVIC_EnableIRQ(WWDG_IRQn);          // 使能 WWDG 中斷
}/* 窗口看門狗中斷服務函數 */
void WWDG_IRQHandler(void)
{HAL_WWDG_IRQHandler(&wwdg_handle);  // 調用 HAL 庫中斷處理
}/* 提前喚醒回調函數* 當計數器降到 0x40 時產生 EWI 中斷* 在這里可以做一些預處理(比如打印信息、刷新寄存器等)*/
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{wwdg_feed();       // 喂狗(刷新計數器)led2_toggle();     // 翻轉 LED2,表示進入了回調
}/* 喂狗函數:刷新 WWDG 計數器 */
void wwdg_feed(void)
{HAL_WWDG_Refresh(&wwdg_handle);
}

實驗現象

  1. 程序啟動時

    • 串口打印 "hello world!"。

    • 判斷復位來源,如果是看門狗復位,會打印“窗口看門狗復位!”。

  2. 正常情況(延時 50ms < 看門狗溢出時間)

    • 主循環中不斷 wwdg_feed(),LED1 每 50ms 翻轉一次。

    • 程序一直運行,LED1 閃爍。

  3. 提前喚醒中斷現象

    • 當計數器下降到 0x40,觸發 EWI 中斷,執行 HAL_WWDG_EarlyWakeupCallback

      • 喂狗(防止復位)

      • LED2 翻轉,表示進入了回調。

  4. 異常情況(如果不喂狗,或者喂狗太早/太晚)

    • WWDG 會復位 MCU,串口下次啟動會打印“窗口看門狗復位!”。

?和獨立看門狗 (IWDG) 不同,WWDG 多了“窗口限制”:喂狗必須在合適的范圍內,太早/太晚都不行

可選參數

A. wwdg_handle.Init.Counter

  • 范圍:0x40 ~ 0x7F(7 位有效)

  • 功能:設置計數器初值,從該值遞減計數,減到 0x3F 時復位。

B. wwdg_handle.Init.Window

  • 范圍:0x40 ~ 0x7F

  • 功能:定義一個“窗口值”。

    • 喂狗必須在計數器 ≤ Window 時才有效。

    • 如果喂狗時計數器 > Window → 立即復位!

C. wwdg_handle.Init.Prescaler

可選值(分頻系數):

  • WWDG_PRESCALER_1

  • WWDG_PRESCALER_2

  • WWDG_PRESCALER_4

  • WWDG_PRESCALER_8

作用:控制計數器遞減的速度。

D. wwdg_handle.Init.EWIMode

  • WWDG_EWI_DISABLE:不啟用提前喚醒中斷

  • WWDG_EWI_ENABLE:啟用 EWI,當計數器降到 0x40 時產生中斷(可在中斷中喂狗)。

E. 復位標志

通過 __HAL_RCC_GET_FLAG() 獲取:

  • RCC_FLAG_WWDGRST → 窗口看門狗復位

  • RCC_FLAG_IWDGRST → 獨立看門狗復位

  • RCC_FLAG_PINRST → 外部復位

  • RCC_FLAG_PORRST → 上電復位

  • RCC_FLAG_SFTRST → 軟件復位


?總結

  • WWDG 與 IWDG 的區別

    • IWDG:只要定期喂狗就行,沒有窗口要求,獨立時鐘(LSI),一旦開啟不可關閉。

    • WWDG:有窗口限制,喂狗太早/太晚都復位,用系統時鐘分頻,支持提前喚醒中斷。

  • 本實驗現象

    • LED1 周期閃爍,LED2 在回調中翻轉;

    • 如果關閉喂狗 → MCU 重啟 → 串口提示“窗口看門狗復位!”。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/96375.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/96375.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/96375.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PyTorch API 6

文章目錄torch.onnx概述基于 TorchDynamo 的 ONNX 導出器基于TorchScript的ONNX導出器貢獻與開發torch.optim如何使用優化器構建優化器每個參數的選項執行優化步驟optimizer.step()optimizer.step(closure)基類算法如何調整學習率如何利用命名參數加載優化器狀態字典權重平均法…

2025年09月計算機二級MySQL選擇題每日一練——第二期

計算機二級中選擇題是非常重要的&#xff0c;所以開始寫一個每日一題的專欄。 答案及解析將在末尾公布&#xff01; 今日主題&#xff1a;SQL 交互操作基礎 1、有如下創建表的語句&#xff1a; CREATE TABLE tb_gs( gno CHAR(10) NOT NULL, sno CHAR(10) NOT NULL, gjob CH…

MySQL診斷系列(5/6):表結構與元數據查詢——快速掌握數據庫“DNA”

&#x1f517; 接上一篇《MySQL性能瓶頸定位》&#xff0c;今天我們來學習如何像查字典一樣&#xff0c;快速、精準地了解任何數據庫的內部結構。 當你接手一個新項目&#xff0c;或者需要排查一個不熟悉的模塊時&#xff0c;你最需要的是什么&#xff1f; 不是代碼&#xff0…

精準評估新紀元:AI得賢招聘官AI面試智能體6.3,重新定義AI面試

隨著生成式AI技術爆發式發展&#xff0c;人力資源管理正經歷從“信息化”到“智能化”的躍遷。據Gartner預測&#xff0c;2025年60%的企業將使用AI完成HR基礎事務性工作。在這場變革中&#xff0c;AI得賢招聘官以其卓越的技術實力和產品能力&#xff0c;已成為行業智能化轉型的…

MinerU:重新定義PDF智能提取的開源利器

MinerU&#xff1a;重新定義PDF智能提取的開源利器 ——告別傳統工具的“雞肋”體驗&#xff0c;讓文檔處理真正高效智能 在數字化時代&#xff0c;PDF、Word等文檔已成為信息傳遞的主要載體&#xff0c;但如何從這些格式中精準提取數據&#xff0c;卻成了困擾無數人的難題。…

電腦芯片其實更偏向MPU不是CPU,GPU CPU NPU MPU MCU的區別

現代電腦的處理器&#xff08;如 Intel i5&#xff09;本質上是 MPU&#xff0c;因為它集成了 CPU 核心、緩存、定時器等&#xff0c;但我們日常仍習慣稱其為 “CPU”電腦里的芯片&#xff08;如 Intel i5、AMD Ryzen&#xff09;通常被通俗地稱為 “CPU”&#xff0c;但嚴格來…

Python爬蟲XPath實戰:電商商品ID的精準抓取策略

1. 引言 在電商數據爬取過程中&#xff0c;商品ID&#xff08;Product ID&#xff09;是最關鍵的字段之一&#xff0c;它通常用于唯一標識商品&#xff0c;并可用于構建商品詳情頁URL、價格監控、庫存查詢等場景。然而&#xff0c;不同電商網站的HTML結構差異較大&#xff0c;…

Web3:重構互聯網秩序的下一代范式革命

Web3&#xff08;即 Web 3.0&#xff09;作為互聯網發展的第三代形態&#xff0c;并非簡單的技術迭代&#xff0c;而是一場圍繞 “數據主權” 與 “價值分配” 的底層邏輯重構。它以區塊鏈為核心骨架&#xff0c;融合分布式存儲、密碼學、人工智能等技術&#xff0c;旨在打破 W…

DeepSeek R2難產:近期 DeepSeek-V3.1 發布,邁向 Agent 時代的第一步

DeepSeek R2難產&#xff1a;近期 DeepSeek-V3.1 發布&#xff0c;邁向 Agent 時代的第一步 要說 AI 模型的江湖&#xff0c;這一年簡直就是 「大模型修羅場」。 前腳 R2 傳出難產的風聲&#xff0c;后腳 DeepSeek 就甩出了一張大招牌&#xff1a;DeepSeek-V3.1。 這波操作不…

element-plus:el-tree ref初始化異常記錄

文章目錄描述問題解決記錄一個tsx 下el-tree的小問題描述 <Dialog v-model"showEdit" :title"t(button.edit)" width"900" :maxHeight"650"><el-form :model"nowdata" class"dialog"><el-form-ite…

Linux軟件安裝(JDK,Mysql,Nginx)

安裝方式介紹一、安裝JDKtar -zxvf jdk-17.0.10_linux-x64_bin.tar.gz -C /usr/localexport JAVA_HOME/usr/local/jdk-17.0.10export PATH$JAVA_HOME/bin:$PATHsource /etc/profile1、操作步驟二、mysql黑馬視頻已經安裝好了我們只需開放指定端口就可以在navicat中連接了&#…

公有地址和私有地址

在計算機網絡中&#xff0c;私有地址和公有地址是IP地址的兩大重要分類&#xff0c;二者在網絡通信中承擔著不同角色。下面從定義、聯系、區別和應用四個維度進行詳細說明&#xff1a; 一、定義 1. 公有地址&#xff08;Public IP Address&#xff09; 公有地址是全球唯一且可在…

分治思想在系統分流削峰中的實踐與Golang前沿實現

分治思想在系統分流削峰中的實踐與Golang前沿實現 1. 分治思想概述 分治(Divide and Conquer)是計算機科學中一種重要的算法設計思想&#xff0c;其核心在于"分而治之"——將復雜問題分解為若干個規模較小的相同或相似子問題&#xff0c;遞歸地解決這些子問題&#x…

移動端視口終極解決方案:使用 Visual Viewport封裝一個優雅的 React Hook

前言 在移動端開發中&#xff0c;視口高度一直是一個令人頭疼的問題。尤其是在 iOS Safari 瀏覽器中&#xff0c;還有三星手機的導航遮擋&#xff0c;當虛擬鍵盤彈出時&#xff0c;視口高度的變化會導致固定定位元素錯位、全屏布局異常等問題。本文將深入分析這個問題的本質&a…

react中key的作用

在 React 中&#xff0c;key 是一個特殊的屬性&#xff08;prop&#xff09;&#xff0c;它的主要作用是幫助 React 識別哪些元素發生了變化、被添加或被移除&#xff0c;從而高效地更新和重新渲染列表中的元素。以下是 key 的具體作用和注意事項&#xff1a;1. 高效更新虛擬 D…

Lua學習記錄 - 自定義模塊管理器

為人所知的是lua自帶的require函數加載腳本只會加載一次(就像unity里面的資源管理和AB包管理)&#xff0c;而主播調試習慣是用Odin插件的Button在unity編輯器模式里調試而非進入播放模式后調試&#xff0c;今天主播在做熱更新相關的時候企圖多次調用腳本打印以調試功能&#xf…

MongoDB 分片集群復制數據庫副本

文章目錄一、登錄MongoDB查詢數據庫及集合分片情況二、登錄MongoDB先創建副本數據庫并設置數據庫及集合分片功能三、登錄MongoDB查詢emop_slinkmain數據庫main_repetition集合和四、使用mongodump壓縮備份emop_slinkmain數據庫中的main_repetition集合和shard_repetition 集合五…

SQLite 加密與不加密性能對比與優化實踐

在項目中&#xff0c;為了保證數據安全&#xff0c;我們可能會對 SQLite 數據庫進行加密&#xff08;例如使用 SQLiteMC/SQLCipher&#xff09;。然而&#xff0c;加密數據庫在帶來安全性的同時&#xff0c;也會帶來顯著的性能損耗。本文結合實測與源碼分析&#xff0c;介紹 SQ…

Azure官網為何沒直接體現專業服務

微軟Azure官網沒有直接、醒目地展示其專業服務&#xff08;如遷移、定制化解決方案咨詢等&#xff09;&#xff0c;確實容易讓人疑惑。這背后其實是微軟Azure特定的市場策略和商業模式。下面我為你解釋原因&#xff0c;并告訴你怎么找到這些服務。&#x1f9e9; 核心原因&#…

人體生理參數信號采集項目——心電信號

1.硬件——焊接調試趣事&#xff1a;由于測量手法問題&#xff0c;以及對示波器不太熟悉&#xff0c;差點以為沒信號&#xff0c;都打算重焊一塊板子了&#xff0c;但&#xff0c;實際上&#xff0c;信號輸出是相對完美的&#xff1b;遇到的疑難雜癥&#xff1a;1&#xff09;5…