From ee9aba64b8ab24942eb40e3cfdac99d75e14327c Mon Sep 17 00:00:00 2001 From: wangfq Date: Tue, 21 Jul 2026 16:40:05 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20LEDB=20=E7=BA=A2=E8=89=B2=E5=91=BC?= =?UTF-8?q?=E5=90=B8=E7=81=AF=20(PB23,=20PWM11)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 pwm_led_init(): 初始化 PWM11, f≈5.86kHz, 分辨率128级 - 新增四相呼吸状态机 (渐亮/高亮保持/渐灭/低亮保持), ~13.5s周期 - gpio_uart_init(): LEDB 从 GPIO 改为 PWM 控制 - LEDB_ON/OFF 宏保留备用 (不再用于呼吸控制) - 注: PB23 需在 ISP 烧录时关闭外部复位 (RB_CFG_RESET_EN=0) --- .../APP/peripheral_main.c | 83 ++++++++++++++++++- 1 file changed, 79 insertions(+), 4 deletions(-) diff --git a/BLE/DLD154Pro_Peripheral_28K/APP/peripheral_main.c b/BLE/DLD154Pro_Peripheral_28K/APP/peripheral_main.c index 6be52c4..a17c386 100644 --- a/BLE/DLD154Pro_Peripheral_28K/APP/peripheral_main.c +++ b/BLE/DLD154Pro_Peripheral_28K/APP/peripheral_main.c @@ -28,6 +28,7 @@ #include #include "cmcng.h" #include "dbn_ble_srv.h" +#include "CH59x_pwm.h" uint8_t g_flag_bt_state = 0; // 0 蓝牙没有连接,1 有蓝牙连接 @@ -69,6 +70,23 @@ uint32_t g_sys_freq = 0; /* 光耦输入预留 (逻辑待定) */ #define OPT_IN1 (GPIOB_ReadPortPin(GPIO_Pin_10)) +/*=========================================================================== + * LEDB 红色呼吸灯 (PB23, PWM11) + * PWM freq ≈ 60MHz / (PWM_CLK_DIV * 128) ≈ 5.86kHz @DIV=80 + * 呼吸周期 ≈ (127*2*50ms) + 0.5s + 0.3s ≈ 13.5s + *===========================================================================*/ +#define PWM_CLK_DIV 80 +#define PWM_CYCLE 128 // 7-bit 分辨率 (0~127) +#define BREATH_STEP_DELAY 1 // 每 50ms 更新一次占空比 (步进平滑) +#define BREATH_FADE_IN 0 +#define BREATH_HOLD_HIGH 1 +#define BREATH_FADE_OUT 2 +#define BREATH_HOLD_LOW 3 + +static uint8_t g_breath_phase = BREATH_FADE_IN; +static uint8_t g_breath_duty = 0; +static uint8_t g_breath_tick = 0; + const uint8_t MAX_Store_Size = 80; uint8_t g_loop_power_up_state = 0; // 开机启动时线圈是否连接 uint8_t g_disconnect_active = 0; // 当前线圈是否断开中 (1=断开) @@ -368,11 +386,29 @@ void gpio_uart_init(void) GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeOut_PP_5mA); RLY1_OFF; - /*--- 指示灯 (PB22=LEDA绿, PB23=LEDB红, 低电平有效) ---*/ - GPIOB_SetBits(GPIO_Pin_22 | GPIO_Pin_23); - GPIOB_ModeCfg(GPIO_Pin_22 | GPIO_Pin_23, GPIO_ModeOut_PP_5mA); + /*--- LEDA 绿色 (PB22, GPIO, 低电平有效) ---*/ + GPIOB_SetBits(GPIO_Pin_22); + GPIOB_ModeCfg(GPIO_Pin_22, GPIO_ModeOut_PP_5mA); LEDA_OFF; - LEDB_OFF; + + /*--- LEDB 红色 (PB23, PWM11, 呼吸灯) ---*/ + pwm_led_init(); +} + +/*=========================================================================== + * pwm_led_init -- 初始化 LEDB (PB23) 红色呼吸灯 (PWM11) + * PWM 频率 ≈ 60MHz / (80 * 128) ≈ 5.86kHz + * 初始占空比 = 0 (LED 灭) + * 注: PB23 需在 ISP 烧录时关闭外部复位功能 (RB_CFG_RESET_EN=0) + *===========================================================================*/ +static void pwm_led_init(void) +{ + GPIOB_SetBits(GPIO_Pin_23); + GPIOB_ModeCfg(GPIO_Pin_23, GPIO_ModeOut_PP_5mA); + + PWMX_CLKCfg(PWM_CLK_DIV); + PWMX_CycleCfg(PWMX_Cycle_128); // 128 级占空比分辨率 + PWMX_ACTOUT(CH_PWM11, 0, Low_Level, ENABLE); // 初始 duty=0, LED 灭 } @@ -1086,6 +1122,45 @@ void TMR1_IRQHandler(void) #endif } } + + /*--- LEDB 红色呼吸灯 (PWM11, 50ms tick) ---*/ + g_breath_tick++; + switch (g_breath_phase) { + case BREATH_FADE_IN: // 渐亮 0 → max, 每300ms一步 + if (g_breath_tick >= BREATH_STEP_DELAY) { + g_breath_tick = 0; + g_breath_duty++; + PWM11_ActDataWidth(g_breath_duty); + if (g_breath_duty >= PWM_CYCLE - 1) { + g_breath_phase = BREATH_HOLD_HIGH; + g_breath_tick = 0; + } + } + break; + case BREATH_HOLD_HIGH: // 最亮保持 ~0.5s + if (g_breath_tick >= 10) { + g_breath_phase = BREATH_FADE_OUT; + g_breath_tick = 0; + } + break; + case BREATH_FADE_OUT: // 渐灭 max → 0, 每300ms一步 + if (g_breath_tick >= BREATH_STEP_DELAY) { + g_breath_tick = 0; + g_breath_duty--; + PWM11_ActDataWidth(g_breath_duty); + if (g_breath_duty == 0) { + g_breath_phase = BREATH_HOLD_LOW; + g_breath_tick = 0; + } + } + break; + case BREATH_HOLD_LOW: // 最暗保持 ~0.3s + if (g_breath_tick >= 6) { + g_breath_phase = BREATH_FADE_IN; + g_breath_tick = 0; + } + break; + } } /*--- 线圈载波检测 & 继电器输出刷新 (每 5ms) ---*/