文章目录
一、看门狗概述
看门狗(Watchdog)是嵌入式系统中用于监测系统运行状态的重要机制,其主要作用是在系统出现异常(如程序跑飞、死循环等)时自动复位系统,使系统恢复到正常工作状态。
STM32提供了两种看门狗:
1.独立看门狗(IWDG, Independent WatchDog)
2.窗口看门狗(WWDG, Window WatchDog)
二、独立看门狗(IWDG)
1.特点
- 完全独立于主系统运行,使用独立的RC振荡器(约40kHz)
- 即使主时钟失效也能工作
- 计数器为12位递减计数器(0x000-0xFFF)
- 支持硬件或软件启动
- 复位前有短暂延时,确保复位信号有效
2.工作原理
IWDG需要定期"喂狗"(重载计数器),如果在计数器减到0之前没有喂狗,系统将产生复位。
3.STM32CubeMX独立看门狗(IWDG)配置
1)新建工程
1.双击打开桌面下载好的STM32CubeMX,点击File–>New Project,或直接点击ACCEE TO MCU SELECTOR

2.在左边搜索栏里输入使用的芯片型号,右边选中并开始创建

2)设置RCC时钟源
设置高/低速时钟源都由外部晶振产生。

3)配置IWDG

提示:
超时时间 = (RLR+1) × (2^PR) / LSI频率
假设:LSI=40kHz, PR=4(分频64), RLR=1874
超时时间 = (1874 + 1) × 64 / 40000
= 1875 × 64 / 40000
= 3.0 秒
4)时钟配置
1.时钟源设置
默认时钟源是由内部RC振荡器产生,可通过图中按钮进行修改,外部晶振数值取决于实际电路板上的晶振大小.

提示:
- 这里用到的芯片的最大时钟频率是100MHz,有的芯片最大只有72MHz,实际最大频率可通过查看芯片数据手册确定。
2.时钟频率设置

①PLLM—PLL输入时钟分频系数,根据自己需要的系统时钟频率来进行修改
②PLLN—主PLL倍频系数(自动计算)
③PLLP—主PLL分频系数(自动计算)
④SYSCLK—系统时钟
⑤HCLK—AHB总线时钟,由系统时钟SYSCLK 分频得到,一般不分频,等于系统时钟
⑥APB1/APB2 Prescaler—APB1/APB2总线的预分频系数,可根据需要修改
5)工程管理
1.工程设置
注:工程路径中不能有中文,否则会输出错误。
库文件要提前下载好,具体方法在 “【STM32CubeMX学习教程】——1.软件安装” 这一篇文章中有提到。

2.代码生成设置

3.点击右上角按钮生成代码,之后会出现下面的窗口,再点击打开工程即可在用keil查看工程代码。

4. 代码示例(HAL库)
// 初始化IWDG,超时时间约1s
void MX_IWDG_Init(void)
{
hiwdg.Instance = IWDG;
hiwdg.Init.Prescaler = IWDG_PRESCALER_64; // 分频64
hiwdg.Init.Reload = 625; // 重载值
HAL_IWDG_Init(&hiwdg);
}
// 喂狗
void IWDG_Feed(void)
{
HAL_IWDG_Refresh(&hiwdg);
}
三、窗口看门狗(WWDG)
1. 特点
- 时钟来自APB1总线时钟(PCLK1)
- 计数器为7位递减计数器(0x7F-0x40)
- 有"窗口"限制:只能在特定时间范围内喂狗
- 早期唤醒中断(EWI):在即将复位前产生中断
2.工作原理
WWDG要求在一个"窗口"时间内喂狗:
- 过早喂狗(计数器值 > 窗口值):产生复位
- 过晚喂狗(计数器值 < 0x40):产生复位
- 正确喂狗(计数器值 ≤ 窗口值且 ≥ 0x40):计数器重载
3.STM32CubeMX窗口看门狗(WWDG)配置
1)新建工程
1.双击打开桌面下载好的STM32CubeMX,点击File–>New Project,或直接点击ACCEE TO MCU SELECTOR

2.在左边搜索栏里输入使用的芯片型号,右边选中并开始创建

2)设置RCC时钟源
设置高/低速时钟源都由外部晶振产生。

3)配置WWDG
1.配置参数

