一、WWDG 简介
WWDG 的全称是Window Watchdog,即窗口看门狗。
从本质上看,WWDG 是一个能够产生系统复位信号和提前唤醒中断的递减计数器。它和普通“超时才复位”的看门狗不同,WWDG 对喂狗时间有更严格的要求:不能太晚,也不能太早,必须在规定的窗口期内喂狗。
1. WWDG 的核心特性
WWDG 具有以下特点:
| 特性 | 说明 |
|---|---|
| 递减计数 | 计数器从设定值开始向下递减 |
| 下限复位 | 当计数器从0x40减到0x3F时复位 |
| 上限复位 | 当计数器值大于窗口值W[6:0]时喂狗会复位 |
| 窗口喂狗 | 必须在窗口期内刷新计数器 |
| 提前唤醒中断 | 当计数器等于0x40时可产生 EWI 中断 |
其中,计数器从0x40减到0x3F时复位,也可以理解为计数器的T6位从 1 跳变到 0 时触发复位。
2. 什么是窗口期
WWDG 的喂狗不是任何时候都可以执行,而是必须落在窗口期内。
根据资料内容,窗口期满足:
W[6:0] >= 窗口期 > 0x3F更直观地理解:
计数器值 > 窗口值 W -> 喂狗太早,系统复位 0x40 <= 计数器值 <= W -> 窗口期内,可以喂狗 计数器值 < 0x40 -> 喂狗太晚,系统已经复位因此,WWDG 不仅可以检测程序是否“卡死”,还可以检测程序运行节奏是否异常。
3. WWDG 的作用
WWDG 主要用于监测单片机程序运行时效是否精准,重点检测软件异常。
典型异常包括:
程序运行过慢,导致没有及时喂狗。
程序运行过快,导致过早喂狗。
程序流程错乱,喂狗位置被异常提前或延后执行。
任务调度异常,导致关键任务周期不稳定。
WWDG 适用于需要精准检测程序运行时间的场合。相比只要求“别超时”的独立看门狗,窗口看门狗更强调“必须在正确时间范围内运行”。
二、WWDG 工作原理
WWDG 的工作过程可以概括为:
配置 WWDG 计数器初值、窗口值和预分频系数。
启动 WWDG 后,计数器开始递减。
当计数器值大于窗口值时,不能喂狗,否则复位。
当计数器值进入窗口期后,程序应及时喂狗。
如果计数器从
0x40递减到0x3F,系统复位。如果使能提前唤醒中断,当计数器等于
0x40时可以进入 EWI 中断。
可以用下面的逻辑表示:
计数器从初值开始递减 | | 计数器值 > W | 过早喂狗会复位 v 进入窗口期:W >= 计数器值 > 0x3F | | 在窗口期内喂狗 | 计数器重新装载 v 如果没有及时喂狗 | v 计数器从 0x40 减到 0x3F,系统复位WWDG 的核心不是“定时喂狗”这么简单,而是要根据窗口上限和超时下限设计合理的喂狗时机。
三、WWDG 框图理解
WWDG 的基本结构可以简化理解为:
PCLK1 -> 4096 分频 -> WWDG 预分频器 -> 递减计数器 -> 复位/提前唤醒中断 ^ | 窗口比较逻辑关键模块说明:
| 模块 | 作用 |
|---|---|
| PCLK1 | WWDG 的时钟来源 |
| 4096 分频 | WWDG 内部固定分频 |
| 预分频器 | 继续对 WWDG 时钟进行分频 |
| 递减计数器 | 保存并递减当前计数值 |
| 窗口比较逻辑 | 判断喂狗是否过早 |
| EWI 中断 | 计数器到达0x40时可触发提前唤醒中断 |
WWDG 的计数器范围与普通递减计数器不同,需要特别关注0x40和0x3F这两个边界。
四、WWDG 寄存器
WWDG 常见寄存器包括控制寄存器、配置寄存器和状态寄存器。
1. 控制寄存器 WWDG_CR
WWDG_CR用于使能窗口看门狗,并设置重装载计数器值,也就是完成喂狗。
常见关注点:
| 位/字段 | 作用 |
|---|---|
| WDGA | 使能 WWDG |
| T[6:0] | 计数器值,喂狗时会重新写入该值 |
使用 WWDG 时,T[6]必须保持为 1。因为当计数器从0x40减到0x3F时,T6位变为 0,系统会产生复位。
2. 配置寄存器 WWDG_CFR
WWDG_CFR用于配置窗口看门狗的工作参数。
| 字段 | 作用 |
|---|---|
| EWI | 使能提前唤醒中断 |
| WDGTB | 设置预分频系数 |
| W[6:0] | 设置窗口上限值 |
窗口值W[6:0]决定了“最早允许喂狗”的位置。如果计数器值仍然大于窗口值就喂狗,系统会立即复位。
3. 状态寄存器 WWDG_SR
WWDG_SR用于判断是否发生了 WWDG 提前唤醒中断。
当使能 EWI 后,计数器递减到0x40时可以触发提前唤醒中断。用户可以在中断回调函数中执行必要的异常处理、状态记录或最后一次补救操作。
五、WWDG 超时时间计算
WWDG 的超时时间由 PCLK1、固定 4096 分频、预分频系数以及计数器初值共同决定。
1. WWDG 计数时钟
WWDG 的计数时钟可理解为:
WWDG计数时钟 = PCLK1 / (4096 * 预分频系数)其中预分频系数由WDGTB配置。常见关系为:
| WDGTB | 预分频系数 |
|---|---|
| 0 | 1 |
| 1 | 2 |
| 2 | 4 |
| 3 | 8 |
2. 超时时间公式
WWDG 从计数器初值递减到0x3F时产生复位,因此可按下面公式估算超时时间:
Tout = (T[5:0] + 1) * 4096 * 预分频系数 / PCLK1其中:
Tout:WWDG 超时时间,单位为秒。T[5:0]:计数器低 6 位。PCLK1:APB1 外设时钟频率。4096:WWDG 内部固定分频系数。预分频系数:由WDGTB设置。
如果计数器初值为0x7F,则低 6 位为0x3F,也就是 63,计数步数为63 + 1 = 64。
3. 计算示例
以 STM32F1 为例,假设:
PCLK1 = 36 MHz 计数器初值 T = 0x7F 预分频系数 = 8则:
Tout = (63 + 1) * 4096 * 8 / 36000000 = 64 * 4096 * 8 / 36000000 ≈ 0.05825 s ≈ 58.25 ms也就是说,如果没有在窗口期内及时喂狗,系统大约会在 58 ms 后复位。
4. 最短与最长超时时间
以 STM32F1、PCLK1 = 36 MHz估算:
| 条件 | 估算方式 | 时间 |
|---|---|---|
| 最短超时 | 1 * 4096 * 1 / 36 MHz | 约 0.114 ms |
| 最长超时 | 64 * 4096 * 8 / 36 MHz | 约 58.25 ms |
实际项目中,PCLK1 频率和芯片系列可能不同,计算时应以工程实际时钟树配置为准。
5. 窗口期时间理解
除了总超时时间,WWDG 还需要关注窗口开启时间。
如果窗口值为W,计数器初值为T,则从T递减到W之前都属于“过早喂狗区域”;当计数器值小于等于W且大于0x3F时,才进入允许喂狗的窗口期。
简化理解:
最早喂狗时间 = 从 T 递减到 W 所需时间 最晚喂狗时间 = 从 T 递减到 0x40 所需时间工程上要保证程序正常执行到喂狗位置时,计数器正好处于窗口期内。
六、WWDG 配置步骤
使用 HAL 库配置 WWDG 时,可以按以下流程理解。
1. 设置分频系数和窗口值
调用:
HAL_WWDG_Init();该函数用于初始化 WWDG,常见配置包括:
计数器初值
窗口值
预分频系数
是否启用提前唤醒中断
典型结构示意:
WWDG_HandleTypeDef hwwdg; hwwdg.Instance = WWDG; hwwdg.Init.Prescaler = WWDG_PRESCALER_8; hwwdg.Init.Window = 0x5F; hwwdg.Init.Counter = 0x7F; hwwdg.Init.EWIMode = WWDG_EWI_ENABLE; HAL_WWDG_Init(&hwwdg);2. 完成 WWDG MSP 初始化
调用或重写:
HAL_WWDG_MspInit();该函数通常用于配置 WWDG 相关底层资源,例如:
WWDG 外设时钟
NVIC 中断配置
3. 设置中断优先级并使能中断
如果使用提前唤醒中断,需要配置 NVIC:
HAL_NVIC_SetPriority(); HAL_NVIC_EnableIRQ();如果没有正确配置 NVIC,即使 WWDG 产生 EWI 中断,CPU 也不会进入对应中断服务函数。
4. 编写中断服务函数
中断服务函数一般写成:
void WWDG_IRQHandler(void) { HAL_WWDG_IRQHandler(&hwwdg); }HAL_WWDG_IRQHandler()会处理 HAL 内部中断逻辑,并进一步调用用户回调函数。
5. 重定义提前唤醒中断回调函数
常用回调函数:
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg) { /* 用户处理逻辑 */ }该回调函数可用于在即将复位前执行必要处理,例如记录异常状态、保存关键数据或进行最后一次系统检查。
6. 在窗口期内喂狗
调用:
HAL_WWDG_Refresh();该函数用于刷新 WWDG 计数器,也就是喂狗。
需要注意:WWDG 必须在窗口期内喂狗。过早喂狗和过晚喂狗都会导致复位。
附:WWDG 使用注意事项
1. 喂狗不能只看“是否超时”
IWDG 更关注是否超时,而 WWDG 同时关注是否太早和是否太晚。因此,WWDG 的喂狗位置必须与程序运行周期严格匹配。
2. 窗口值不要设置得过窄
窗口值设置过窄会导致正常程序也很难稳定落入窗口期,容易出现误复位。实际项目中应结合任务周期、最大执行时间、中断延迟等因素留出裕量。
3. 提前唤醒中断适合做最后处理
EWI 中断发生时,计数器已经到达0x40,距离复位非常近。因此 EWI 中断中不适合执行复杂耗时操作,更适合做短小的异常记录或状态处理。
4. 时钟配置会影响超时时间
WWDG 使用 PCLK1 作为时钟来源,因此只要 APB1 时钟配置变化,WWDG 的超时时间也会变化。移植工程或修改时钟树后,需要重新核对 WWDG 时间参数。