STM32学习-WWDG 一、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 预分频器 - 递减计数器 - 复位/提前唤醒中断 ^ | 窗口比较逻辑关键模块说明模块作用PCLK1WWDG 的时钟来源4096 分频WWDG 内部固定分频预分频器继续对 WWDG 时钟进行分频递减计数器保存并递减当前计数值窗口比较逻辑判断喂狗是否过早EWI 中断计数器到达0x40时可触发提前唤醒中断WWDG 的计数器范围与普通递减计数器不同需要特别关注0x40和0x3F这两个边界。四、WWDG 寄存器WWDG 常见寄存器包括控制寄存器、配置寄存器和状态寄存器。1. 控制寄存器 WWDG_CRWWDG_CR用于使能窗口看门狗并设置重装载计数器值也就是完成喂狗。常见关注点位/字段作用WDGA使能 WWDGT[6:0]计数器值喂狗时会重新写入该值使用 WWDG 时T[6]必须保持为 1。因为当计数器从0x40减到0x3F时T6位变为 0系统会产生复位。2. 配置寄存器 WWDG_CFRWWDG_CFR用于配置窗口看门狗的工作参数。字段作用EWI使能提前唤醒中断WDGTB设置预分频系数W[6:0]设置窗口上限值窗口值W[6:0]决定了“最早允许喂狗”的位置。如果计数器值仍然大于窗口值就喂狗系统会立即复位。3. 状态寄存器 WWDG_SRWWDG_SR用于判断是否发生了 WWDG 提前唤醒中断。当使能 EWI 后计数器递减到0x40时可以触发提前唤醒中断。用户可以在中断回调函数中执行必要的异常处理、状态记录或最后一次补救操作。五、WWDG 超时时间计算WWDG 的超时时间由 PCLK1、固定 4096 分频、预分频系数以及计数器初值共同决定。1. WWDG 计数时钟WWDG 的计数时钟可理解为WWDG计数时钟 PCLK1 / (4096 * 预分频系数)其中预分频系数由WDGTB配置。常见关系为WDGTB预分频系数011224382. 超时时间公式WWDG 从计数器初值递减到0x3F时产生复位因此可按下面公式估算超时时间Tout (T[5:0] 1) * 4096 * 预分频系数 / PCLK1其中ToutWWDG 超时时间单位为秒。T[5:0]计数器低 6 位。PCLK1APB1 外设时钟频率。4096WWDG 内部固定分频系数。预分频系数由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. 设置中断优先级并使能中断如果使用提前唤醒中断需要配置 NVICHAL_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 时间参数。