feat: LEDB 红色呼吸灯 (PB23, PWM11)

- 新增 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)
This commit is contained in:
wangfq
2026-07-21 16:40:05 +08:00
parent d2ca537493
commit ee9aba64b8
@@ -28,6 +28,7 @@
#include <stdlib.h>
#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) ---*/