【STM32】WDG看門狗(學習筆記)

?學習來源----->江協科技STM32

WDG簡介

  1. WDG(Watchdog)看門狗
  2. 看門狗可以監控程序的運行狀態,當程序因為設計漏洞、硬件故障、電磁干擾等原因,出現卡死或跑飛現象時,看門狗能及時復位程序,避免程序陷入長時間的罷工狀態,保證系統的可靠性和安全性
  3. 看門狗本質上是一個定時器,當指定時間范圍內,程序沒有執行喂狗(重置計數器)操作時,看門狗硬件電路就自動產生復位信號
  4. STM32內置兩個看門狗
  5. 獨立看門狗(IWDG):獨立工作,對時間精度要求較低
  6. 窗口看門狗(WWDG):要求看門狗在精確計時窗口起作用

STM32F10xxx內置兩個看門狗,提供了更高的安全性、時間的精確性和使用的靈活性。兩個看門狗設備(獨立看門狗和窗口看門狗)可用來檢測和解決由軟件錯誤引起的故障;當計數器達到給定的超時值時,觸發一個中斷(僅適用于窗口型看門狗)或產生系統復位。

獨立看門狗(IWDG)由專用的低速時鐘(LSI)驅動,即使主時鐘發生故障它也仍然有效。窗口看門狗由從APB1時鐘分頻后得到的時鐘驅動,通過可配置的時間窗口來檢測應用程序非正常的過遲或過早的操作。

IWDG最適合應用于那些需要看門狗作為一個在主程序之外,能夠完全獨立工作,并且對時間精度要求較低的場合。 WWDG最適合那些要求看門狗在精確計時窗口起作用的應用程序。

IWDG主要性能

● 自由運行的遞減計數器

● 時鐘由獨立的RC振蕩器提供(可在停止和待機模式下工作)

