From f59baac571060232c6623df691441dee3cab6bb9 Mon Sep 17 00:00:00 2001 From: wangfq Date: Tue, 23 Jun 2026 13:55:53 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=BB=BF=E7=81=AF=E8=A1=8C=E4=B8=BA=20?= =?UTF-8?q?=E2=80=94=20=E8=87=AA=E6=A3=80=E6=85=A2=E9=97=AA=20+=20?= =?UTF-8?q?=E8=BD=A6=E8=BE=86=E5=AD=98=E5=9C=A8=E6=8C=87=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 自检阶段 (loop1_INI_LOOP 或线圈未稳定): 绿灯慢闪 (500ms) - 正常工作: 有车亮, 无车灭 - 绿灯统一由 TMR15 ISR poll_green_led() 驱动, 单点控制 - 移除 vd1_task 和 loop_task 中所有手动 LEDB_ON/OFF - 移除线圈重连时的 6 次绿灯闪烁 (由黄灯故障码替代) --- .../at32f421_freertos_demo/inc/TaskLoop.h | 1 + .../at32f421_freertos_demo/src/TaskLoop.c | 49 ++++++++++++++----- 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/utilities/at32f421_freertos_demo/inc/TaskLoop.h b/utilities/at32f421_freertos_demo/inc/TaskLoop.h index 965e16b..06e58ef 100644 --- a/utilities/at32f421_freertos_demo/inc/TaskLoop.h +++ b/utilities/at32f421_freertos_demo/inc/TaskLoop.h @@ -143,6 +143,7 @@ uint8_t update_moving_average(uint32_t* p_sum, uint16_t* p_cnt, uint32_t* p_origin, uint32_t new_value, uint8_t window); void poll_yellow_led(void); +void poll_green_led(void); void LEDA_ON_OFF(void); void vd1_task(void); diff --git a/utilities/at32f421_freertos_demo/src/TaskLoop.c b/utilities/at32f421_freertos_demo/src/TaskLoop.c index a009c50..fdf9ada 100644 --- a/utilities/at32f421_freertos_demo/src/TaskLoop.c +++ b/utilities/at32f421_freertos_demo/src/TaskLoop.c @@ -183,6 +183,41 @@ void LEDA_ON_OFF(void) LED_RED_GPIO->odt ^= LED_RED_PIN; } +/*=========================================================================== + * 绿灯指示 (LEDB, PA9) + * + * 由 TMR15 ISR 每 5ms 驱动一次,是绿灯的唯一控制入口。 + * + * 模式: + * 自检中 (loop1_INI_LOOP==1 或 线圈未稳定): + * → 慢闪 (500ms 亮 / 500ms 灭) + * 正常工作: + * → 有车亮 (VD_FLAG==1), 无车灭 + *===========================================================================*/ +void poll_green_led(void) +{ +#define GREEN_SLOW_HALF 100 // 500ms (100 × 5ms) + + static uint16_t _slow_tick = 0; + + /*--- 自检阶段:慢闪 ---*/ + if (loop1_INI_LOOP || !g_loop_power_up_state) { + _slow_tick++; + if (_slow_tick >= GREEN_SLOW_HALF) { + _slow_tick = 0; + LED_GREEN_GPIO->odt ^= LED_GREEN_PIN; // toggle + } + return; + } + + /*--- 正常工作:车辆存在指示 ---*/ + _slow_tick = 0; + if (loop1_VD_FLAG) + LEDB_ON; + else + LEDB_OFF; +} + /*=========================================================================== * 黄灯故障指示 (LEDC, PA10) * @@ -535,8 +570,9 @@ void TMR15_GLOBAL_IRQHandler(void) loop1_LOOP_OK = 0; } - /*--- 硬件驱动:呼吸灯 + 故障灯 ---*/ + /*--- 硬件驱动:呼吸灯 + 指示灯 ---*/ poll_red_pwm(); + poll_green_led(); poll_yellow_led(); tmr_flag_clear(TMR15, TMR_OVF_FLAG); @@ -578,7 +614,6 @@ void vd1_task(void) loop1_VD_FLAG = 1; loop1_FLAG_IN = 1; - LEDB_ON; /* 有限存在计时(非安全复位模式下) */ if (!SET_SAFE) { @@ -613,7 +648,6 @@ void vd1_task(void) loop1_FLAG_OUT = 1; loop1_VD_HOLD = 0; loop1_LC_HOLD = 0; - LEDB_OFF; loop1_ORG_CNT = 0; loop1_ORG_SUM = 0; @@ -642,14 +676,6 @@ void loop_task_function(void *pvParameters) if (loop1_LOOP_OK) { /*--- 线圈重连 ---*/ if (!loop1_LOOP_OK0) { - /* 线圈恢复:绿灯闪烁提示 */ - int i; - for (i = 0; i < 6; i++) { - LEDB_ON; - vTaskDelay(200); - LEDB_OFF; - vTaskDelay(200); - } loop1_LOOP_OK0 = 1; g_disconnect_active = 0; // 重连,清除断开标记 } @@ -673,7 +699,6 @@ void loop_task_function(void *pvParameters) loop1_VD_FLAG = 0; RLY1_OFF; RLY2_OFF; - LEDB_OFF; /* * 断开计数规则: