STM32独立看门狗(IWDG)知识点及标准库使用指南

目录

一、独立看门狗基本概念

二、工作原理

三、独立看门狗时钟树

四、标准库中使用独立看门狗

五、关键函数解析

[1. IWDG_WriteAccessCmd](#1. IWDG_WriteAccessCmd)

[2. IWDG_SetPrescaler](#2. IWDG_SetPrescaler)

[3. IWDG_SetReload](#3. IWDG_SetReload)

[4. IWDG_ReloadCounter](#4. IWDG_ReloadCounter)

六、关于STM32独立看门狗键寄存器操作

[1. 启动独立看门狗的操作](#1. 启动独立看门狗的操作)

[2. 喂狗操作的原理](#2. 喂狗操作的原理)

3.为什么需要键寄存器?


一、独立看门狗基本概念

独立看门狗(Independent Watchdog,简称IWDG)是STM32微控制器中的一个重要外设,主要用于:

防止系统死机 :当程序因干扰导致异常时,能自动复位系统

提高系统可靠性 :确保系统在恶劣环境下仍能正常运行

独立运行 :使用专用的低速时钟(LSI),不受主时钟影响

主要特点

  1. 独立时钟源 :使用内部低速振荡器(LSI,约32kHz),即使主时钟故障也能工作

  2. 不可屏蔽 :一旦启动,除了系统复位外无法关闭

  3. 递减计数器 :从预设值开始递减,减到0时触发复位

  4. 窗口功能 :部分STM32型号支持窗口看门狗功能,提供更精确的喂狗时机控制

二、工作原理

1. 计数器结构 :

12位递减计数器:计数范围0~4095

预分频器:可设置不同的分频系数,调整看门狗溢出时间

2. 工作流程 :

初始化时设置预分频系数和重装载值

启动看门狗后,计数器开始递减

程序正常运行时,需定期"喂狗"(重置计数器)

若计数器减到0,系统将被复位

3. 溢出时间计算 :

溢出时间 = (预分频系数 × 重装载值) / LSI频率

例如:预分频系数=32,重装载值=1000,LSI=32kHz
溢出时间 = (32 × 1000) / 32000 = 1秒

三、独立看门狗时钟树

四、标准库中使用独立看门狗

  1. 包含头文件
cpp 复制代码
#include "stm32f10x.h"  // 根据具体型号调整
  1. 初始化配置
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();
}
  1. 喂狗函数
cpp 复制代码
/**
 * @brief  喂狗函数
 * @param  无
 * @retval 无
 */
void IWDG_Feed(void)
{
    // 重载计数器,喂狗
    IWDG_ReloadCounter();
}
  1. 完整使用示例
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)
}

底层执行流程 :

  1. 允许写PR/RLR寄存器 → 配置预分频和重装载值

  2. 写入0xAAAA → 首次重载计数器(确保启动后计数器从设置值开始)

  3. 写入0xCCCC → 启动看门狗,计数器开始递减

  4. 周期性写入0xAAAA → 定期喂狗,避免复位

相关推荐
来自晴朗的明天5 小时前
15、隔离 DC-DC 电源电路(18S12 模块)
单片机·嵌入式硬件·硬件工程
我送炭你添花5 小时前
电子世界的奇妙冒险:从一个电阻开始(系列目录)
人工智能·单片机·嵌入式硬件·fpga开发
VekiSon5 小时前
Linux内核驱动——设备树原理与应用
linux·c语言·arm开发·嵌入式硬件
国科安芯5 小时前
火箭传感器控制单元的抗辐照MCU选型与环境适应性验证
单片机·嵌入式硬件·架构·risc-v·安全性测试
-Springer-6 小时前
STM32 学习 —— 个人学习笔记5(EXTI 外部中断 & 对射式红外传感器及旋转编码器计数)
笔记·stm32·学习
LS_learner6 小时前
树莓派(ARM64 架构)Ubuntu 24.04 (Noble) 系统 `apt update` 报错解决方案
嵌入式硬件
来自晴朗的明天7 小时前
16、电压跟随器(缓冲器)电路
单片机·嵌入式硬件·硬件工程
钰珠AIOT7 小时前
在同一块电路板上同时存在 0805 0603 不同的封装有什么利弊?
嵌入式硬件