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; /* * 断开计数规则: