STM32 独立看门狗(IWDG)程序设计与实现

一、核心原理与硬件基础

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保障系统可靠性的核心模块,通过独立时钟+软件喂狗机制,在系统异常时强制复位。使用时需注意超时时间配置和定期喂狗,避免因误配置导致系统频繁复位或失效。

相关推荐
木下~learning2 小时前
嵌入式Linux 小项目:RK3399 基于 MPlayer 实现视频播放器(从环境搭建到完整播放列表)
linux·运维·嵌入式硬件·音视频
学习噢学个屁2 小时前
基于51单片机心率仪—体温心率血氧蓝牙
c语言·单片机·嵌入式硬件·51单片机
济6172 小时前
FreeRTOS 通信任务设计(2)----UART+DMA 环形缓冲 + 空闲中断+ 流缓冲区--- 高效接收方案详解
stm32·单片机·嵌入式·freertos
QH139292318802 小时前
是德科技KEYSIGHT N5183B 9 kHz~40 GHz微波模拟信号发生器
网络·数据库·科技·嵌入式硬件·集成测试
W.W.H.2 小时前
嵌入式常见面试题——硬件与中断篇
经验分享·单片机·嵌入式硬件
灰子学技术2 小时前
Envoy 中 UDP 网络通信实现分析
网络·单片机·嵌入式硬件·网络协议·udp
济6173 小时前
FreeRTOS 通信任务设计(1)---STM32 串口 DMA + 协议帧解析 + CRC 校验全流程详解
stm32·嵌入式·freertos
三佛科技-187366133973 小时前
便携式一字美甲灯方案开发
单片机·嵌入式硬件
飞睿科技3 小时前
从 Mesh 到无线视频,ESP32-E22 的场景落地指南,飞睿科技乐鑫代理商
单片机·嵌入式硬件