一、核心原理与硬件基础
1. 独立看门狗(IWDG)简介
独立看门狗(Independent Watchdog, IWDG)是STM32内置的硬件复位模块,用于监测系统运行状态,当程序因干扰、死循环等异常导致"跑飞"时,通过复位系统恢复正常运行。其核心特性:
- 独立时钟源:由内部低速时钟(LSI,约40kHz,具体以数据手册为准)驱动,不受主时钟(HSE/HSI)失效影响。
- 可配置超时时间:通过预分频器和重装载值设置复位时间(典型范围1ms~26.2s)。
- 软件喂狗机制:需定期向IWDG写入"钥匙"(0xAAAA)刷新计数器,否则计数器归零时触发复位。
2. 关键寄存器与参数
| 寄存器 | 功能 | 关键位/参数 |
|---|---|---|
| IWDG_KR | 键值寄存器(写入控制命令) | 0x5555(允许访问PR/RLR)、0xAAAA(喂狗)、0xCCCC(启动IWDG) |
| IWDG_PR | 预分频寄存器(设置分频系数) | PR[2:0]:0~7(分频系数4/8/16/32/64/128/256) |
| IWDG_RLR | 重装载寄存器(设置计数器初值) | RLR[11:0]:0~4095(12位计数器) |
| IWDG_SR | 状态寄存器(反映IWDG状态) | PVU(PR更新中)、RVU(RLR更新中) |
3. 超时时间计算
IWDG超时时间由预分频系数(PR) 和重装载值(RLR) 决定,公式:
Tout=4×2PR×RLRLSI频率T_{\text{out}} = \frac{4 \times 2^{\text{PR}} \times \text{RLR}}{\text{LSI频率}}Tout=LSI频率4×2PR×RLR
- LSI频率:典型值40kHz(STM32F103),部分型号可能为32kHz或37kHz(需查数据手册)。
- 示例 :PR=4(分频系数64),RLR=3125,则 Tout=4×64×312540000=20 sT_{\text{out}} = \frac{4 \times 64 \times 3125}{40000} = 20\ \text{s}Tout=400004×64×3125=20 s。
二、硬件设计方案
1. 核心硬件需求
- STM32主控:任意带IWDG功能的型号(如F103C8T6、F407ZGT6)。
- LSI时钟:内部低速时钟(默认使能,无需外部电路)。
- 复位电路:STM32内置复位电路(10kΩ上拉电阻+0.1μF电容,见最小系统)。
2. 电路连接要点
- 无需外部元件:IWDG为纯硬件模块,仅需确保LSI时钟正常(部分型号需通过选项字节使能LSI)。
- 调试接口:通过SWD(PA13/PA14)下载程序,观察复位状态(可结合LED指示复位事件)。
三、软件设计与核心代码(标准库版)
1. 核心函数组成
| 函数 | 功能 | 依赖库文件 |
|---|---|---|
IWDG_Init |
初始化IWDG(设置PR、RLR,启动IWDG) | stm32f10x_iwdg.c |
IWDG_Feed |
喂狗(向IWDG_KR写入0xAAAA) | stm32f10x_iwdg.c |
2. 完整代码实现
2.1 头文件与宏定义(iwdg.h)
c
#ifndef __IWDG_H
#define __IWDG_H
#include "stm32f10x.h"
// IWDG参数定义(基于STM32F103,LSI=40kHz)
#define IWDG_LSI_FREQ 40000 // LSI频率(Hz)
#define IWDG_PR_DIV 4 // 预分频系数:4→分频64(2^4=16?注意:PR=0→4分频,PR=1→8分频,...,PR=6→256分频)
#define IWDG_RLR_VAL 3125 // 重装载值(12位,0~4095)
#define IWDG_TIMEOUT ((4 * (1 << (IWDG_PR_DIV + 2)) * IWDG_RLR_VAL) / IWDG_LSI_FREQ) // 超时时间(秒)
// 函数声明
void IWDG_Init(void); // 初始化IWDG
void IWDG_Feed(void); // 喂狗
#endif /* __IWDG_H */
2.2 源文件实现(iwdg.c)
c
#include "iwdg.h"
#include "stm32f10x_iwdg.h"
/**
* @brief 初始化独立看门狗
* @param 无
* @retval 无
* @note 超时时间 = (4 * 2^PR * RLR) / LSI频率,PR=4(分频64),RLR=3125时,超时=20s
*/
void IWDG_Init(void) {
// 1. 允许访问IWDG_PR和IWDG_RLR寄存器(写入0x5555)
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
// 2. 设置预分频系数(PR)
IWDG_SetPrescaler(IWDG_Prescaler_64); // PR=4(分频64,对应IWDG_Prescaler_64)
// 3. 设置重装载值(RLR),12位寄存器(0~4095)
IWDG_SetReload(IWDG_RLR_VAL); // RLR=3125
// 4. 重载计数器(写入0xAAAA,避免立即复位)
IWDG_ReloadCounter();
// 5. 启动IWDG(写入0xCCCC)
IWDG_Enable();
}
/**
* @brief 喂狗(刷新计数器)
* @param 无
* @retval 无
*/
void IWDG_Feed(void) {
IWDG_ReloadCounter(); // 向IWDG_KR写入0xAAAA
}
2.3 主程序调用示例(main.c)
c
#include "stm32f10x.h"
#include "iwdg.h"
#include "led.h" // 假设已实现LED驱动(用于指示复位状态)
int main(void) {
// 初始化系统时钟(72MHz)
SystemInit();
// 初始化LED(PA0,用于指示复位事件)
LED_Init();
LED_On(); // 初始亮灯
// 初始化独立看门狗(超时20s)
IWDG_Init();
// 打印超时时间(需串口支持,可选)
printf("IWDG Timeout: %d s\r\n", IWDG_TIMEOUT);
uint32_t count = 0;
while (1) {
// 模拟业务逻辑(每5s喂狗一次,确保不超时)
LED_Toggle(); // 闪烁LED
IWDG_Feed(); // 喂狗(必须定期执行!)
printf("Feed dog, count: %lu\r\n", ++count);
// 延时5s(实际项目中替换为业务代码)
for (volatile uint32_t i = 0; i < 5000000; i++);
}
}
参考代码 STM32 独立看门狗程序 www.youwenfan.com/contentcst/133740.html
四、关键注意事项
1. 喂狗时机
- 必须定期喂狗 :在程序正常运行时,需在超时时间内 调用
IWDG_Feed(),否则触发复位。 - 避免在中断中喂狗 :若主程序死循环,中断仍可能喂狗,导致看门狗失效。建议在主循环中喂狗。
2. 超时时间选择
- 不宜过短:过短会导致正常业务中未及喂狗而误复位(如复杂计算耗时超过超时时间)。
- 不宜过长:过长会延长系统异常后的恢复时间(如死循环后需等待更久才复位)。
- 经验值:根据业务最大耗时设置(如主循环周期1s,超时时间设为2~3s)。
3. LSI时钟稳定性
- LSI精度:内部低速时钟(LSI)精度较低(±5%~±10%),极端温度下可能偏差更大,需预留余量。
- 使能LSI :部分STM32型号(如L0系列)需通过
RCC_LSICmd(ENABLE)手动使能LSI。
4. 与窗口看门狗(WWDG)的区别
| 特性 | 独立看门狗(IWDG) | 窗口看门狗(WWDG) |
|---|---|---|
| 时钟源 | 内部低速时钟(LSI,独立) | APB1时钟(PCLK1,依赖主时钟) |
| 复位条件 | 计数器归零(超时) | 计数器未在"窗口"内喂狗(过早或过晚) |
| 灵活性 | 仅能设置超时时间 | 可设置窗口上下限(更严格) |
| 适用场景 | 主时钟可能失效的场景(如低功耗) | 需精确控制喂狗时机的场景(如通信协议) |
五、扩展应用
1. 复位事件记录
通过读取RCC_CSR寄存器的IWDGRSTF位,判断是否由IWDG触发复位:
c
if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET) {
// IWDG复位事件
LED_Blink(3); // 闪烁3次指示IWDG复位
RCC_ClearFlag(); // 清除复位标志
}
2. 低功耗模式适配
- STOP模式:IWDG在STOP模式下仍由LSI驱动,需确保喂狗操作在唤醒后执行。
- SLEEP模式:IWDG正常工作,需定期喂狗(如通过定时器中断唤醒喂狗)。
3. 调试技巧
- 临时关闭IWDG :调试时,可通过注释
IWDG_Enable()关闭看门狗,避免频繁复位。 - 测量超时时间:用示波器观察IWDG复位引脚(NRST)的电平变化,验证实际超时时间。
六、总结
独立看门狗(IWDG)是STM32保障系统可靠性的核心模块,通过独立时钟+软件喂狗机制,在系统异常时强制复位。使用时需注意超时时间配置和定期喂狗,避免因误配置导致系统频繁复位或失效。