极海APM32F427看门狗机制详解与应用

2026-05-15 19:10:07/ By Admin

  1.看门狗概述

         6f508dda-cebd-4fd1-a389-ce742d6c8418.png

  极海APM32F427微控制器配备了两个看门狗定时器,分别为独立看门狗(IWDG)和窗口看门狗(WWDG),两者在时钟源和触发机制上各有特点。

  独立看门狗(IWDG)

  时钟源:使用内部低速时钟(LSI),频率范围在20kHz至35kHz之间(理论值28kHz)。虽然精度不如HSE,但受外部电路影响小,稳定性高。

  工作原理:属于递减计数器。只有当计数器减至0时才会触发系统复位。在计数器减至0之前刷新计数器(喂狗),不会导致复位。

  应用场景:主要用于系统的异常检测机制。当系统可能死机时,提供复位信号以重启运行。由于其主要检测系统死锁,时钟精度不高反而使其对电路异常不敏感,比HSE更适合此场景。

  窗口看门狗(WWDG)

         eeabc509-6824-42cb-b5a1-3c29f7a4da7a.png

  时钟源:由PCLK1提供,通常源于HSE经过PLL倍频。时钟精准,但容易受电路异常的影响。

  工作原理:同样为递减计数器。当计数器减至0x3F时发生复位。特殊限制:如果在配置的窗口值之前刷新计数器,也会触发复位。

  应用场景:相比独立看门狗,窗口看门狗的应用场景相对较少,主要用于需要严格监控任务执行时间的场合。

  2.硬件平台

  开发板:APM32F427ZG TINY板

  3.驱动程序详解

  独立看门狗(IWDG)配置

  LSI的实际频率会随温度和电压波动,因此以下计算仅为估算值。

         687a05b4-ef1d-4b57-b725-2a24fd62ba95.png

  驱动函数说明:

  初始化函数(bsp_iwdt_init)

  函数会根据设定的超时时间自动配置预分频值和重载值。

  调试建议:建议在初始化时配置调试期间停止计数器,以便在长时间调试后程序能继续执行,而非立即复位。

  喂狗策略:建议喂狗频率为单次超时时间的5倍左右,以补偿LSI的误差和代码框架的冗余。

  喂狗函数(bsp_iwdt_feed)

  仅需调用IWDT_Refresh()刷新计数器即可。

  窗口看门狗(WWDG)配置

  WWDG的初始化相对简单,但窗口值需结合PCLK1主频计算。

  初始化函数(bsp_wwdt_init)

  配置调试模式下的计数器行为。

  启用时钟并配置时基、窗口值(示例中为0x7F)及中断。

  喂狗机制

  必须在窗口值范围内(即WWDT_CFG的WIN值与0x40之间)喂狗。

  注意:若在此范围之外喂狗,将直接触发复位。

  4.测试验证

  测试方案

  配置:设置IWDG超时时间为100ms,且不执行喂狗操作。

  监测:通过GPIO引脚的高电平持续时间确认实际复位时长。

void gpio_test(void) {
    // GPIOF Pin0 配置为输出,初始化拉高
}

void app_init(void) {
    bsp_iwdt_init(100, 1); // 初始化 IWDG,超时 100ms,调试停止
    gpio_test();
}

void app_task(void) {
    // 故意不喂狗
}

  测试代码

  测试结果

  实际测量显示,系统在93.7ms时触发了IWDG超时复位。

  原因分析:由于LSI时钟源本身存在不精准特性,且受环境温度和电压影响,不同芯片测得的误差可能有所不同。

  5.移植说明

  若在其他项目中使用窗口看门狗(WWDG),请务必根据实际的PCLK1主频重新计算配置的窗口值。

icon_up
close_white