目录
[1. IWDG_WriteAccessCmd](#1. IWDG_WriteAccessCmd)
[2. IWDG_SetPrescaler](#2. IWDG_SetPrescaler)
[3. IWDG_SetReload](#3. IWDG_SetReload)
[4. IWDG_ReloadCounter](#4. IWDG_ReloadCounter)
[1. 启动独立看门狗的操作](#1. 启动独立看门狗的操作)
[2. 喂狗操作的原理](#2. 喂狗操作的原理)
一、独立看门狗基本概念
独立看门狗(Independent Watchdog,简称IWDG)是STM32微控制器中的一个重要外设,主要用于:
防止系统死机 :当程序因干扰导致异常时,能自动复位系统
提高系统可靠性 :确保系统在恶劣环境下仍能正常运行
独立运行 :使用专用的低速时钟(LSI),不受主时钟影响
主要特点
独立时钟源 :使用内部低速振荡器(LSI,约32kHz),即使主时钟故障也能工作
不可屏蔽 :一旦启动,除了系统复位外无法关闭
递减计数器 :从预设值开始递减,减到0时触发复位
窗口功能 :部分STM32型号支持窗口看门狗功能,提供更精确的喂狗时机控制
二、工作原理
1. 计数器结构 :
12位递减计数器:计数范围0~4095
预分频器:可设置不同的分频系数,调整看门狗溢出时间
2. 工作流程 :
初始化时设置预分频系数和重装载值
启动看门狗后,计数器开始递减
程序正常运行时,需定期"喂狗"(重置计数器)
若计数器减到0,系统将被复位
3. 溢出时间计算 :
溢出时间 = (预分频系数 × 重装载值) / LSI频率
例如:预分频系数=32,重装载值=1000,LSI=32kHz
溢出时间 = (32 × 1000) / 32000 = 1秒
三、独立看门狗时钟树

四、标准库中使用独立看门狗
- 包含头文件
cpp
#include "stm32f10x.h" // 根据具体型号调整
- 初始化配置
cpp
/**
* @brief 配置独立看门狗
* @param prer: 预分频系数,可选值:
* IWDG_Prescaler_4, IWDG_Prescaler_8, IWDG_Prescaler_16,
* IWDG_Prescaler_32, IWDG_Prescaler_64, IWDG_Prescaler_128,
* IWDG_Prescaler_256
* @param reload: 重装载值,范围:0-4095
* @retval 无
*/
void IWDG_Config(uint8_t prer, uint16_t reload)
{
// 使能对IWDG_PR和IWDG_RLR的写操作
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
// 设置预分频系数
IWDG_SetPrescaler(prer);
// 设置重装载值
IWDG_SetReload(reload);
// 重载计数器,喂狗
IWDG_ReloadCounter();
// 启动看门狗
IWDG_Enable();
}
- 喂狗函数
cpp
/**
* @brief 喂狗函数
* @param 无
* @retval 无
*/
void IWDG_Feed(void)
{
// 重载计数器,喂狗
IWDG_ReloadCounter();
}
- 完整使用示例
cpp
#include "stm32f10x.h"
#include "delay.h" // 假设存在延时函数
/**
* @brief 初始化独立看门狗
* @param 无
* @retval 无
*/
void IWDG_Init(void)
{
// 使能对IWDG_PR和IWDG_RLR的写操作
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
// 设置预分频系数为64
IWDG_SetPrescaler(IWDG_Prescaler_64);
// 设置重装载值为625,溢出时间约为1秒
// 计算:(64 * 625) / 32000 = 1.25秒
IWDG_SetReload(625);
// 重载计数器,喂狗
IWDG_ReloadCounter();
// 启动看门狗
IWDG_Enable();
}
int main(void)
{
// 系统初始化代码...
// 初始化独立看门狗
IWDG_Init();
while(1)
{
// 正常程序代码...
// 定期喂狗,必须在看门狗溢出前调用
IWDG_Feed();
// 延时一段时间,模拟程序运行
delay_ms(500);
}
}
五、关键函数解析
1. IWDG_WriteAccessCmd
cpp
void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);
功能: 使能或禁止对IWDG_PR和IWDG_RLR寄存器的写操作
参数:IWDG_WriteAccess_Enable :使能写操作
IWDG_WriteAccess_Disable :禁止写操作
**说明:**必须先调用此函数使能写操作,才能修改预分频系数和重装载值
2. IWDG_SetPrescaler
cpp
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);
功能:设置独立看门狗的预分频系数
参数:预分频系数,可选值如前所述
说明:预分频系数决定了计数器递减的速度
3. IWDG_SetReload
cpp
void IWDG_SetReload(uint16_t Reload);
功能:设置独立看门狗的重装载值
参数:重装载值,范围0-4095
说明:计数器将从该值开始递减
4. IWDG_ReloadCounter
cpp
void IWDG_Enable(void);
功能:启动独立看门狗
参数:无
说明:一旦启动,除了系统复位外无法关闭
六、关于STM32独立看门狗键寄存器操作

核心含义解释
1. 启动独立看门狗的操作
写入0xCCCC到键寄存器(IWDG_KR) :这是启动独立看门狗的指令
计数器开始递减 :启动后,计数器会从初始值0xFFF(即4095,因为是12位计数器)开始向下计数
触发复位的条件 :当计数器减到0x000时,会产生复位信号(IWDG_RESET),导致系统复位
2. 喂狗操作的原理
写入0xAAAA到键寄存器(IWDG_KR) :这是"喂狗"的指令
重载计数器 :执行此操作后,重装载寄存器(IWDG_RLR)中的值会被重新加载到计数器中
避免复位 :通过定期执行喂狗操作,计数器会被重置为预设值,不会减到0,从而避免看门狗复位
与标准库函数的对应关系
标准库中封装了这些底层寄存器操作,使开发者无需直接操作寄存器:

IWDG_Enable() :函数内部会向IWDG_KR寄存器写入0xCCCC
IWDG_ReloadCounter() :函数内部会向IWDG_KR寄存器写入0xAAA
3.为什么需要键寄存器?
键寄存器(IWDG_KR)的设计是一种 安全机制 ,用于:
防止误操作 :避免程序意外修改看门狗配置
明确操作意图 :通过特定的键值(0xCCCC和0xAAAA)区分启动和喂狗操作
简化操作流程 :将启动和喂狗操作集中到一个寄存器,降低复杂度
以之前的标准库示例代码为例,底层操作与函数的对应关系如下:
cpp
// 标准库代码
void IWDG_Init(void)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); // 允许修改PR和RLR寄存器
IWDG_SetPrescaler(IWDG_Prescaler_64); // 设置预分频为64
IWDG_SetReload(625); // 设置重装载值为625
IWDG_ReloadCounter(); // 首次喂狗(写入0xAAAA)
IWDG_Enable(); // 启动看门狗(写入0xCCCC)
}
void IWDG_Feed(void)
{
IWDG_ReloadCounter(); // 喂狗(写入0xAAAA)
}
底层执行流程 :
允许写PR/RLR寄存器 → 配置预分频和重装载值
写入0xAAAA → 首次重载计数器(确保启动后计数器从设置值开始)
写入0xCCCC → 启动看门狗,计数器开始递减
周期性写入0xAAAA → 定期喂狗,避免复位