在 STM32 的 独立看门狗(IWDG) 中(结合上文【STM32】独立看门狗(提供完整实例代码)),为了控制看门狗的超时时间(溢出时间),我们主要设置两个参数:
名称 | 控制寄存器 | 控制函数 | 作用 |
---|---|---|---|
预分频因子 Prescaler |
IWDG_PR | IWDG_SetPrescaler() |
决定看门狗时钟变慢多少倍 |
重装载值 Reload Value |
IWDG_RLR | IWDG_SetReload() |
看门狗倒计时起始值,越大超时越久 |
IWDG 超时时间计算公式
c
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
)
c
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
之前必须执行:
- 修改
c
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
- 最大 RL = 0x0FFF(4095)
- 修改时需等待状态寄存器清除
c
while(IWDG_GetFlagStatus(IWDG_FLAG_PVU) != RESET);
while(IWDG_GetFlagStatus(IWDG_FLAG_RVU) != RESET);
简化时序
c
LSI 40kHz --[预分频PR]--> 低速时钟 --[倒计时从RL开始]--> 到0触发复位
预分频因子决定"计数器走得多慢",重装载值决定"从多少开始倒计时",两者共同决定看门狗的超时时间。
以上,欢迎有从事同行业的电子信息工程、互联网通信、嵌入式开发的朋友共同探讨与提问,我可以提供实战演示或模板库。希望内容能够对你产生帮助!