本篇总结
使用 IWDG,实现独立看门狗的超时复位与喂狗。
🔑 KEIL MDK、UART调试、IWDG
本示例配置 IWDG 超时时间约 10 秒,通过串口接收数据触发喂狗(重载计数器),如果长时间不喂狗则系统自动复位。
前置工具准备
开始本例程前,请确认以下工具已安装:
- WIZ UartTool V1.0:串口收发测试工具:点击下载
硬件连接
本例程无需外部硬件连接,IWDG 完全在芯片内部运行。USART1 用于串口交互(发送字符喂狗)和输出调试信息。
| 引脚 | 功能 | 方向 | 模式 |
| PA9 | USART1_TX | 开发板 → PC | 复用推挽输出 (AF_PP) |
| PA10 | USART1_RX | PC → 开发板 | 浮空输入 (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_Prescaler 和 IWDG_SetReload 参数
- 自动喂狗 → 在定时器中断或主循环中定期调用
IWDG_ReloadCounter()
- 检测复位原因 → 检查
RCC_GetFlagStatus(RCC_FLAG_IWDGRST) 判断是否为 IWDG 复位
编译与下载
Keil MDK 中打开 IWDG.uvprojx,F7 编译,确认 0 Error(s)。连接 DEBUG USB 口到 PC,F8 下载。
运行验证
打开 WIZ UartTool V1.0,波特率 115200 / 8N1。下载固件并按 RESET 后,串口打印 "IWDG started, timeout ~10s."。在 10 秒内通过串口发送任意字符,串口打印 "Dog fed!" 表示喂狗成功。如果超过 10 秒未喂狗,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 一旦使能无法关闭,确保系统可靠性