WDG 16bit 定时器实现 4s 喂狗超时复位 Demo
-
1. 问题背景
- 软件:MD24 SDK_1_4_1 Wdg_Demo
- 硬件:MD24 EVB
- 背景描述:
- 有客户反馈 MD24 WDG 的定时器只有 16bit,无法设置较长的 WDG 复位时间,因此可以使用 WDG IRQ 实现较长时间的 WDG 超时复位。
2. 实现原理
2.1 硬件配置
- WDG时钟源:FXOSC (24MHz)
- WDG时钟分频:16
- WDG超时值:60000
- 中断周期:(24MHz / 16) / 60000 = 25Hz → 40ms
2.2 软件实现
- WDG初始化:配置 WDG为 40ms 中断一次
- 中断处理:在 WDG 中断中计数,每 40ms 计数一次
- 喂狗逻辑:计数小于 100 时继续喂狗(40ms × 100 = 4s)
- 超时处理:计数达到 100 时停止喂狗,等待 WDG 复位
2.3 关键代码
- WDG 配置
const wdg_user_config_t wdg_config0 = { .clockSource=WDG_IPC_CLOCK, .opMode={ .deepsleep=false, .debug=false, }, .updateEnable=true, .intEnable=true, .winEnable=false, .windowValue=30000, .timeoutValue=60000, .apbErrorResetEnable=0, };- 中断处理函数
/** * @brief WDG中断处理函数 * @details 每40ms触发一次,计数到100次时(4s)停止喂狗,导致WDG复位 */ void WDG_TSTIRQHandler(void) { /* 清除中断标志 */ WDG0->INTF = WDG_INTF_IF_MASK; /* 翻转 IO,指示中断触发 */ PINS_DRV_TogglePins(GPIOD,1<<8); /* 增加4s计数器 */ Wdg_flag_4s++; /* 当计数小于100时喂狗(40ms * 100 = 4s) */ if(100 > Wdg_flag_4s ) { WDG_DRV_Trigger(0); } else { /* 计数达到100,停止喂狗,等待WDG复位 */ } }3. 使用方法
- 编译代码:使用 IDE 编译整个工程
- 下载程序:将编译好的程序下载到 MD24 开发板
- 观察现象:
-
IO 每 40ms 反转一次

-
反转100 次后(约 4s),IO 停止反转,随后系统会因 WDG 超时而复位,复位后,程序会重新开始执行

4. 注意事项
- 时钟配置:确保 WDG 时钟源和分频设置正确,以获得准确的中断周期
- 计数设置:根据需要的超时时间调整计数阈值(当前为100,对应4s)
- 中断优先级:确保 WDG 中断优先级设置合理,避免被其他中断长时间占用
- 喂狗时机:在实际应用中,应在适当的时机喂狗,确保系统正常运行
5. 扩展应用
此方法可以扩展到更长时间的 WDG 超时复位:
- 10s 超时:计数阈值设置为 250(40ms × 250 = 10s)
- 30s 超时:计数阈值设置为 750(40ms × 750 = 30s)
- 1min 超时:计数阈值设置为 1500(40ms × 1500 = 60s)
快速上手云途开发生态
发帖前请查看
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...