● 看門狗被激活后,則在計數器計數至0x000時產生復位

    IWDG框圖??

    ?

    1.?核心模塊組成

    • 寄存器模塊
      • 預分頻寄存器(IWDG_PR):配置 8 位預分頻器參數,對輸入時鐘(LSI)進行分頻,調整計數器計數頻率。
      • 重裝載寄存器(IWDG_RLR):存儲 12 位重裝載數值,用于初始化 12 位遞減計數器的計數初值。
      • 鍵寄存器(IWDG_KR):寫入特定命令(如啟動看門狗、喂狗操作),控制看門狗功能的開啟與重置。
      • 狀態寄存器(IWDG_SR):記錄看門狗狀態標志(如計數器溢出標志),供軟件查詢。
    • 時鐘與計數模塊
      • LSI 時鐘輸入:采用 40 kHz 的低速內部時鐘(LSI)作為獨立看門狗的時鐘源,確保在主時鐘故障時仍能工作。
      • 8 位預分頻器:對 LSI 時鐘分頻,輸出給 12 位遞減計數器,擴展計數周期。
      • 12 位遞減計數器:根據預分頻后的時鐘遞減計數,當計數到 0 時觸發 IWDG 復位。

    2.?工作流程

    1. 初始化配置:通過 IWDG_PR 設置預分頻系數,通過 IWDG_RLR 設置重裝載值,通過 IWDG_KR 寫入命令啟動看門狗。
    2. 計數與喂狗:計數器在預分頻時鐘驅動下遞減,若系統正常運行,需定期通過 IWDG_KR 執行 “喂狗”(寫入特定值),重新裝載計數器初值,避免計數到 0。
    3. 復位觸發:若未及時喂狗,計數器遞減至 0 時,觸發 IWDG 復位信號,強制系統重啟。

    3.?供電特性

    圖中紅色標注強調:獨立看門狗功能位于 VDD 供電區,即使系統進入停機或待機模式,仍能正常工作,確保在低功耗模式下也能監控系統狀態,提升可靠性。

    ?IWDG鍵寄存器

    • ?鍵寄存器本質上是控制寄存器,用于控制硬件電路的工作
    • ?在可能存在干擾的情況下,一般通過在整個鍵寄存器寫入特定值來代替控制寄存器寫入一位的功能,以降低硬件電路受到干擾的概率

    寫入鍵寄存器的值

    作用

    0xCCCC

    啟用獨立看門狗

    0xAAAA

    IWDG_RLR中的值重新加載到計數器(喂狗)

    0x5555

    解除IWDG_PRIWDG_RLR的寫保護

    0x5555之外的其他值

    啟用IWDG_PRIWDG_RLR的寫保護

    鍵寄存器(IWDG_KR)是獨立看門狗(IWDG)的核心控制寄存器,通過寫入特定指令碼實現以下功能:

    1. 啟動看門狗:向?IWDG_KR?寫入?0xCCCC,激活獨立看門狗,使能內部 12 位遞減計數器開始工作。
    2. 喂狗操作(重裝載計數器):系統正常運行時,需定期寫入?0xAAAA,觸發計數器重新裝載重裝載寄存器(IWDG_RLR)?中的初始值,避免計數器遞減至 0 引發復位。
    3. 寄存器寫使能:寫入?0x5555?可臨時使能對?預分頻寄存器(IWDG_PR)?和?重裝載寄存器(IWDG_RLR)?的寫權限,允許修改預分頻系數或重裝載值,完成配置后寫權限自動關閉,保障寄存器配置的安全性。

    IWDG_KR 通過特定指令碼實現對看門狗的啟動、喂狗及寄存器配置控制,是軟件與硬件看門狗交互的關鍵接口。

    ?IWDG超時時間

    寫程序的時候超時時間要設置多少,要根據自己的項目來設置 ,如果沒有特別要求,卡死后過個一兩秒再復位也不影響的話,那這個超時時間可以設置大一點

    • 超時時間:TIWDG = TLSI × PR預分頻系數 × (RL + 1)
    • 其中:TLSI = 1 / FLSI?

    ?

    WWDG簡介

    窗口看門狗通常被用來監測,由外部干擾或不可預見的邏輯條件造成的應用程序背離正常的運行序列而產生的軟件故障。除非遞減計數器的值在T6位變成0前被刷新,看門狗電路在達到預置的時間周期時,會產生一個MCU復位。在遞減計數器達到窗口寄存器數值之前,如果7位的遞減計數器數值(在控制寄存器中)被刷新, 那么也將產生一個MCU復位。這表明遞減計數器需要在一個有限的時間窗口中被刷新。

    WWDG功能描述

    如果看門狗被啟動(WWDG_CR寄存器中的WDGA位被置’1’), 并且當7位(T[6:0])遞減計數器從0x40翻轉到0x3F(T6位清零)時,則產生一個復位。如果軟件在計數器值大于窗口寄存器中的數值時重新裝載計數器,將產生一個復位。

    ?WWDG工作特性

    1. ?遞減計數器T[6:0]的值小于0x40時,WWDG產生復位
    2. 遞減計數器T[6:0]在窗口W[6:0]外被重新裝載時,WWDG產生復位
    3. 遞減計數器T[6:0]等于0x40時可以產生早期喚醒中斷(EWI),用于重裝載計數器以避免WWDG復位
    4. 定期寫入WWDG_CR寄存器(喂狗)以避免WWDG復位

    該窗口看門狗時序圖展示了計數器遞減過程、刷新窗口限制及復位觸發邏輯,具體解讀如下:

    1.?計數器遞減過程

    • T [6:0] 遞減計數器:從初始值開始持續遞減,橫坐標為時間,縱坐標為計數器值。
    • 關鍵閾值
      • W [6:0](窗口值):預設的上限閾值,定義 “不允許刷新” 與 “刷新窗口” 的分界。
      • 0x3Fh:計數器的下限閾值(T6 位變為 0),若此時未完成喂狗,觸發復位。

    2.?刷新窗口限制

    • 不允許刷新區間:計數器值?> W[6:0]?時,若執行 “喂狗”(刷新計數器),會觸發復位。這是因為此時刷新屬于 “窗口外操作”,違背時序要求。
    • 刷新窗口區間:計數器值處于?W[6:0] ~ 0x3Fh?時,允許通過寫寄存器更新計數器(合法喂狗),避免計數器遞減至 0x3Fh 觸發復位。

    3.?T6 位與復位觸發

    • T6 位變化:當計數器遞減至 0x3Fh 時,T6 位從 1 變為 0。
    • 復位邏輯:若計數器到達 0x3Fh 仍未喂狗,硬件觸發復位信號,強制系統重啟,確保程序異常時恢復運行

    ?WWDG超時時間

    要根據自己的項目要求來設置,確定想要設置的超時時間(最晚時間)和窗口時間(最晚時間)

    超時時間: ?? ?

    • TWWDG = TPCLK1 × 4096 × WDGTB預分頻系數 × (T[5:0] + 1)

    窗口時間: ?? ?

    • TWIN = TPCLK1 × 4096 × WDGTB預分頻系數 × (T[5:0] - W[5:0])
    • 其中:TPCLK1 = 1 / FPCLK1 =1/36MHz

    ?計算方法和IDWG看門狗一樣

    ?IWDG和WWDG對比

    IWDG獨立看門狗

    WWDG窗口看門狗

    復位

    計數器減到0

    計數器T[5:0]減到0后、過早重裝計數器

    中斷

    早期喚醒中斷

    時鐘源

    LSI40KHz

    PCLK136MHz

    預分頻系數

    483264128256

    1248

    計數器

    12

    6位(有效計數)

    超時時間

    0.1ms~26214.4ms

    113us~58.25ms

    喂狗方式

    寫入鍵寄存器,重裝固定值RLR

    直接寫入計數器,寫多少重裝多少

    防誤操作

    鍵寄存器和寫保護

    用途

    獨立工作,對時間精度要求較低

    要求看門狗在精確計時窗口起作用

    ?獨立看門狗程序

    初始化IWDG?

    ?①開啟LSI時鐘(但是不需我們手動開啟)

    ?

    ②寫入鍵值0x5555解除寫保護,然后再寫入預分頻值和重裝載值

    ③寫入鍵寄存器0xCCCC啟動獨立看門狗

    ④然后再主循環執行喂狗操作?

    int main(void)
    {OLED_Init();						//OLED初始化Key_Init();							//按鍵初始化OLED_ShowString(1, 1, "IWDG TEST");/*判斷復位信號來源*/if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) == SET)	//如果是獨立看門狗復位{OLED_ShowString(2, 1, "IWDGRST");			//OLED閃爍IWDGRST字符串Delay_ms(500);OLED_ShowString(2, 1, "       ");Delay_ms(100);RCC_ClearFlag();							//清除標志位}else											//否則,即為其他復位{OLED_ShowString(3, 1, "RST");				//OLED閃爍RST字符串Delay_ms(500);OLED_ShowString(3, 1, "   ");Delay_ms(100);}/*IWDG初始化*/IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);	//獨立看門狗寫使能IWDG_SetPrescaler(IWDG_Prescaler_16);			//設置預分頻為16IWDG_SetReload(2499);							//設置重裝值為2499,獨立看門狗的超時時間為1000msIWDG_ReloadCounter();							//重裝計數器,喂狗IWDG_Enable();									//獨立看門狗使能while (1){Key_GetNum();								//調用阻塞式的按鍵掃描函數,模擬主循環卡死IWDG_ReloadCounter();						//重裝計數器,喂狗OLED_ShowString(4, 1, "FEED");				//OLED閃爍FEED字符串Delay_ms(200);								//喂狗間隔為200+600=800msOLED_ShowString(4, 1, "    ");Delay_ms(600);}
    }

    獨立看門狗超時時間計算上面草稿有寫,如果不懂就跳轉視頻看看:超時時間計算

    相關函數:?

    ?void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess)//啟用或禁用對IWDG_PR和IWDG_RLR寄存器的寫訪問

    參數說明
    IWDG_WriteAccessIWDG_PR和IWDG_RLR寄存器寫訪問的新狀態

    ?void IWDG_SetPrescaler(uint8_t IWDG_Prescaler)//設置IWDG預分頻值

    參數說明
    IWDG_Prescaler指定IWDG預分頻器值

    void IWDG_SetReload(uint16_t Reload)//設置IWDG 重裝值?

    參數說明
    Reload指定IWDG的重裝值,該參數必須為0 ~ 0x0FFF之間的數字

    ?void IWDG_ReloadCounter(void)//用重新加載寄存器中定義的值重新加載IWDG計數器

    void IWDG_Enable(void)//啟用IWDG(開啟對IWDG_PR和IWDG_RLR寄存器的寫保護)

    FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG)//檢查是否設置了指定的RCC標志?

    參數說明
    RCC_FLAG指定要檢查的標志

    ?窗口看門狗

    WWDG初始化?

    ①開啟窗口看門狗ABP1的時鐘

    ②配置各個寄存器(設置預分頻和設置窗口值)

    ③寫入控制寄存器CR(包含看門狗使能位,計數器標志溢出位,計數器有效位)

    ④最后,再運行過程中向計數器寫入想要的計數重裝值

    int main(void)
    {OLED_Init();						//OLED初始化Key_Init();							//按鍵初始化OLED_ShowString(1, 1, "WWDG TEST");/*判斷復位信號來源*/if (RCC_GetFlagStatus(RCC_FLAG_WWDGRST) == SET)	//如果是窗口看門狗復位{OLED_ShowString(2, 1, "WWDGRST");			//OLED閃爍WWDGRST字符串Delay_ms(500);OLED_ShowString(2, 1, "       ");Delay_ms(100);RCC_ClearFlag();							//清除標志位}else											//否則,即為其他復位{OLED_ShowString(3, 1, "RST");				//OLED閃爍RST字符串Delay_ms(500);OLED_ShowString(3, 1, "   ");Delay_ms(100);}/*開啟時鐘*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);	//開啟WWDG的時鐘/*WWDG初始化*/WWDG_SetPrescaler(WWDG_Prescaler_8);			//設置預分頻為8WWDG_SetWindowValue(0x40 | 21);					//設置窗口值,窗口時間為30msWWDG_Enable(0x40 | 54);							//使能并第一次喂狗,超時時間為50mswhile (1){Key_GetNum();								//調用阻塞式的按鍵掃描函數,模擬主循環卡死OLED_ShowString(4, 1, "FEED");				//OLED閃爍FEED字符串Delay_ms(20);								//喂狗間隔為20+20=40msOLED_ShowString(4, 1, "    ");Delay_ms(20);WWDG_SetCounter(0x40 | 54);					//重裝計數器,喂狗}
    }
    

    ?超時時間和窗口時間計算和獨立看門狗一樣:計算步驟

    ?相關函數:

    ?void WWDG_SetPrescaler(uint32_t WWDG_Prescaler)//設置WWDG預分頻器

    參數說明
    WWDG_Prescaler指定WWDG預分頻器

    void WWDG_SetWindowValue(uint8_t WindowValue)//設置WWDG窗口值?

    參數說明
    WindowValue指定要與下計數器進行比較的窗口值,該參數必須小于0x80

    ?void WWDG_SetCounter(uint8_t Counter)//設置WWDG計數器值

    參數說明
    Counter看門狗計數器的值,該參數必須為0x40 ~ 0x7F之間的數字

    ?void WWDG_Enable(uint8_t Counter)//啟用WWDG窗口看門狗并加載計數器值

    參數說明
    Counter看門狗計數器的值,該參數必須為0x40 ~ 0x7F之間的數字

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

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

    相關文章

    Java 數據庫連接池

    HikariCP 老外開源的。 Spring Boot 2 之后默認選擇的連接池。 號稱性能最快的數據庫連接池。 為什么性能好呢? ● 字節碼級別的優化-盡量的利用 JIT 的內聯手段 ● 字節碼級別的優化-利用更容易被 JVM 優化的指令 ● 代碼級別的優化-利用改造后的 FastList 代替…

    Spring Boot中@Valid 與 @Validated 注解的詳解

    Spring Boot中Valid 與 Validated 注解的詳解 引言Valid注解功能介紹使用場景代碼樣例 Validated注解功能介紹使用場景代碼樣例 Valid與Validated的區別結論 引言 在Spring Boot應用中,參數校驗是確保數據完整性和一致性的重要手段。Valid和Validated注解是Spring …

    C++搜索

    功能擴展說明: 圖類封裝:將圖數據結構封裝為類,提高代碼復用性 最短路徑查找:基于BFS實現未加權圖的最短路徑查找 路徑重構:通過parent數組回溯構建完整路徑 異常處理:當路徑不存在時返回空向量 復雜度分析…

    2023第十四屆藍橋杯大賽軟件賽國賽C/C++ 大學 B 組(真題題解)(C++/Java題解)

    本來想刷省賽題呢,結果一不小心刷成國賽了 真是個小迷糊〒▽〒 但,又如何( ?? ω ?? )? 記錄刷題的過程、感悟、題解。 希望能幫到,那些與我一同前行的,來自遠方的朋友😉 大綱: 一、子2023-&#xff…

    CSS學習筆記6——網頁布局

    目錄 一、元素的浮動屬性、清除浮動 清除浮動的其他方法 1、使用空標簽清除浮動影響 2、使用overflow屬性清除浮動 3、使用偽元素清除浮動影響 原理 overflow屬性 二、元素的定位 1、相對定位 2、絕對定位 ?編輯 3、固定定位 z-index層疊等級屬性 一、元素的浮動…

    sqlalchemy:將mysql切換到OpenGauss

    說明 之前python的項目使用的mysql,近期要切換到國產數據庫OpenGauss。 之前的方案是fastapisqlalchemy,測試下來發現不用改代碼,只要改下配置即可。 切換方案 安裝openGauss-connector-python-psycopg2 其代碼工程在:https:…

    uniapp 獲取dom信息(封裝獲取元素信息工具函數)

    在uniapp開發中,需要獲取到dom的信息,需要用到uniapp的指定方式 uni.createSelectorQuery(),但是每次需要用到的時候都需要很長一段的繁瑣代碼,本篇文章將呈現獲取dom信息方法封裝,話不多說,上菜&#xff1…

    Linux之數據鏈路層

    Linux之數據鏈路層 一.以太網1.1以太網幀格式1.2MAC地址1.3MTU 二.ARP協議2.1ARP協議工作流程2.2ARP協議格式 三.NAT技術四.代理服務4.1正向代理4.2反向代理 五.四大層的學習總結 一.以太網 在我們學習完了網絡層后我們接下來就要進入數據鏈路層的學習了,在學習完網…

    MySQL的基礎語法2(函數-字符串函數、數值函數、日期函數和流程函數 )

    目錄 一、字符串函數 1.常見字符串函數 ?編輯 2.字符串函數的基本使用 3.字符串函數的數據庫案例演示 二、數值函數 1.常見數值函數(如下): 2.數值函數的基本使用 3.數值函數的數據庫案例演示 三、日期函數 1.常見的日期函數 2.日…

    全新版租賃商城小程序源碼系統 源碼開源支持二開+圖文搭建教程

    在互聯網商業的浪潮中,租賃業務憑借其獨特的優勢,正逐漸成為市場的新寵。對于開發者而言,快速搭建一個功能完備的租賃商城小程序,不僅能滿足市場需求,還能為自己的業務拓展帶來新的機遇。分享一款全新版租賃商城小程序…

    Cent OS7+Docker+Dify

    由于我之前安裝了Dify v1.0.0,出現了一些問題:無法刪除,包括:知識庫中的文件、應用、智能體、工作流,都無法刪除。現在把服務器初始化,一步步重新安裝,從0到有。 目錄 1、服務器重裝系統和配置…

    OSI 七層模型和四層模型(TCP/IP 模型)

    文章目錄 前言一、OSI 七層模型二、TCP/IP 四層模型三、運行協議及設備1. OSI 七層模型2. TCP/IP 四層模型3. 運行協議4. 各類設備的作用 總結 前言 OSI 七層模型和四層模型(TCP/IP 模型)是兩種常見的網絡協議分層架構,它們的主要區別如下&a…

    AI的未來:機遇、挑戰與發展方向

    📝個人主頁🌹:一ge科研小菜雞-CSDN博客 🌹🌹期待您的關注 🌹🌹 1. 引言 人工智能(AI)已經成為當今世界最具革命性的技術之一,它正在深刻改變各個行業&#x…

    javascript實現一個函數,將字符串中的指定子串全部替換為另一個字符串的原理,以及多種方法實現。

    大白話javascript實現一個函數,將字符串中的指定子串全部替換為另一個字符串的原理,以及多種方法實現。 在JavaScript里,要是你想把字符串里的指定子串都替換成另外一個字符串,有不少方法可以實現。下面我會詳細介紹實現的原理&a…

    硬件基礎--16_公式梳理

    公式梳理 歐姆定律: IU/R 1.歐姆定律有局限性,僅適用于純電阻電路(或者說純電阻元器件,純電阻設備) 2.純電阻電路:消耗的電能僅轉化為熱能,沒有其他形式的能量轉換。 功率計算:PUI 1.導出公式:PU2 /R 2.導出公式:PI2 R 焦耳定律:QI2 Rt 1.導…

    npm i 出現的網絡問題

    npm i 出現的網絡問題 解決方案: npm config list 查看.npmrc文件中是否配置了proxy刪除.npmrc文件中的proxy,保存。重新執行npm i命令。 順便說說解決這個問題的心里路程 每次安裝vue的環境的時候,經常遇到npm安裝一些插件或者是依賴的時…

    使用vue cli 5.0 在vscode中運行vue命令報錯

    1、運行 vue -- version 報錯 2、在cmd 命令行 執行 vue --version 正常 3、在終端中輸入 get-ExecutionPolicy,查看當前權限 4、執行 set-executionpolicy remotesigned 命令設置為可用模式,但是報錯 5、使用管理員打開power shell 執行 G…

    瑞芯微 RKrga接口 wrapbuffer_virtualaddr 使用筆記

    一、源碼 官方在librga中給了很多 demo 以供參考&#xff0c;例如 imresize 操作&#xff1a; /** Copyright (C) 2022 Rockchip Electronics Co., Ltd.* Authors:* YuQiaowei <cerf.yurock-chips.com>** Licensed under the Apache License, Version 2.0 (the &qu…

    Spring MVC:從歷史演變到實戰入門

    1. Java Web的發展歷史與MVC模式 1.1 Model I與Model II的演進 Model I&#xff08;JSPJavaBean&#xff09; 作為早期Java Web開發的主流模式&#xff0c;其核心架構如下&#xff1a; graph LR A[客戶端] --> B[JSP頁面] B --> C{業務邏輯} C --> D[JavaBean] D -…

    AI賦能,防御無界:群聯云防護如何顛覆傳統DDoS防御格局?

    一、AI驅動的動態防御體系 智能流量調度 群聯云防護通過AI算法實時分析流量特征&#xff0c;動態分配清洗節點。當檢測到攻擊時&#xff0c;系統能在秒級內將流量切換至備用節點&#xff0c;避免單點過載。相較傳統高防IP依賴靜態規則&#xff0c;群聯的調度策略可減少50%的誤封…