feat(vd960Loop): 看门狗升级双保险喂狗模式 + 超时对齐 V4B(1.64s)

对照 DLD154V4B V2.10(同款 AT32F421):
- 原直喂模式缺 ISR 活性检测: TMR15 ISR 死但主循环活 -> 看门狗永不复位(假活)
- 升级: TMR15 ISR 5ms 递增 g_wdg_counter + 主循环 poll_wdg() 500ms 才 reload
- 超时 3s(div64/rld1875) -> 1.64s(div16枚举/rld4095)
- wdt_feed 定义移至 TaskLoop.c 改名 poll_wdg, 与 V4B 同构
- 修正 main.c 注释矛盾(4687 vs 1875); 沿用 WDT_CLK_DIV_16 枚举写法避免
  V4B 同源传值 bug
- 隔离测试 3 项断言全过(分频16/超时1638ms>500ms/10s喂20次/ISR死不喂)
This commit is contained in:
wangfq
2026-08-28 09:15:54 +08:00
parent 40e6648445
commit d1fb357989
4 changed files with 76 additions and 20 deletions
@@ -24,6 +24,7 @@ Loop154_States g_loop_states = {0};
uint32_t g_sys_freq = 0;
uint8_t g_input_div = 1;
uint32_t g_safe_max_cnt = LC_HOLD_TIME;
volatile uint16_t g_wdg_counter = 0; // 看门狗活性计数 (TMR15 ISR 5ms 递增)
/*===========================================================================
* 一阶 IIR 低通滤波器(对齐 DLD154V4B
@@ -252,6 +253,9 @@ void TMR15_GLOBAL_IRQHandler(void)
if (tmr_interrupt_flag_get(TMR15, TMR_OVF_FLAG) != RESET) {
/*--- 看门狗活性计数 (5ms) ---*/
g_wdg_counter++;
/*--- 50ms tick 分频 ---*/
TM1cnt++;
if (TM1cnt >= 10) {
@@ -657,6 +661,20 @@ void vd1_task_per_channel(Loop154_Unit *unit)
/*===========================================================================
* loop_task_function — FreeRTOS 主任务(对齐 DLD154V4B main 循环)
/*===========================================================================
* 看门狗喂狗 (双保险, 对齐 DLD154V4B V2.10)
* TMR15 ISR 5ms 递增 g_wdg_counter; 计数达 100 (500ms) 才 reload
* ISR 死 -> 计数不涨 -> 永不喂狗; 主循环死 -> 本函数不执行 -> 超时复位
*===========================================================================*/
void poll_wdg(void)
{
if (g_wdg_counter >= WDT_COUNTER_LIMIT) { // 100 x 5ms = 500ms
g_wdg_counter = 0;
wdt_counter_reload();
}
}
/*===========================================================================
* 10ms 周期,独立处理每路线圈。
*===========================================================================*/
void loop_task_function(void *pvParameters)
@@ -705,7 +723,7 @@ void loop_task_function(void *pvParameters)
}
}
wdt_feed();
poll_wdg();
vTaskDelay(10); // 10ms tick, M4 优化: 双路 IIR + 进入确认 + 斜率限幅
}
}
@@ -59,9 +59,8 @@ __IO uint32_t TimingDelayDec;
TaskHandle_t loop_task_handler;
// 看门狗相关
#define WDT_TIMEOUT_MS 3000 // 看门狗超时时间 3秒
#define WDT_TIMEOUT_MS 1600 // 看门狗超时时间: IWDT div16 rld4095, LSI约40kHz -> ~1.64s
void wdt_init(void);
void wdt_feed(void);
tmr_output_config_type tmr_oc_init_structure;
@@ -104,20 +103,19 @@ void InitPkgUart(Pkg_Uart * pkg){
* @param none
* @retval none
* @note 超时时间 = (预分频系数 × 重载值) / LSI频率
* LSI频率约 40kHz,预分频64,重载值=4687,超时≈ 3
* LSI频率约 40kHz,预分频16(枚举 WDT_CLK_DIV_16,重载值=4095,超时≈ 1.64
*/
void wdt_init(void)
{
// 使能看门狗寄存器写访问
wdt_register_write_enable(TRUE);
// 设置预分频系数为 64
wdt_divider_set(WDT_CLK_DIV_64);
// 设置预分频: 必须用枚举 WDT_CLK_DIV_16 (=0x02), 勿传数值 16! (V4B 踩坑)
wdt_divider_set(WDT_CLK_DIV_16);
// 设置重载值
// 超时时间 = (64 × 4687) / 40000 ≈ 7.5
// 如果需要 3秒: (64 × 1875) / 40000 = 3秒
wdt_reload_value_set(1875);
// 设置重载值 4095 (12bit 最大)
// 超时时间 = (16 × 4096) / 40000 ≈ 1.64
wdt_reload_value_set(4095);
// 重载计数器
wdt_counter_reload();
@@ -128,15 +126,6 @@ void wdt_init(void)
PRINT("Watchdog initialized, timeout: %d ms\n", WDT_TIMEOUT_MS);
}
/**
* @brief 喂狗(重载看门狗计数器)
* @param none
* @retval none
*/
void wdt_feed(void)
{
wdt_counter_reload();
}
uint16_t timer_period = 0;
uint16_t channel1_pulse = 0;