全部例程

IWDG - 独立看门狗

W55MH32

更新于 2026年8月13日

本篇总结

使用 IWDG,实现独立看门狗的超时复位与喂狗。

🔑 KEIL MDK、UART调试、IWDG

本示例配置 IWDG 超时时间约 10 秒,通过串口接收数据触发喂狗(重载计数器),如果长时间不喂狗则系统自动复位。

前置工具准备

开始本例程前,请确认以下工具已安装:

  • WIZ UartTool V1.0:串口收发测试工具:点击下载

硬件连接

本例程无需外部硬件连接,IWDG 完全在芯片内部运行。USART1 用于串口交互(发送字符喂狗)和输出调试信息。

引脚功能方向模式
PA9USART1_TX开发板 → PC复用推挽输出 (AF_PP)
PA10USART1_RXPC → 开发板浮空输入 (IN_FLOATING)

工程结构

工程位于 SDK 内 1.SDK\ModuleDemo\IWDG\,核心文件如下:

IWDG/
├── USER/
│   ├── main.c            ← IWDG配置 + 串口喂狗 + 超时复位
│   ├── w55mh32_conf.h    ← 外设头文件集中包含
│   ├── w55mh32_it.c/h    ← 中断服务函数
│   ├── system_w55mh32.c/h← 系统初始化(时钟配置)
│   └── startup_w55mh32.s ← 启动文件
└── SYSTEM/
    └── delay/
        └── delay.c/h      ← SysTick 延时函数

步骤1:IWDG 配置与喂狗

文件:USER/main.c — 配置 IWDG 预分频器为 256、重装载值为 1562(超时约 10 秒),主循环中通过串口接收数据触发喂狗。


void IWDG_Configuration(void)
{
    /* IWDG 时钟来自 LSI(约40kHz),无需使能 RCC 时钟 */
    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);

    /* 预分频器:256 → 40000/256 = 156.25 Hz */
    IWDG_SetPrescaler(IWDG_Prescaler_256);

    /* 重装载值:1562 → 超时 ≈ 10秒 */
    IWDG_SetReload(1562);

    /* 重装载值写入后更新计数器 */
    IWDG_ReloadCounter();

    /* 使能 IWDG */
    IWDG_Enable();
}

int main(void)
{
    RCC_ClocksTypeDef clocks;
    delay_init();
    UART_Configuration(115200);
    RCC_GetClocksFreq(&clocks);
    printf("IWDG Test.\n");

    IWDG_Configuration();
    printf("IWDG started, timeout ~10s.\n");
    printf("Press any key to feed the dog.\n");

    while (1)
    {
        /* 检查串口是否有数据输入 */
        if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET)
        {
            uint8_t ch = USART_ReceiveData(USART1);
            IWDG_ReloadCounter();  /* 喂狗 */
            printf("Dog fed! (0x%02X)\n", ch);
        }

        /* 如果长时间不喂狗,IWDG 超时将复位系统 */
        delay_ms(100);
    }
}
  

IWDG 超时时间 = (4 × 2^PR) × RL / 40000。预分频 256(PR=6)时,计数频率 = 40000/256 ≈ 156.25Hz。重装载值 1562 → 超时 ≈ 1562/156.25 ≈ 10 秒。喂狗通过 IWDG_ReloadCounter() 重载计数器。IWDG 一旦使能无法关闭。

如果你想自定义

  • 改超时时间 → 修改 IWDG_PrescalerIWDG_SetReload 参数
  • 自动喂狗 → 在定时器中断或主循环中定期调用 IWDG_ReloadCounter()
  • 检测复位原因 → 检查 RCC_GetFlagStatus(RCC_FLAG_IWDGRST) 判断是否为 IWDG 复位

编译与下载

Keil MDK 中打开 IWDG.uvprojxF7 编译,确认 0 Error(s)。连接 DEBUG USB 口到 PC,F8 下载。

运行验证

打开 WIZ UartTool V1.0,波特率 115200 / 8N1。下载固件并按 RESET 后,串口打印 "IWDG started, timeout ~10s."。在 10 秒内通过串口发送任意字符,串口打印 "Dog fed!" 表示喂狗成功。如果超过 10 秒未喂狗,IWDG 超时复位系统,串口重新打印启动信息。

IWDG看门狗测试串口输出
WIZ UartTool V1.0 显示 IWDG 测试:喂狗成功打印 "Dog fed!",超时后系统复位重启

常见问题

Q: 系统频繁复位

IWDG 超时时间设置过短,检查预分频器和重装载值。确保喂狗间隔小于超时时间。计算公式:超时 = (4 × 2^PR) × RL / 40000。

Q: 喂狗后仍复位

确认 IWDG_ReloadCounter() 被正确调用。检查喂狗逻辑是否在所有代码路径中都能执行到(如中断、延时中是否阻塞了喂狗)。增加喂狗频率。

Q: IWDG 是否可以关闭

IWDG 一旦使能(IWDG_Enable)就无法关闭,直到下一次系统复位。这是看门狗的安全特性,确保程序跑飞后无法意外关闭看门狗。

总结

本文基于 W55MH32L 的独立看门狗(IWDG)实现了系统监控功能:

  • IWDG 独立时钟:LSI 约 40kHz,主时钟故障时仍能正常工作
  • 超时配置:预分频 256,重装载值 1562,超时约 10 秒
  • 通过串口接收数据触发 IWDG_ReloadCounter() 喂狗
  • 超时未喂狗则系统自动复位,IWDG 一旦使能无法关闭,确保系统可靠性

下载本章例程

我们提供完整的工程文件以及配套开发板,方便你随时测试,快速完成产品开发:

开发环境: Keil MDK5 配套开发板

Andy

W5500 技术支持专家