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) ---*/