fix(DLD154V4B): 修复 WDT_DIV 分频枚举传值 bug — 实际分频 4 导致 410ms 超时不断复位

现场实测 LIMIT=100 (500ms 喂狗) 不断复位重启, 改 50 正常。
根因: wdt_divider_set() 参数是枚举值 (WDT_CLK_DIV_16=0x02),
宏误传 16 (0b10000) -> 3bit 寄存器截断为 0 = WDT_CLK_DIV_4
-> 实际分频 4, 超时 4x4096/40k = 410ms < 500ms 喂狗周期。
修复: WDT_DIV=2 (枚举值) + (wdt_division_type) 显式转换。
隔离测试 mock 升级为 3bit 截断+反推分频, 复现 bug 并断言修复。
vd960Loop 原实现用 WDT_CLK_DIV_64 枚举写法, 无此问题。
This commit is contained in:
wangfq
2026-08-28 09:08:42 +08:00
parent 8f43f8f1c9
commit 794e097587
4 changed files with 15 additions and 5 deletions
+2 -2
View File
@@ -687,7 +687,7 @@ DLD154V4B/
// 看门狗参数 (IWDT, V2.10 新增)
#define WDT_COUNTER_LIMIT 100 // 喂狗周期 500ms (TMR15 5ms × 100)
#define WDT_DIV 16 // LSI 分频
#define WDT_DIV 2 // IWDT 分频枚举值: 2 = WDT_CLK_DIV_16 (实际分频 16, 勿传 16!)
#define WDT_RLD 4095 // 12bit 重装载 → 超时 ≈ 1.64s
```
@@ -697,7 +697,7 @@ AT32F421 独立看门狗(IWDT),双保险喂狗模式(对齐 DLD154Pro V3
| 环节 | 实现 |
|------|------|
| 使能 | `main()``wdt_init()`:分频 16 + 重装载 4095 + 立即喂一次 |
| 使能 | `main()``wdt_init()`:分频 16(枚举 `WDT_CLK_DIV_16`+ 重装载 4095 + 立即喂一次 |
| 超时 | ≈ 1.64sLSI≈40kHz`16×4096/40k` |
| 活性计数 | TMR15 ISR 每 5ms `g_wdg_counter++` |
| 喂狗 | 主循环每轮 `poll_wdg()`:计数达 100500ms)才 `wdt_counter_reload()` |