在 STM32 的 獨立看門狗(IWDG) 中(結合上文【STM32】獨立看門狗(提供完整實例代碼)),為了控制看門狗的超時時間(溢出時間),我們主要設置兩個參數:
名稱 | 控制寄存器 | 控制函數 | 作用 |
---|---|---|---|
預分頻因子 Prescaler | IWDG_PR | IWDG_SetPrescaler() | 決定看門狗時鐘變慢多少倍 |
重裝載值 Reload Value | IWDG_RLR | IWDG_SetReload() | 看門狗倒計時起始值,越大超時越久 |
IWDG 超時時間計算公式
Tout = ((4×2^prer) ×rlr) /40 (M3)
其中:
PR
:預分頻因子寄存器的值(0~7)
RL
:重裝載寄存器中的值(0~0x0FFF)
40
:LSI 時鐘頻率為 40kHz
預分頻因子(Prescaler)
📘 設置位置:
寄存器:IWDG_PR
的位 [2:0]
函數:IWDG_SetPrescaler(IWDG_Prescaler_xxx);
PR值 | 分頻因子 | 實際頻率(Hz) |
---|---|---|
0 | /4 | 10,000 Hz |
1 | /8 | 5,000 Hz |
2 | /16 | 2,500 Hz |
3 | /32 | 1,250 Hz |
4 | /64 | 625 Hz |
5 | /128 | 312.5 Hz |
6/7 | /256 | 156.25 Hz |
分頻因子越大 → 看門狗時鐘越慢 → 超時時間越長
重裝載值(Reload)
📘 設置位置:
寄存器:IWDG_RLR
的位 [11:0]
函數:IWDG_SetReload(uint16_t value);
RL值 | 含義 |
---|---|
0x0000 | 最小計數(最短時間) |
0x0FFF | 最大計數(最長時間) |
實質上是“看門狗計數器初始值”,倒計時到 0 就觸發復位。
舉個完整例子
設置:
- 預分頻因子 = /256(
PR = 6
) - 重裝載值 = 4095(
0x0FFF
)
Tout = ((4 × 2^6) × 4095) / 40= (256 × 4095 × 4) / 40= 419430 / 40= 10485.75 ms ≈ 10.5 秒即,如果程序 10.5 秒內不喂狗,系統將自動復位。
調節思路:
想要超時長一點 增大 PR 或 RL
想要超時短一點 減小 PR 或 RL
注意事項
- 寫保護機制
- 修改
PR
和RL
之前必須執行:
- 修改
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
- 最大 RL = 0x0FFF(4095)
- 修改時需等待狀態寄存器清除
while(IWDG_GetFlagStatus(IWDG_FLAG_PVU) != RESET);
while(IWDG_GetFlagStatus(IWDG_FLAG_RVU) != RESET);
簡化時序
LSI 40kHz --[預分頻PR]--> 低速時鐘 --[倒計時從RL開始]--> 到0觸發復位
預分頻因子決定“計數器走得多慢”,重裝載值決定“從多少開始倒計時”,兩者共同決定看門狗的超時時間。
以上,歡迎有從事同行業的電子信息工程、互聯網通信、嵌入式開發的朋友共同探討與提問,我可以提供實戰演示或模板庫。希望內容能夠對你產生幫助!