主题 | 内容 | 教学目的/扩展视频 |
---|---|---|
看门狗 | 什么是看门狗,原理分析,启动喂狗方法,读标志位。 | 熟悉在程序里用看门狗。 |
师从洋桃电子,杜洋老师
📑文章目录
-
- 一、看门狗核心原理
-
- [1.1 工作原理图解](#1.1 工作原理图解)
- [1.2 经典水桶比喻](#1.2 经典水桶比喻)
- 二、STM32看门狗双雄对比
- 三、独立看门狗(IWDG)深度解析
-
- [3.1 关键特性](#3.1 关键特性)
- [3.2 配置示例代码](#3.2 配置示例代码)
- 四、窗口看门狗(WWDG)进阶应用
-
- [4.1 核心特征](#4.1 核心特征)
- [4.2 配置代码示例](#4.2 配置代码示例)
- 五、设计实践指南
-
- [5.1 参数计算工具](#5.1 参数计算工具)
- [5.2 调试技巧](#5.2 调试技巧)
- 六、常见问题解答
- 七、扩展应用
-
- [7.1 复合监控系统](#7.1 复合监控系统)
- [7.2 看门狗高级用法](#7.2 看门狗高级用法)
- 八、相关资源
一、看门狗核心原理
1.1 工作原理图解
正常流程 异常状态 程序启动 看门狗初始化 程序运行中 定时喂狗 未及时喂狗 计数器重置 计数器归零 系统复位
1.2 经典水桶比喻
比喻要素 | 技术对应 |
---|---|
水龙头流速 | 计数器递减频率 |
桶容量 | 初始重载值 |
倒水操作 | 喂狗动作 |
水溢出 | 系统复位 |
二、STM32看门狗双雄对比
2.1 参数对照表
特性 | 独立看门狗(IWDG) | 窗口看门狗(WWDG) |
---|---|---|
时钟源 | 独立40kHz RC振荡器 | 主时钟(PCLK1) |
计数器位宽 | 12位递减计数器 | 7位递减计数器 |
工作模式 | 停机/待机模式可用 | 需主时钟运行 |
喂狗时间 | 任意时间 | 指定时间窗口 |
特殊功能 | 自由定时器模式 | 早期预警中断 |
典型应用场景 | 基础监控/低功耗场景 | 时序严格控制系统 |
2.2 架构框图
独立看门狗架构
归零 40kHz RC振荡器 8位预分频器 12位递减计数器 系统复位 喂狗操作
窗口看门狗架构
下窗口值 上窗口值 窗口期内 主时钟 预分频器 7位递减计数器 复位信号 中断预警 喂狗操作
三、独立看门狗(IWDG)深度解析
3.1 关键特性
- 独立时钟源:不受主系统时钟影响
- 最长超时时间:26.2秒(预分频256,重载值0xFFF)
- 硬件看门狗模式:通过选项字节配置
- 调试模式冻结:方便单步调试
3.2 配置示例代码
c
// IWDG初始化
void IWDG_Init(uint16_t reload, uint8_t prescaler)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
IWDG_SetPrescaler(prescaler);
IWDG_SetReload(reload);
IWDG_ReloadCounter();
IWDG_Enable();
}
// 喂狗操作
void Feed_Dog(void)
{
IWDG_ReloadCounter();
}
四、窗口看门狗(WWDG)进阶应用
4.1 核心特征
- 精确时间窗口:必须在上窗口(0x40)与下窗口(0x3F)之间喂狗
- 早期预警中断:计数器达到0x40时触发中断
- 时钟依赖:需要稳定主时钟源
- 最短超时时间:1.09ms(PCLK1=36MHz)
4.2 配置代码示例
c
// WWDG初始化
void WWDG_Init(uint8_t counter, uint8_t window)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
WWDG_SetPrescaler(WWDG_Prescaler_8);
WWDG_SetWindowValue(window);
WWDG_Enable(counter);
WWDG_ClearFlag();
WWDG_EnableIT();
}
// 中断服务函数
void WWDG_IRQHandler(void)
{
if(WWDG_GetFlagStatus() != RESET) {
// 处理早期预警
WWDG_SetCounter(0x7F);
WWDG_ClearFlag();
}
}
五、设计实践指南
5.1 参数计算工具
看门狗类型 | 计算公式 | 示例计算(超时1s) |
---|---|---|
IWDG | Tout = (4×2^prescaler) × reload / 40k | prescaler=4(256分频), reload=1250 |
WWDG | Tout = (4096×2^WDGTB) × (T[5:0]+1) / PCLK1 | PCLK1=36M, WDGTB=3, T=54 |
5.2 调试技巧
- 利用IWDG冻结功能:在调试模式暂停计数器
- WWDG窗口时间测量:使用逻辑分析仪捕获喂狗信号
- 安全喂狗策略:在多个关键节点重复喂狗
- 异常处理机制:在复位前保存系统状态
六、常见问题解答
Q1:看门狗导致频繁复位怎么办?
- 检查喂狗间隔是否小于超时时间
- 验证时钟源配置是否正确
- 确认未在中断外进行长时间阻塞操作
Q2:如何选择看门狗类型?
- 低功耗场景选IWDG
- 实时性要求高选WWDG
- 关键系统可同时使用双看门狗
Q3:窗口看门狗窗口值如何设置?
- 上窗口值 = 允许最早喂狗时间
- 下窗口值 = 最晚喂狗时间
- 典型设置:窗口值 = 0x5F,计数器初始值 = 0x7F
七、扩展应用
7.1 复合监控系统
主任务 IWDG喂狗 关键子任务 WWDG喂狗 硬件级监控 时序级监控
7.2 看门狗高级用法
- 系统自检模式:故意触发复位测试看门狗功能
- 低功耗唤醒:配合停机模式实现定时唤醒
- 安全认证:通过看门狗记录系统运行状态
附:STM32看门狗相关寄存器速查表
寄存器 | IWDG | WWDG |
---|---|---|
控制寄存器 | IWDG_KR | WWDG_CR |
预分频寄存器 | IWDG_PR | WWDG_CFR |
重载寄存器 | IWDG_RLR | WWDG_CFR |
状态寄存器 | - | WWDG_SR |
八、相关资源
1\] [洋桃电子B站课程-STM32入门100步](http://www.doyoung.net/) \[2\] [STM32官方文档手册](https://pan.baidu.com/s/1dO5v1lRnl_wtaUCM8Exjcg?pwd=mt6d) \[3\] [STM32F103固件函数库用户手册(中文)](https://pan.baidu.com/s/1YOrsuYdEYKuwpmFLE1vPUA?pwd=ix56) \[4\] [看门狗原理.pptx](https://pan.baidu.com/s/1E40ehieEHm0Rs_2WAx6V6g?pwd=iiin) *** ** * ** *** 💬 技术讨论(请在评论区留言\~) *** ** * ** *** > **📌 下期预告** :下一期将探讨看门狗应用程序分析,欢迎持续关注! > > [点击查阅🔍往期【STM32专栏】文章](https://blog.csdn.net/liwangsb2/category_12899382.html) > > **版权声明** :本文采用\[CC BY-NC-SA 4.0\]协议,转载请注明来源 > **实测开发版** :洋桃1号开发版(基于STM32F103C8T6) > **更新日志**: > > * v1.0 初始版本(2025-04-06)