diff --git a/utilities/at32f421_freertos_demo/inc/TaskLoop.h b/utilities/at32f421_freertos_demo/inc/TaskLoop.h index f8e9776..965e16b 100644 --- a/utilities/at32f421_freertos_demo/inc/TaskLoop.h +++ b/utilities/at32f421_freertos_demo/inc/TaskLoop.h @@ -115,13 +115,18 @@ extern uint32_t LC_Hold_CNT; // 安全复位计数器 extern uint16_t g_safe_max_cnt; // 安全复位超时 /*=========================================================================== - * 故障指示相关 (DLD154V4B 特有,M1H 无黄灯) + * 故障指示相关 — 黄灯 (LEDC, PA10) + * + * 行为: + * - 无线圈上电:黄灯快闪(200ms 周期) + * - 线圈断开 N 次(N≥1):N 短闪(N×80ms 亮,间隔 200ms 灭,长灭 1.2s 重复) + * - 线圈正常连接:黄灯灭 *===========================================================================*/ -extern uint8_t g_loop_power_up_state; // 上电后线圈是否曾连接 -extern uint8_t g_led_loop_reconnect; // 线圈重连状态 (0=正常, >0=故障闪烁) -extern uint8_t g_flag_faul_reconnect; // 故障灯切相 -extern uint8_t g_step_fault_led; // 故障灯步骤 -extern uint16_t g_counter_fault_led; // 故障灯计数器 +extern uint8_t g_loop_power_up_state; // 上电后线圈是否曾连接 (0=否, 1=是) +extern uint8_t g_disconnect_count; // 当前上电周期内线圈断开次数 (0~3) +extern uint8_t g_disconnect_active; // 当前处于断开状态 (0=连接/从未连, 1=断开中) +extern uint8_t g_fault_phase; // 黄灯闪烁阶段 +extern uint16_t g_fault_tick; // 黄灯闪烁计时器 (每5ms+1) /*=========================================================================== * 调试计数器 diff --git a/utilities/at32f421_freertos_demo/src/TaskLoop.c b/utilities/at32f421_freertos_demo/src/TaskLoop.c index 24c7d66..a009c50 100644 --- a/utilities/at32f421_freertos_demo/src/TaskLoop.c +++ b/utilities/at32f421_freertos_demo/src/TaskLoop.c @@ -81,13 +81,13 @@ uint32_t LC_Hold_CNT = 0; uint16_t g_safe_max_cnt = LC_HOLD_TIME; /*=========================================================================== - * 故障指示相关 (DLD154V4B 特有黄灯) + * 故障指示相关 — 黄灯 *===========================================================================*/ uint8_t g_loop_power_up_state = 0; -uint8_t g_led_loop_reconnect = 0; -uint8_t g_flag_faul_reconnect = 0; -uint8_t g_step_fault_led = 0; -uint16_t g_counter_fault_led = 0; +uint8_t g_disconnect_count = 0; +uint8_t g_disconnect_active = 0; +uint8_t g_fault_phase = 0; +uint16_t g_fault_tick = 0; /*=========================================================================== * 调试计数器 @@ -184,79 +184,72 @@ void LEDA_ON_OFF(void) } /*=========================================================================== - * 黄灯故障指示 (LEDC, PA10) — DLD154V4B 特有 - * 状态机由 TMR15 ISR 每 5ms 驱动 + * 黄灯故障指示 (LEDC, PA10) + * + * 由 TMR15 ISR 每 5ms 驱动一次。 + * + * 闪烁模式: + * 无线圈上电 (g_loop_power_up_state==0): + * → 快闪 (200ms 亮 / 200ms 灭) + * 线圈断开过 N 次 (g_disconnect_count >= 1): + * → N 短闪 (80ms 亮, 200ms 灭, 重复 N 次后长灭 1.2s) + * 线圈正常连接: + * → 灭 *===========================================================================*/ void poll_yellow_led(void) { -#define YELLOW_ON_SHORT 16 // 80ms -#define YELLOW_OFF_MIDDLE 40 // 200ms -#define YELLOW_OFF_LONG 290 // ~1.45s +#define FLT_ON_SHORT 16 // 80ms (16 × 5ms) +#define FLT_GAP_SHORT 40 // 200ms +#define FLT_GAP_LONG 240 // 1.2s (240 × 5ms) +#define FLT_FAST_HALF 40 // 200ms 快闪半周期 - if (!g_loop_power_up_state) return; + uint8_t N = g_disconnect_count; - g_counter_fault_led++; + g_fault_tick++; - if (g_led_loop_reconnect == 0x01) { - // 线圈重连:长灭 + 短亮 - if (g_flag_faul_reconnect) { - if (g_counter_fault_led > YELLOW_ON_SHORT) { - g_counter_fault_led = 0; - g_flag_faul_reconnect = 0; - LED_YELLOW_OFF; - } - } else { - if (g_counter_fault_led > YELLOW_OFF_LONG) { - g_flag_faul_reconnect = 1; - g_counter_fault_led = 0; - LED_YELLOW_ON; - } + if (!g_loop_power_up_state) { + /*--- 模式0: 无线圈上电 → 快闪 ---*/ + if (g_fault_tick >= FLT_FAST_HALF) { + g_fault_tick = 0; + LED_YELLOW_GPIO->odt ^= LED_YELLOW_PIN; // toggle } - } else if (g_led_loop_reconnect >= 0x02) { - // 线圈断开:编码闪烁 - if (g_step_fault_led == 0) { - if (g_counter_fault_led > YELLOW_ON_SHORT) { - LED_YELLOW_OFF; - g_step_fault_led = 1; - g_counter_fault_led = 0; - } - } else if (g_step_fault_led == 1) { - if (g_counter_fault_led > YELLOW_OFF_MIDDLE) { - LED_YELLOW_ON; - g_step_fault_led = 2; - g_counter_fault_led = 0; - } - } else if (g_step_fault_led == 2) { - if (g_counter_fault_led > YELLOW_ON_SHORT) { - LED_YELLOW_OFF; - g_step_fault_led = 3; - g_counter_fault_led = 0; - } - } else if (g_step_fault_led == 3) { - if (g_counter_fault_led > (g_led_loop_reconnect >= 0x03 - ? YELLOW_OFF_MIDDLE - : YELLOW_OFF_LONG)) { - LED_YELLOW_ON; - g_step_fault_led = 0; - g_counter_fault_led = 0; + return; + } - // 慢闪模式(低频故障)需要额外步骤 - if (g_led_loop_reconnect >= 0x03) { - g_step_fault_led = 4; - } - } - } else if (g_step_fault_led == 4) { - if (g_counter_fault_led > YELLOW_ON_SHORT) { - LED_YELLOW_OFF; - g_step_fault_led = 5; - g_counter_fault_led = 0; - } - } else if (g_step_fault_led == 5) { - if (g_counter_fault_led > YELLOW_OFF_LONG) { - LED_YELLOW_ON; - g_step_fault_led = 0; - g_counter_fault_led = 0; - } + if (N == 0) { + /*--- 模式1: 无断开记录 → 灭 ---*/ + LED_YELLOW_OFF; + g_fault_tick = 0; + g_fault_phase = 0; + return; + } + + /*--- 模式2: N 短闪 (N=1,2,3) ---*/ + if (N > 3) N = 3; // 最多 3 闪 + + uint8_t phases_total = N * 2; // N 个 ON_short + N 个 GAP_short + uint16_t duration; + + if (g_fault_phase < phases_total) { + /* ON 或 GAP 阶段 */ + duration = (g_fault_phase & 1) ? FLT_GAP_SHORT : FLT_ON_SHORT; + + if (g_fault_phase & 1) { + LED_YELLOW_OFF; // 奇数阶段: 灭 + } else { + LED_YELLOW_ON; // 偶数阶段: 亮 + } + } else { + /* LONG 间隔阶段 */ + duration = FLT_GAP_LONG; + LED_YELLOW_OFF; + } + + if (g_fault_tick >= duration) { + g_fault_tick = 0; + g_fault_phase++; + if (g_fault_phase > phases_total) { + g_fault_phase = 0; // 循环 } } } @@ -297,10 +290,10 @@ void INIT_VD(void) Hold_CNT = 0; g_loop_power_up_state = 0; - g_led_loop_reconnect = 0; - g_flag_faul_reconnect = 0; - g_step_fault_led = 0; - g_counter_fault_led = 0; + g_disconnect_count = 0; + g_disconnect_active = 0; + g_fault_phase = 0; + g_fault_tick = 0; /* 读取拨码初始状态 */ sw0 = gpio_input_data_bit_read(SW5_BUTTON_PORT, SW5_BUTTON_PIN) << 4; @@ -647,7 +640,7 @@ void loop_task_function(void *pvParameters) while (1) { if (loop1_LOOP_OK) { - /*--- 线圈重连检测 ---*/ + /*--- 线圈重连 ---*/ if (!loop1_LOOP_OK0) { /* 线圈恢复:绿灯闪烁提示 */ int i; @@ -658,25 +651,22 @@ void loop_task_function(void *pvParameters) vTaskDelay(200); } loop1_LOOP_OK0 = 1; + g_disconnect_active = 0; // 重连,清除断开标记 } if (loop1_CAP_OK) { loop1_CAP_OK = 0; + /* 首次成功测量 → 标记线圈已连接 */ + if (!g_loop_power_up_state) { + g_loop_power_up_state = 1; + } + /* 核心检测算法 */ vd1_task(); /* 拨码开关轮询 */ poll_sw_state(); - - /* 线圈重连故障指示 */ - if (g_led_loop_reconnect) { - g_led_loop_reconnect &= 0x0F; - g_led_loop_reconnect++; - if (g_led_loop_reconnect > 3) { - g_led_loop_reconnect = 3; - } - } } } else { /*--- 线圈断开 ---*/ @@ -685,11 +675,19 @@ void loop_task_function(void *pvParameters) RLY2_OFF; LEDB_OFF; - /* 首次检测到断开:标记故障 */ - if (!g_led_loop_reconnect) { - g_led_loop_reconnect = 0x02; - g_counter_fault_led = 0; - g_step_fault_led = 0; + /* + * 断开计数规则: + * - 从未连接过上电 (g_loop_power_up_state == 0): 不计入 + * - g_disconnect_active == 0: 新的断开 → 计数+1 + * - g_disconnect_active == 1: 同一次断开,不重复计数 + */ + if (g_loop_power_up_state && !g_disconnect_active) { + g_disconnect_active = 1; + if (g_disconnect_count < 3) { + g_disconnect_count++; + } + g_fault_phase = 0; + g_fault_tick = 0; } vTaskDelay(150);