提示:
假设:PCLK1 = 48MHz
预分频 = 8(WWDG_PRESCALER_8)
计数器初始值 = 0x7F(127)
上窗口值 = 0x70(112)
下窗口值 = 0x3F(固定值)
计算关键时间点:
总超时时间:(0x7F-0x3F)×8/48MHz=10.67μs
窗口起始时间:(0x7F-0x70)×8/48MHz=1.5μs
有效窗口时间:(0x70-0x3F)×8/48MHz=9.17μs
窗口关闭到复位时间:(0x3F-0x3F)×8/48MHz=0μs
时序特性图示:
计数器值: 0x7F ──────┬────── 0x70 ──────── 0x3F
│ │ │
│ 1.5μs │ 9.17μs │
▼ ▼ ▼
禁止喂狗 允许喂狗 系统复位
2.使能中断

4)时钟配置
1.时钟源设置
默认时钟源是由内部RC振荡器产生,可通过图中按钮进行修改,外部晶振数值取决于实际电路板上的晶振大小.

提示:
- 这里用到的芯片的最大时钟频率是100MHz,有的芯片最大只有72MHz,实际最大频率可通过查看芯片数据手册确定。
2.时钟频率设置

①PLLM—PLL输入时钟分频系数,根据自己需要的系统时钟频率来进行修改
②PLLN—主PLL倍频系数(自动计算)
③PLLP—主PLL分频系数(自动计算)
④SYSCLK—系统时钟
⑤HCLK—AHB总线时钟,由系统时钟SYSCLK 分频得到,一般不分频,等于系统时钟
⑥APB1/APB2 Prescaler—APB1/APB2总线的预分频系数,可根据需要修改
5)工程管理
1.工程设置
注:工程路径中不能有中文,否则会输出错误。
库文件要提前下载好,具体方法在 “【STM32CubeMX学习教程】——1.软件安装” 这一篇文章中有提到。

2.代码生成设置

3.点击右上角按钮生成代码,之后会出现下面的窗口,再点击打开工程即可在用keil查看工程代码。

4. 代码示例(HAL库)
// 初始化WWDG
void MX_WWDG_Init(void)
{
hwwdg.Instance = WWDG;
hwwdg.Init.Prescaler = WWDG_PRESCALER_8; // 预分频8
hwwdg.Init.Window = 0x70; // 窗口值
hwwdg.Init.Counter = 0x7F; // 计数器初始值
hwwdg.Init.EWIMode = WWDG_EWI_ENABLE; // 使能EWI中断
HAL_WWDG_Init(&hwwdg);
}
// 喂狗
void WWDG_Feed(void)
{
HAL_WWDG_Refresh(&hwwdg);
}
// EWI中断处理
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
// 即将复位前的最后处理机会
}
四、两种看门狗对比
| 特性 | IWDG | WWDG |
|---|---|---|
| 时钟源 | 独立RC振荡器(~40kHz) | PCLK1 |
| 复位条件 | 计数器减到0 | 过早或过晚喂狗 |
| 精度 | 较低(受RC振荡器影响) | 较高(使用系统时钟) |
| 中断 | 无 | 有(EWI早期唤醒中断) |
| 配置灵活性 | 简单 | 复杂(需设置窗口) |
| 适用场景 | 对时间要求不高的简单监测 | 需要精确监测的复杂系统 |
五、使用建议
1.IWDG适用场景:
- 需要简单可靠的看门狗功能
- 主时钟可能失效的情况
- 对时间精度要求不高的应用
2.WWDG适用场景:
- 需要精确监测代码执行时间
- 需要在复位前进行一些清理操作(通过EWI中断)
- 防止代码执行过快或过慢的情况
3.使用注意事项:
- 喂狗操作应放在主循环的关键路径上
- 避免在中断中频繁喂狗
- 对于关键任务,可以在多个位置喂狗
- 调试时可暂时禁用看门狗
4.调试技巧:
- 使用调试器暂停时,IWDG会继续运行可能导致意外复位
- 可以通过DBGMCU寄存器配置调试时冻结看门狗
#include "stm32fxxx_hal.h" // 根据芯片型号替换 xxx
int main(void) {
// 调试模式下冻结看门狗
__HAL_DBGMCU_FREEZE_IWDG();
__HAL_DBGMCU_FREEZE_WWDG();
// 其他初始化代码...
while (1) {
// 主循环
}
}
以上就是本章的全部内容,如果对你有帮助,欢迎点赞支持,谢谢!
5万+

被折叠的 条评论
为什么被折叠?



