wizard hace 2 semanas
commit
6d2fd680e1
Se han modificado 8 ficheros con 1100 adiciones y 0 borrados
  1. 4 0
      .gitignore
  2. 276 0
      APP/hw_config.c
  3. 62 0
      APP/include/hw_config.h
  4. 53 0
      APP/include/pindef.h
  5. 511 0
      APP/include/project_config.h
  6. 178 0
      CMakeLists.txt
  7. 4 0
      app.json
  8. 12 0
      app_meta.json

+ 4 - 0
.gitignore

@@ -0,0 +1,4 @@
+*.bak-*
+build/
+.DS_Store
+Thumbs.db

+ 276 - 0
APP/hw_config.c

@@ -0,0 +1,276 @@
+/*
+ * hw_config.c
+ *
+ *  可变化的硬件相关逻辑。
+ *  换 PCB / 改引脚 / 调启动流程 — 只改这个文件, ukey.c 状态机不动。
+ *
+ *  函数清单:
+ *    GPIOA_IRQHandler  — 按键 GPIO 中断
+ *    checkbleOnOrOff   — 按键短按次数 → 操作分发
+ *    sw_hal_sleep      — 进入低功耗睡眠 / 关机
+ *    sys_startup       — 上电开机硬件初始化
+ */
+
+#include "hw_config.h"
+#include "ledx.h"
+#include "RF_PHY.h"
+#include "pindef.h"
+#include "peripheral.h"
+#include "sir24drv.h"
+#include "hop_config.h"   /* sys_startup: HOP_POOL */
+#include "rx_hop.h"       /* sys_startup: rx_hop_init */
+#include "ukey.h"         /* setOPMode, __OP_MODE__, OPMODE_* */
+
+/* ==================== GPIO 中断 ==================== */
+__INTERRUPT
+__HIGH_CODE
+void GPIOA_IRQHandler(void)
+{
+    GPIO_PIN_ClearITFlagBit(SW_KEY_PORT, SW_KEY);
+}
+
+
+/* ==================== 按键短按处理 ==================== */
+void checkbleOnOrOff(uint32_t key_up_time)
+{
+    if (key_down_counter > 0) {
+        if (RTC_GetCycle32k() - key_down_time > KEY_SEQUENCE_TIMEOUT) {
+
+            if (key_down_counter == 2) {
+                /* 双击: 预留(原为配对/BLE) */
+
+            } else if (key_down_counter == 1 && CAN_ENTERN_NORMAL_OPMODE()) {
+                /* 单按: 进入普通模式 */
+                setOPMode(OPMODE_NORMAL);
+
+            } else if (key_down_counter == 1 && __OP_MODE__ == OPMODE_NORMAL) {
+                /* 普通模式下单按: 切换闪烁模式 */
+                if (isRFOn) {
+                    key_down_counter = 0;
+                    return;
+                }
+                resetEco();
+                setColorModeNext();
+            }
+            key_down_counter = 0;
+        }
+    }
+}
+
+
+/* ==================== 进入睡眠 / 关机 ==================== */
+void sw_hal_sleep(void)
+{
+    RF2401_Shutdown();
+    sys_idle_count = 0;
+    setBrightness(0);
+
+    /* 按键唤醒配置 */
+    GPIO_PIN_ModeCfg(SW_KEY_PORT, SW_KEY, GPIO_ModeIN_PU);
+    GPIO_PIN_ITModeCfg(SW_KEY_PORT, SW_KEY, GPIO_ITMode_FallEdge);
+
+    /* 声音开关: 上拉关断 */
+    GPIO_PIN_ModeCfg(SOUND_SW_PORT, SOUND_SW, GPIO_ModeOut_PP_5mA);
+    GPIO_PIN_SetBits(SOUND_SW_PORT, SOUND_SW);
+
+    /* 关掉声音检测引脚的唤醒使能 */
+    R16_PB_INT_EN   &= ~SOUND_PIN;
+    R16_PB_INT_MODE &= ~SOUND_PIN;
+    R16_PB_INT_IF    =  SOUND_PIN;
+
+    /* LED 引脚设为输出低 */
+    GPIO_PIN_ModeCfg(LED_PORT, LED_PIN, GPIO_ModeOut_PP_5mA);
+    GPIO_PIN_ResetBits(LED_PORT, LED_PIN);
+
+    /* 使能 GPIO 中断唤醒 */
+    PFIC_EnableIRQ(GPIO_A_IRQn);
+
+    PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay);
+    DelayMs(50);
+
+    /* 标记: 本次由中断唤醒 (若 RTC 唤醒则此标志未被设置, 说明中断失效, 人工唤醒) */
+    is_iqr_weekup = TRUE;
+    DelayMs(100);
+
+    LowPower_Shutdown(0);
+    HSECFG_Current(HSE_RCur_100);
+    need_pwup = TRUE;
+}
+
+
+/* ==================== 开机初始化 ==================== */
+void sys_startup(void)
+{
+    /* LED 引脚 */
+    GPIO_PIN_ModeCfg(LED_PORT, LED_PIN, GPIO_ModeOut_PP_5mA);
+    GPIO_PIN_ResetBits(LED_PORT, LED_PIN);
+
+    ledPwmInit();
+
+    /* 进入普通模式 */
+    setOPMode(OPMODE_NORMAL);
+
+    /* 声音引脚: 浮空输入 */
+    GPIO_PIN_ModeCfg(SOUND_PORT, SOUND_PIN, GPIO_ModeIN_Floating);
+
+    /* 声音开关: 输出低 */
+    GPIO_PIN_ModeCfg(SOUND_SW_PORT, SOUND_SW, GPIO_ModeOut_PP_5mA);
+    GPIO_PIN_ResetBits(SOUND_SW_PORT, SOUND_SW);
+
+    /* SI24R1 重映射 + SPI 初始化 */
+    SI24R1_SPI_REMAP_INIT();
+    drv_spi_init();
+    NRF24L01_Gpio_Init();
+
+    if (NRF24L01_check() == SUCCESS) {
+        RF24L01_Init();
+        NRF24L01_Set_Speed(SPEED_250K);
+        DelayMs(10);
+        RF24L01_Set_Mode(MODE_RX);
+
+        /* HOP_POOL 首信道开机驻留 */
+        {
+            static const uint8_t pool[HOP_POOL_SIZE] = HOP_POOL;
+            uint8_t boot_freq = pool[0];
+            RF24LL01_Write_Hopping_Point(boot_freq);
+            DelayUs(100);
+            rx_hop_init(boot_freq);
+        }
+        IS_RF_INITED = TRUE;
+    }
+
+    /* 按键 / 空闲状态复位 */
+    key_down_counter     = 0;
+    is_key_down          = FALSE;
+    skip_this_btn_down   = TRUE;
+    sys_idle_count       = 0;
+    count_5              = 0;
+
+    /* 开机防抖计时 */
+    is_powup_first = TRUE;
+    sys_open_time  = RTC_GetCycle32k();
+
+    resetEco();
+}
+
+/* ==================== 节能亮度曲线 ==================== */
+/* 每阶段从 pwm_start 线性过渡到 pwm_end, 持续 sec 秒。
+ * is_loop=1 的阶段构成循环体; loop_max_sec 限制循环总时长。
+ * 修改此表即可调整节能策略, 无需改动 ledx.c 逻辑。 */
+
+/* 修改此表后需同步更新 hw_config.h 中的 ECO_PLAN_LEN */
+struct eco_s eco_plan[] = {
+    { 9500, 60, 9500, 0, 0 },   /* 95% 保持 60 秒 */
+};
+
+/* ---- 节能状态机 ---- */
+volatile uint8_t  eco_idx      = 0;
+volatile uint16_t eco_sec      = 0;
+volatile uint16_t eco_loop_sec = 0;
+
+uint8_t resetEco(void)
+{
+    eco_idx      = 0;
+    eco_sec      = 0;
+    eco_loop_sec = 0;
+    _led_pwm_echo = eco_plan[0].pwm_start;
+}
+
+uint8_t changeEco(void)
+{
+    ledPwmApplyBrightness(_led_brightness);
+
+    struct eco_s *cur = &eco_plan[eco_idx];
+    eco_sec++;
+    _led_pwm_echo = cur->pwm_start
+        + (int32_t)(cur->pwm_end - cur->pwm_start) * eco_sec / cur->sec;
+
+    if (cur->is_loop) {
+        eco_loop_sec++;
+        uint8_t ls = eco_idx;
+        while (ls > 0 && eco_plan[ls - 1].is_loop) ls--;
+        uint16_t maxs = eco_plan[ls].loop_max_sec;
+        if (maxs > 0 && eco_loop_sec >= maxs) {
+            eco_sec      = 0;
+            eco_loop_sec = 0;
+            uint8_t n = ls;
+            while (n < ECO_PLAN_LEN && eco_plan[n].is_loop) n++;
+            if (n < ECO_PLAN_LEN) {
+                eco_idx      = n;
+                _led_pwm_echo = eco_plan[eco_idx].pwm_start;
+            }
+            return 2;
+        }
+    }
+
+    if (eco_sec >= cur->sec) {
+        eco_sec = 0;
+        uint8_t is_last_loop = cur->is_loop
+            && (eco_idx + 1 >= ECO_PLAN_LEN || !eco_plan[eco_idx + 1].is_loop);
+        if (is_last_loop) {
+            uint8_t s = eco_idx;
+            while (s > 0 && eco_plan[s - 1].is_loop) s--;
+            eco_idx = s;
+        } else if (eco_idx + 1 < ECO_PLAN_LEN) {
+            eco_idx++;
+        }
+        _led_pwm_echo = eco_plan[eco_idx].pwm_start;
+    }
+
+    return 2;
+}
+
+
+/* ==================== 声音检测 ==================== */
+static uint32_t ms10sys32tick = MS_TO_RTC(2);   /* 2ms 检测间隔 */
+
+uint8_t catchSound(void)
+{
+    uint32_t current_time = RTC_GetCycle32k();
+    uint32_t time_diff;
+
+    /* 安全时间差 (处理 32-bit 溢出) */
+    if (current_time >= _led_current_sound_systick) {
+        time_diff = current_time - _led_current_sound_systick;
+    } else {
+        time_diff = 0xFFFFFFFF - _led_current_sound_systick + current_time + 1;
+    }
+
+    if (time_diff > ms10sys32tick) {
+        _led_current_sound_systick = current_time;
+
+        /* 读取 GPIO 并去抖动 */
+        uint8_t current_gpio_state = (GPIO_PIN_ReadPortPin(SOUND_PORT, SOUND_PIN) == 0) ? 0 : 1;
+
+        if (current_gpio_state != last_gpio_state) {
+            sound_debounce_count = 0;
+        } else {
+            if (sound_debounce_count < SOUND_DEBOUNCE_COUNT) {
+                sound_debounce_count++;
+            }
+        }
+        last_gpio_state = current_gpio_state;
+
+        /* 去抖动稳定后判定声音 */
+        if (sound_debounce_count >= SOUND_DEBOUNCE_COUNT) {
+            if (current_gpio_state == 0) {
+                inSound = SOUND_ACTIVE_DURATION;
+                setBrightness(255);
+                return 1;
+            }
+        }
+
+        /* 声音后保持亮度倒计时 */
+        if (inSound > 0) {
+            inSound--;
+            if (inSound > 0) {
+                setBrightness(255);
+                return 1;
+            }
+        }
+        setBrightness(0);
+        return 2;
+    }
+
+    return 0;
+}

+ 62 - 0
APP/include/hw_config.h

@@ -0,0 +1,62 @@
+/*
+ * hw_config.h
+ *
+ *  可变化的硬件相关逻辑: GPIO 中断、睡眠/唤醒时序、开机初始化、
+ *  节能曲线表、声音检测。
+ *  换 PCB / 改引脚 / 调启动流程时只需修改 hw_config.c 即可,
+ *  ukey.c 和 ledx.c 的纯逻辑代码不动。
+ */
+
+#ifndef HW_CONFIG_H
+#define HW_CONFIG_H
+
+#include "CH58x_common.h"
+
+/* struct eco_s 定义在 ledx.h */
+
+
+
+/* ---- 原 ukey.c 变量, 此处供 hw_config.c 使用 ---- */
+extern uint8_t  key_down_counter;
+extern uint32_t key_down_time;
+extern uint16_t sys_idle_count;
+extern BOOL     need_pwup;
+extern uint32_t sys_open_time;
+extern BOOL     is_key_down;
+extern BOOL     skip_this_btn_down;
+extern uint8_t  count_5;
+extern BOOL     is_powup_first;
+extern BOOL     is_iqr_weekup;
+
+/* ---- 其他模块变量 ---- */
+extern BOOL isRFOn;          /* RF_PHY.c */
+extern BOOL IS_RF_INITED;    /* RF_main.c  */
+
+
+/* eco_plan[] 定义在 hw_config.c, sizeof 对外部数组不可用,改为手动计数 */
+#ifndef ECO_PLAN_LEN
+#define ECO_PLAN_LEN  1
+#endif
+
+/* ---- 节能状态机 (定义在 hw_config.c) ---- */
+extern volatile uint8_t  eco_idx;
+extern volatile uint16_t eco_sec;
+extern volatile uint16_t eco_loop_sec;
+
+uint8_t resetEco(void);
+uint8_t changeEco(void);
+
+/* ---- 声音检测 (原 ledx.c static 变量去 static) ---- */
+extern uint32_t           _led_current_sound_systick;
+extern volatile uint16_t  inSound;
+extern uint8_t            sound_debounce_count;
+extern uint8_t            last_gpio_state;
+
+/* ---- 函数声明 ---- */
+__INTERRUPT __HIGH_CODE void GPIOA_IRQHandler(void);
+void                        checkbleOnOrOff(uint32_t key_up_time);
+void                        sw_hal_sleep(void);
+void                        sys_startup(void);
+uint8_t                     catchSound(void);
+
+#endif /* HW_CONFIG_H */

+ 53 - 0
APP/include/pindef.h

@@ -0,0 +1,53 @@
+/*
+ * pindef.h
+ *
+ *  Created on: Jun 20, 2025
+ *      Author: 51005
+ *
+ *  每个 PIN 定义包含两个宏:
+ *    xxx_PIN  — GPIO 引脚位掩码 (GPIO_Pin_*)
+ *    xxx_PORT — 所属 GPIO 端口 (A 或 B)
+ *
+ *  配合 project_config.h 中的 GPIO_PIN_* 宏使用:
+ *    GPIO_PIN_ModeCfg(LED_PORT, LED_PIN, GPIO_ModeOut_PP_5mA);
+ */
+
+#ifndef INCLUDE_PINDEF_H_
+#define INCLUDE_PINDEF_H_
+
+#include "CH58x_common.h"
+
+/* GPIOB 辅助宏 (SDK 只提供了 GPIOB_PinOutput/Input) */
+#define GPIOB_PinOutput(pin)      (R32_PB_DIR    |= pin)
+#define GPIOB_PinInput(pin)       (R32_PB_DIR    &= ~pin)
+
+//#define POWER_CTRL_PIN  GPIO_Pin_10 //电源控制
+//#define LED_CTR_PIN         GPIO_Pin_5 //LED控制  PB5
+
+/* LED 输出 */
+#define LED_PIN         GPIO_Pin_14      // PB14
+#define LED_PORT        B
+
+#define LED_SW          GPIO_Pin_11      // PB11 (LED开关 - 备用)
+#define LED_SW_PORT     B
+
+/* 声音拾取 */
+#define SOUND_PIN       GPIO_Pin_9       // PB9  (注: shutdown 时临时切到 PA,见 ukey.c)
+#define SOUND_PORT      B
+
+/* 声音拾取开关 */
+#define SOUND_SW        GPIO_Pin_10      // PA10
+#define SOUND_SW_PORT   A
+
+/* 电源按键 */
+#define SW_KEY          GPIO_Pin_4       // PA4
+#define SW_KEY_PORT     A
+
+/* PWM 通道 (无端口,直接绑定 CH_PWM10) */
+#define PWM_LED_CHANNEL       CH_PWM10
+
+/* 按键检测位 (PA4) */
+#define KEY10_BV                  BV(4)
+#define KEY10_IN                  (ACTIVE_LOW(R32_PA_PIN & KEY10_BV))
+
+#endif /* INCLUDE_PINDEF_H_ */

+ 511 - 0
APP/include/project_config.h

@@ -0,0 +1,511 @@
+/**
+ * ===================================================
+ * project_config.h — 全局可调配置集中管理
+ * ===================================================
+ *
+ * 本文件汇集 APP 内所有可修改的硬件、时序、阈值参数。
+ * 修改任何参数后重新编译即可生效,无需逐文件查找。
+ *
+ * 使用 #ifndef 守卫允许编译选项(-D)或上游头文件覆盖。
+ *
+ * 本文件不包含:
+ *   - 内存/缓冲大小 (memory_pool_c.h 自行管理)
+ *   - BLE 连接参数 (peripheral.c 自行管理)
+ *   - NRF 寄存器地址/位定义 (sir24drv.h 芯片手册常量)
+ *   - GATT UUID (gattprofile.h Profile 定义)
+ *   - GPIO 引脚映射 (pindef.h 硬件绑定)
+ *
+ * 编码: GBK (与项目保持一致)
+ */
+
+#ifndef PROJECT_CONFIG_H
+#define PROJECT_CONFIG_H
+
+/* ==================== 1. RF 构建变体 ==================== */
+/* 由 build 脚本通过 -d 选项重写,每台设备编译时生成不同 .hex。
+ * 也可直接修改此处手工构建。 */
+
+#ifndef INIT_ADDR
+#define INIT_ADDR           0x34,0x43,0x10,0x10,0x02  /* SI24R1 5字节地址 */
+#endif
+
+#ifndef SI24R1_CH
+#define SI24R1_CH           16                         /* SI24R1 信道 (0-127, 1MHz步进) */
+#endif
+
+
+/* ==================== 2. 跳频参数 ==================== */
+/* 【重要】中控与从机两端必须完全一致,否则无法通信。
+ * 修改后两端同步重新编译部署。 */
+
+#ifndef HOP_POOL
+/* 跳频信道池:避开 WiFi ch1/6/11/13。
+ * 4 信道:16(低端夹缝),84(中段),98(中高),112(高端) */
+#define HOP_POOL            {16,84,98,112}
+#endif
+
+#ifndef HOP_POOL_SIZE
+#define HOP_POOL_SIZE       4       /* 信道池大小 */
+#endif
+
+#ifndef HOP_SLOT_MS
+#define HOP_SLOT_MS         32      /* 跳频时隙 (ms),与中控 MODE_TICK_MS 对齐 */
+#endif
+
+#ifndef HOP_RX_TIMEOUT_MS
+#define HOP_RX_TIMEOUT_MS   320     /* 失步阈值 (ms),作为 HOP_CREDIT_MAX 导出基准 */
+#endif
+
+#define HOP_CREDIT_MAX      (HOP_RX_TIMEOUT_MS / HOP_SLOT_MS)  /* 信用桶满额 (=10) */
+
+#ifndef HOP_CREDIT_RX_GAIN
+#define HOP_CREDIT_RX_GAIN  2       /* 每 slot 收包信用增益 */
+#endif
+
+#ifndef HOP_RX_SELF_HEAL_MS
+#define HOP_RX_SELF_HEAL_MS 10000   /* 硬件自愈超时 (ms): 连续无包此时间后软复位 SI24R1 */
+#endif
+
+/* SipHash-2-4 共享密钥 (16 字节)
+ * 两端必须完全一致,否则 MAC 校验失败→灯光包全部丢弃。
+ * 当前为占位测试密钥,正式部署前替换。 */
+#ifndef HOP_KEY_BYTE_0
+#define HOP_KEY_INIT  { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, \
+                         0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF }
+#endif
+
+
+/* ==================== 3. 灯光相位同步 ==================== */
+/* 丢包兜底:从机 RTC 外推 phase 保持动画连续,直到重新收包或 RF 超时。 */
+
+/* 相位模式值:与中控 MODE_VALUE_* 一致 */
+#ifndef RF_PHASE_MODE_CONST
+#define RF_PHASE_MODE_CONST       0u
+#endif
+#ifndef RF_PHASE_MODE_BLINK
+#define RF_PHASE_MODE_BLINK       2u
+#endif
+#ifndef RF_PHASE_MODE_GRADIENT
+#define RF_PHASE_MODE_GRADIENT    3u
+#endif
+
+#ifndef RF_PHASE_FALLBACK_MS
+#define RF_PHASE_FALLBACK_MS      80u     /* 丢包超过此毫秒数后才启用相位外推 */
+#endif
+
+/* 相位软同步参数 */
+#ifndef PHASE_SOFT_ALPHA_N
+#define PHASE_SOFT_ALPHA_N        77      /* alpha 分子, α≈0.3 */
+#endif
+#ifndef PHASE_SOFT_ALPHA_D
+#define PHASE_SOFT_ALPHA_D        256     /* alpha 分母 (>>8 免除法) */
+#endif
+#ifndef PHASE_SOFT_LIMIT
+#define PHASE_SOFT_LIMIT          8192    /* 单次校正限幅,防丢包大跳 */
+#endif
+
+/* 相位外推启用延迟:距上次收包超过此毫秒数才从每包亮度切换到 RTC 外推 */
+#ifndef RF_PHASE_EXTRAPOLATE_DT_MS
+#define RF_PHASE_EXTRAPOLATE_DT_MS  100u
+#endif
+
+/* 默认 blink_period_units:老固件不发该字节时的兜底值,退化为慢闪速率 */
+#ifndef DEFAULT_BLINK_PERIOD_UNITS
+#define DEFAULT_BLINK_PERIOD_UNITS  20
+#endif
+
+
+/* ==================== 4. TMOS / 时序任务间隔 ==================== */
+/* TMOS 时基: 1 tick = 1/32768 s ≈ 0.0305 ms. 以下为 tick 数。 */
+
+/* PERIODIC 渲染任务重排间隔: 16*1 = 16 ticks ≈ 10ms */
+#ifndef RF_PERIODIC_RETICK
+#define RF_PERIODIC_RETICK          (16*1)
+#endif
+
+/* 渲染采样间隔:16ms, <= BURST 半周期 32ms/2 (奈奎斯特) */
+#ifndef RENDER_SAMPLE_TICK
+#define RENDER_SAMPLE_TICK          MS_TO_RTC(16)
+#endif
+
+/* RF 超时计数上限: 16ms×3000≈48s 无中控包 → isRFOn=false */
+#ifndef RF_TIMEOUT_COUNT
+#define RF_TIMEOUT_COUNT            3000
+#endif
+
+/* 按键轮询 */
+#ifndef KEY_POLL_INIT_TICK
+#define KEY_POLL_INIT_TICK          (16*50)     /* 按键事件后加速轮询 */
+#endif
+#ifndef KEY_POLL_CONT_TICK
+#define KEY_POLL_CONT_TICK          (16*10)     /* 常规轮询间隔 */
+#endif
+
+/* 近距离感应/群控状态检查 (SELF_LIGHT_EVT) */
+#ifndef SELF_LIGHT_PERIOD_TICK
+#define SELF_LIGHT_PERIOD_TICK      1600        /* ≈50ms */
+#endif
+
+/* 节能 (ECO) 任务 */
+#ifndef OPENVOICE_SHORT_TICK
+#define OPENVOICE_SHORT_TICK        (1600*2)    /* ≈100ms, 过渡阶段 */
+#endif
+#ifndef OPENVOICE_NORMAL_TICK
+#define OPENVOICE_NORMAL_TICK       1600        /* ≈50ms, 正常阶段 */
+#endif
+#ifndef OPENVOICE_LONG_TICK
+#define OPENVOICE_LONG_TICK         (1600*3600) /* ≈180s, 长间隔阶段 */
+#endif
+
+/* 系统定时器 */
+#ifndef SYSTICK_INTERVAL
+#define SYSTICK_INTERVAL            1000
+#endif
+
+/* 看门狗周期: FREQ_SYS / WDT_PERIOD_DIV */
+#ifndef WDT_PERIOD_DIV
+#define WDT_PERIOD_DIV              10          /* 100ms */
+#endif
+
+
+/* ==================== 5. LED PWM / 亮度控制 ==================== */
+
+#ifndef PWM_CLOCK_DIVX
+#define PWM_CLOCK_DIVX              2           /* PWM 时钟分频 */
+#endif
+
+#ifndef PWM_LED_ECHO_INIT
+#define PWM_LED_ECHO_INIT           9500        /* 初始 PWM 回显 (95.00%) */
+#endif
+
+#ifndef BRIGHTNESS_SCALE_DEN
+#define BRIGHTNESS_SCALE_DEN        10000       /* 亮度缩放分母 */
+#endif
+
+#ifndef BRIGHTNESS_MIN_THRESHOLD
+#define BRIGHTNESS_MIN_THRESHOLD    10          /* 低于此值直接关断 LED */
+#endif
+
+#ifndef BRIGHTNESS_FULL_THRESHOLD
+#define BRIGHTNESS_FULL_THRESHOLD   0xf0        /* 高于此值视为满亮 */
+#endif
+
+/* LED 各模式最大计数值 */
+#ifndef MAX_SLOW
+#define MAX_SLOW                    8
+#endif
+#ifndef MAX_FAST
+#define MAX_FAST                    4
+#endif
+#ifndef MAX_FLASH
+#define MAX_FLASH                   2
+#endif
+#ifndef MAX_GLOW
+#define MAX_GLOW                    160
+#endif
+#ifndef MAX_PARIR
+#define MAX_PARIR                   300
+#endif
+
+/* 呼吸灯间隔 (RTC tick) */
+#ifndef GLOW_INTERVAL_TICK
+#define GLOW_INTERVAL_TICK          100
+#endif
+
+/* 闪烁模式分频: flashMode() 每 N 次 tick 执行一次 */
+#ifndef FLASH_MODE_DIVIDER
+#define FLASH_MODE_DIVIDER          6
+#endif
+
+
+/* ==================== 6. 声音检测 ==================== */
+
+#ifndef SOUND_DEBOUNCE_COUNT
+#define SOUND_DEBOUNCE_COUNT        2       /* 去抖动连续采样次数 */
+#endif
+
+#ifndef SOUND_ACTIVE_DURATION
+#define SOUND_ACTIVE_DURATION       10      /* 检测到声音后 LED 保持亮起的轮次 */
+#endif
+
+#ifndef SOUND_CHECK_INTERVAL_MS
+#define SOUND_CHECK_INTERVAL_MS     2       /* 声音检测间隔 (ms) */
+#endif
+
+
+/* ==================== 7. 按键 / 电源管理 ==================== */
+
+/* 操作模式 */
+#ifndef OPMODE_UNKNOWN
+#define OPMODE_UNKNOWN              0
+#endif
+#ifndef OPMODE_NORMAL
+#define OPMODE_NORMAL               1
+#endif
+#ifndef OPMODE_BLE
+#define OPMODE_BLE                  7
+#endif
+#ifndef OPMODE_PAIRE
+#define OPMODE_PAIRE                8
+#endif
+#ifndef OPMODE_SHUTDOWN
+#define OPMODE_SHUTDOWN             9
+#endif
+
+/* 模式存储 Flash 地址 */
+#ifndef MODE_ADDR
+#define MODE_ADDR                   0x1000
+#endif
+
+/* 长按阈值: poll 周期计数, ~3s */
+#ifndef KEY_LONG_PRESS_THRESHOLD
+#define KEY_LONG_PRESS_THRESHOLD    25
+#endif
+
+/* 按键序列超时: RTC 周期, 释放后此时间内再次按下视为连续 */
+#ifndef KEY_SEQUENCE_TIMEOUT
+#define KEY_SEQUENCE_TIMEOUT        12000
+#endif
+
+/* 自动关机空闲计数 */
+#ifndef AUTO_SHUTDOWN_COUNT
+#define AUTO_SHUTDOWN_COUNT         150
+#endif
+
+/* 开机防抖: 上电后此时长内长按不触发关机 */
+#ifndef STARTUP_GUARD_MS
+#define STARTUP_GUARD_MS            10
+#endif
+
+
+/* ==================== 8. SI24R1 模式/配置值 ==================== */
+
+/* CONFIG 寄存器 (详见 sir24drv.h 位定义) */
+#ifndef CONFIG_TX_MODE
+#define CONFIG_TX_MODE              0x0e    /* TX 模式 CONFIG 值 */
+#endif
+#ifndef CONFIG_RX_MODE
+#define CONFIG_RX_MODE              0x0f    /* RX 模式 CONFIG 值 */
+#endif
+
+/* RF_SETUP 寄存器初始化值 (250K_1Mbps + LNA_HCURR + PWR_0DB) */
+#ifndef RF_SETUP_INIT_VALUE
+#define RF_SETUP_INIT_VALUE         0x26
+#endif
+
+/* TX 重试超时 */
+#ifndef TX_RETRY_TIMEOUT_MS
+#define TX_RETRY_TIMEOUT_MS         500
+#endif
+
+/* 自动重传 */
+#ifndef AUTO_RETRANSMIT_COUNT
+#define AUTO_RETRANSMIT_COUNT       15
+#endif
+#ifndef AUTO_RETRANSMIT_DELAY
+#define AUTO_RETRANSMIT_DELAY       ARD_4000US
+#endif
+
+/* 固定包长 (动态包关闭时) */
+#ifndef FIXED_PACKET_LEN
+#define FIXED_PACKET_LEN            32
+#endif
+
+/* SI24R1 默认模式 (init 后) */
+#ifndef SI24_DEFAULT_MODE
+#define SI24_DEFAULT_MODE           8
+#endif
+
+
+/* ==================== 9. SI24R1 位bang SPI 引脚 ==================== */
+/* SI24R1 使用 GPIO 模拟 SPI 时序 (非硬件 SPI0 外设)。
+ *
+ * SI24R1_SPI_USE_PORTB = 0: PA12(CSN) PA13(SCK) PA14(MOSI) PA15(MISO)
+ *                          PA11(CE) PA5(IRQ)  — 默认,无需 remap
+ * SI24R1_SPI_USE_PORTB = 1: 开启 SPI0 引脚重映射到 PB12-PB15,
+ *                          CE/IRQ 也切到 PB 对应引脚。
+ *
+ * 注意: CE 和 IRQ 是普通 GPIO,不随 SPI0 remap 自动切换,需手动指定 PB 引脚。
+ * 切换端口后需调用 SI24R1_SPI_REMAP_INIT() 执行 GPIOPinRemap。 */
+
+#ifndef SI24R1_SPI_USE_PORTB
+#define SI24R1_SPI_USE_PORTB        0       /* 0=Port A (默认), 1=Port B (开 remap) */
+#endif
+
+#if SI24R1_SPI_USE_PORTB
+  /* ---- Port B (开启 GPIOPinRemap ENABLE, RB_PIN_SPI0 后) ---- */
+
+  #ifndef SPI_CLK_GPIO_PIN
+  #define SPI_CLK_GPIO_PIN          GPIO_Pin_13
+  #endif
+  #define SPI_CLK_PORT              B
+
+  #ifndef SPI_MISO_GPIO_PIN
+  #define SPI_MISO_GPIO_PIN         GPIO_Pin_15
+  #endif
+  #define SPI_MISO_PORT             B
+
+  #ifndef SPI_MOSI_GPIO_PIN
+  #define SPI_MOSI_GPIO_PIN         GPIO_Pin_14
+  #endif
+  #define SPI_MOSI_PORT             B
+
+  #ifndef SPI_NSS_GPIO_PIN
+  #define SPI_NSS_GPIO_PIN          GPIO_Pin_12
+  #endif
+  #define SPI_NSS_PORT              B
+
+  /* CE 和 IRQ 是普通 GPIO,不在 SPI0 remap 范围内,按需改引脚 */
+  #ifndef RF24L01_CE_GPIO_PIN
+  #define RF24L01_CE_GPIO_PIN       GPIO_Pin_11
+  #endif
+  #define RF24L01_CE_PORT           B
+
+  #ifndef RF24L01_IRQ_GPIO_PIN
+  #define RF24L01_IRQ_GPIO_PIN      GPIO_Pin_5
+  #endif
+  #define RF24L01_IRQ_PORT          B
+
+  /* 初始化时调用此宏执行硬件重映射 */
+  #define SI24R1_SPI_REMAP_INIT()   GPIOPinRemap(ENABLE, RB_PIN_SPI0)
+
+#else
+  /* ---- Port A (默认, 无需 remap) ---- */
+
+  #ifndef SPI_CLK_GPIO_PIN
+  #define SPI_CLK_GPIO_PIN          GPIO_Pin_13
+  #endif
+  #define SPI_CLK_PORT              A
+
+  #ifndef SPI_MISO_GPIO_PIN
+  #define SPI_MISO_GPIO_PIN         GPIO_Pin_15
+  #endif
+  #define SPI_MISO_PORT             A
+
+  #ifndef SPI_MOSI_GPIO_PIN
+  #define SPI_MOSI_GPIO_PIN         GPIO_Pin_14
+  #endif
+  #define SPI_MOSI_PORT             A
+
+  #ifndef SPI_NSS_GPIO_PIN
+  #define SPI_NSS_GPIO_PIN          GPIO_Pin_12
+  #endif
+  #define SPI_NSS_PORT              A
+
+  #ifndef RF24L01_CE_GPIO_PIN
+  #define RF24L01_CE_GPIO_PIN       GPIO_Pin_11
+  #endif
+  #define RF24L01_CE_PORT           A
+
+  #ifndef RF24L01_IRQ_GPIO_PIN
+  #define RF24L01_IRQ_GPIO_PIN      GPIO_Pin_5
+  #endif
+  #define RF24L01_IRQ_PORT          A
+
+  #define SI24R1_SPI_REMAP_INIT()   /* 无需操作 */
+
+#endif
+
+
+/* ==================== 10. 通用 GPIO 操作宏 ==================== */
+/* 将 port + pin 自动派发到 GPIOA_xxx / GPIOB_xxx 函数。
+ * 与 pindef.h 的 xxx_PORT / xxx_PIN 配合使用。
+ *
+ * 用法:
+ *   GPIO_PIN_ModeCfg(SW_KEY_PORT, SW_KEY, GPIO_ModeIN_PU);
+ *   GPIO_PIN_SetBits(SOUND_SW_PORT, SOUND_SW);
+ *   GPIO_PIN_ClearITFlagBit(SW_KEY_PORT, SW_KEY);
+ *
+ * 端口用单字母 A/B, pin 用 GPIO_Pin_* 宏。零运行时开销。 */
+
+/* 内层宏: 接收已展开的端口字母 (A/B), 用 ## 拼出 GPIOx_xxx 函数名 */
+#define _GPIO_PIN_ModeCfg(port, pin, mode)      GPIO##port##_ModeCfg(pin, mode)
+#define _GPIO_PIN_SetBits(port, pin)            GPIO##port##_SetBits(pin)
+#define _GPIO_PIN_ResetBits(port, pin)          GPIO##port##_ResetBits(pin)
+#define _GPIO_PIN_ITModeCfg(port, pin, mode)    GPIO##port##_ITModeCfg(pin, mode)
+#define _GPIO_PIN_ClearITFlagBit(port, pin)     GPIO##port##_ClearITFlagBit(pin)
+#define _GPIO_PIN_ReadPortPin(port, pin)        GPIO##port##_ReadPortPin(pin)
+
+/* 外层宏: 先展开 xxx_PORT 为 A/B, 再交给内层粘贴 */
+#define GPIO_PIN_ModeCfg(port, pin, mode)       _GPIO_PIN_ModeCfg(port, pin, mode)
+#define GPIO_PIN_SetBits(port, pin)             _GPIO_PIN_SetBits(port, pin)
+#define GPIO_PIN_ResetBits(port, pin)           _GPIO_PIN_ResetBits(port, pin)
+#define GPIO_PIN_ITModeCfg(port, pin, mode)     _GPIO_PIN_ITModeCfg(port, pin, mode)
+#define GPIO_PIN_ClearITFlagBit(port, pin)      _GPIO_PIN_ClearITFlagBit(port, pin)
+#define GPIO_PIN_ReadPortPin(port, pin)         _GPIO_PIN_ReadPortPin(port, pin)
+
+
+/* ==================== 11. 协议封包类型标识 ==================== */
+/* 无线/蓝牙包首字节 */
+
+#ifndef PKT_TYPE_CENTRAL_CTRL
+#define PKT_TYPE_CENTRAL_CTRL       0xaa    /* 中控广播包 */
+#endif
+#ifndef PKT_TYPE_PAIR_DATA
+#define PKT_TYPE_PAIR_DATA          0x56    /* 配对/群控数据包 */
+#endif
+#ifndef PKT_TYPE_FLASH_WRITE
+#define PKT_TYPE_FLASH_WRITE        0x57    /* 闪存写入 (BLE) */
+#endif
+#ifndef PKT_TYPE_RESET
+#define PKT_TYPE_RESET              0x58    /* 复位 (BLE) */
+#endif
+#ifndef PKT_TYPE_BLE_LIGHT_CTRL
+#define PKT_TYPE_BLE_LIGHT_CTRL     0x60    /* BLE 灯光控制 */
+#endif
+#ifndef PKT_TYPE_INFO_RESP
+#define PKT_TYPE_INFO_RESP          0x61    /* 信息响应 (BLE) */
+#endif
+#ifndef PKT_TYPE_OTA
+#define PKT_TYPE_OTA                0x62    /* OTA 跳转 (BLE, +magic) */
+#endif
+#ifndef PKT_TYPE_RELOAD_COLORDB
+#define PKT_TYPE_RELOAD_COLORDB     0x63    /* 重载颜色数据库 (BLE) */
+#endif
+#ifndef PKT_TYPE_SET_COLOR_MODE
+#define PKT_TYPE_SET_COLOR_MODE     0x64    /* 设置颜色模式 (BLE) */
+#endif
+
+
+/* ==================== 12. 颜色数据库 ==================== */
+
+#ifndef COLORDB_FILE_MAGIC
+#define COLORDB_FILE_MAGIC          0x59    /* 颜色数据库文件头魔数 */
+#endif
+#ifndef COLORDB_MAX_FRAMES_NOINDEX
+#define COLORDB_MAX_FRAMES_NOINDEX  1024    /* 无索引时最大帧数 */
+#endif
+#ifndef COLORDB_CACHE_SIZE
+#define COLORDB_CACHE_SIZE          8       /* 颜色数据库缓存条目数 */
+#endif
+#ifndef COLORDB_REPEAT_MARKER
+#define COLORDB_REPEAT_MARKER       0xEF    /* 颜色数据库重复标记 */
+#endif
+
+
+/* ==================== 13. 命令/协议通用 ==================== */
+
+#ifndef CMDLEN
+#define CMDLEN                      240     /* 单条命令最大长度 */
+#endif
+
+/* 命令行表/跟随路径初始容量 */
+#ifndef CMD_LIST_INIT_CAPACITY
+#define CMD_LIST_INIT_CAPACITY      8
+#endif
+#ifndef FOLLOW_PATH_INIT_CAPACITY
+#define FOLLOW_PATH_INIT_CAPACITY   4
+#endif
+
+/* 模式值 (亮度/颜色模式,与 ledx COLORMODE 对齐) */
+#ifndef MODE_CONST
+#define MODE_CONST                  0       /* 常亮 */
+#endif
+#ifndef MODE_BREATH
+#define MODE_BREATH                 1       /* 呼吸 */
+#endif
+#ifndef MODE_BLINK_VAL
+#define MODE_BLINK_VAL              2       /* 闪烁 */
+#endif
+
+#endif /* PROJECT_CONFIG_H */

+ 178 - 0
CMakeLists.txt

@@ -0,0 +1,178 @@
+#############################################################[Chinese Manual]###################################################################
+# *****工程路径不要包含中文字符和空格,否则可能会报错!*****
+# 第一步: 确认机器上已经安装了MRS的工具链(假设当前平台为Linux,工具链路径为"/path/to/toolchain/RISC-V Embedded GCC12",工具链相关前缀为"riscv-wch-elf-")
+# 第二步: 设置工具链路径,例如修改替换下方的set(TOOLCHAIN_FOLDER "/path/to/toolchain/RISC-V Embedded GCC12")
+# 第三步: 设置工具链中相关可执行文件的前缀,例如修改替换下方的set(TOOLCHAIN_PREFIX "riscv-wch-elf-")
+# 第四步: 执行 cd your/path/of/project
+# 第五步: 执行 cmake -B build -G "Unix Makefiles"
+# 第六步: 执行 cmake --build build
+# 注意: 在Windows平台运行,需要a.安装GNU MAKE并将其路径(bin目录)添加到系统环境变量,之后执行cmake -B build -G "Unix Makefiles"(推荐)
+#       或者b.安装MinGW,将其路径(bin目录)添加到系统环境变量,之后执行cmake -B build -G "MinGW Makefiles"
+# 如有相关疑问,可通过support@mounriver.com联系我们
+#################################################################################################################################################
+
+
+#############################################################[English Manual]###################################################################
+# Step 1: Confirm that the MRS toolchain has been installed on the machine. Assuming the current platform is Linux, 
+#         the toolchain path is "/path/to/toolchain/RISC-V Embedded GCC12", and the toolchain-related prefix is "riscv-wch-elf-"
+# Step 2: Set the toolchain path, for example, modify and replace the following "set (TOOLCHAIN_FOLDER "/path/to/toolchain/RISC-V Embedded GCC12")"
+# Step 3: Set the prefix of the executable files in the toolchain,for example, modify and replace the following "set(TOOLCHAIN_PREFIX "riscv-wch-elf-")"
+# Step 4: Call "cd your/path/of/project"
+# Step 5: Call "cmake -B build -G "Unix Makefiles""
+# Step 6: Call "cmake --build build"
+# Note:   To run on Windows, you need: a. Install GNU MAKE and add its path (the bin directory) to the system environment PATH. 
+#         Then call the execution of "cmake -B build -G "Unix Makefiles""(Recommanded).
+#         or b. Install MinGW and add its path (the bin directory) to the system environment PATH. 
+#         Then call the execution of "cmake -B build -G "MinGW Makefiles"".
+# If you have any questions, please contact us at support@mounriver.com
+#################################################################################################################################################
+
+
+# Set CMake minimum require
+cmake_minimum_required(VERSION 3.16)
+
+# Set CMake sysytem name
+set(CMAKE_SYSTEM_NAME Generic)
+
+
+# Skipping compiler detection and use custom toolchain
+SET(CMAKE_C_COMPILER_WORKS TRUE)
+SET(CMAKE_CXX_COMPILER_WORKS TRUE)
+SET(CMAKE_ASM_COMPILER_WORKS TRUE)
+
+# Use MRS toolchian to compile
+set(TOOLCHAIN_FOLDER "e:/MounRiver/MounRiver_Studio2/resources/app/resources/win32/components/WCH/Toolchain/RISC-V Embedded GCC12")
+set(TOOLCHAIN_PREFIX "riscv-wch-elf-")
+set(CMAKE_C_COMPILER "${TOOLCHAIN_FOLDER}/bin/riscv-wch-elf-gcc.exe")
+set(CMAKE_CXX_COMPILER "${TOOLCHAIN_FOLDER}/bin/riscv-wch-elf-g++.exe")
+set(CMAKE_ASM_COMPILER "${TOOLCHAIN_FOLDER}/bin/riscv-wch-elf-gcc.exe")
+set(CMAKE_OBJCOPY "${TOOLCHAIN_FOLDER}/bin/${TOOLCHAIN_PREFIX}objcopy.exe")
+set(CMAKE_OBJDUMP "${TOOLCHAIN_FOLDER}/bin/riscv-wch-elf-objdump.exe")
+set(CMAKE_SIZE "${TOOLCHAIN_FOLDER}/bin/${TOOLCHAIN_PREFIX}size.exe")
+set(CMAKE_AR "${TOOLCHAIN_FOLDER}/bin/${TOOLCHAIN_PREFIX}ar.exe")
+
+set(PROJECT_NAME "test2")
+set(TARGET_ARTIFACT "test2.elf")
+
+# mylib_c(灯棒动画/指令引擎)已抽成静态库,源码不再参与本工程编译。
+# 两个变体,用 -DMYLIB_VARIANT=<lite|full> 选:
+#   lite(默认)—— 精简版:基本模式 + 跳频相位同步 + colordb,无几何。
+#                 工程在 ../../mylib_c_lite_lib/,产出 lib/libmylib_c_lite.a
+#   full        —— 完整版:含 beat/simple_graphic/follow_path 与全部几何。
+#                 工程在 ../../mylib_c_lib/,产出 lib/libmylib_c.a
+#
+# ⚠ 切变体请用**新的 build 目录**(或删掉 build/ 重新 configure):
+#   旧的 CMakeCache.txt 里缓存着上一次的 MYLIB_C_LIB_DIR。
+set(MYLIB_VARIANT "lite" CACHE STRING "mylib_c 变体:lite(默认,无几何) 或 full")
+set_property(CACHE MYLIB_VARIANT PROPERTY STRINGS lite full)
+
+if(MYLIB_VARIANT STREQUAL "lite")
+    set(_mylib_proj    "mylib_c_lite_lib")
+    set(_mylib_libname "mylib_c_lite")
+    set(_mylib_hdr_root "I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../../mylib_c_lite_lib")
+elseif(MYLIB_VARIANT STREQUAL "full")
+    set(_mylib_proj    "mylib_c_lib")
+    set(_mylib_libname "mylib_c")
+    set(_mylib_hdr_root "I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/APP/mylib_c")
+else()
+    message(FATAL_ERROR "MYLIB_VARIANT must be 'lite' or 'full', got: '${MYLIB_VARIANT}'")
+endif()
+
+if(NOT DEFINED MYLIB_C_LIB_DIR)
+    set(MYLIB_C_LIB_DIR "I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../../${_mylib_proj}/lib")
+endif()
+
+if(NOT EXISTS "${MYLIB_C_LIB_DIR}/lib${_mylib_libname}.a")
+    message(FATAL_ERROR
+        "lib${_mylib_libname}.a not found in: ${MYLIB_C_LIB_DIR}\n"
+        "Build it first (variant '${MYLIB_VARIANT}'):\n"
+        "  cmake -S ../../${_mylib_proj} -B ../../${_mylib_proj}/build -G \"Unix Makefiles\"\n"
+        "  <make> -C ../../${_mylib_proj}/build -j8\n"
+        "Or point elsewhere with -DMYLIB_C_LIB_DIR=<dir containing lib${_mylib_libname}.a>")
+endif()
+
+set(CMAKE_C_OUTPUT_EXTENSION .o)
+set(CMAKE_CXX_OUTPUT_EXTENSION .o)
+
+project("${PROJECT_NAME}" LANGUAGES C ASM CXX)
+
+# Use relative path
+add_compile_options(-fmacro-prefix-map=${CMAKE_SOURCE_DIR}=..)
+
+
+set(SRC_FILES 
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../SRC/StdPeriphDriver/CH58x_adc.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../SRC/StdPeriphDriver/CH58x_clk.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../SRC/StdPeriphDriver/CH58x_flash.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../SRC/StdPeriphDriver/CH58x_gpio.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../SRC/StdPeriphDriver/CH58x_i2c.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../SRC/StdPeriphDriver/CH58x_lcd.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../SRC/StdPeriphDriver/CH58x_pwm.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../SRC/StdPeriphDriver/CH58x_pwr.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../SRC/StdPeriphDriver/CH58x_spi0.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../SRC/StdPeriphDriver/CH58x_spi1.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../SRC/StdPeriphDriver/CH58x_sys.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../SRC/StdPeriphDriver/CH58x_timer0.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../SRC/StdPeriphDriver/CH58x_timer1.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../SRC/StdPeriphDriver/CH58x_timer2.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../SRC/StdPeriphDriver/CH58x_timer3.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../SRC/StdPeriphDriver/CH58x_uart0.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../SRC/StdPeriphDriver/CH58x_uart1.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../SRC/StdPeriphDriver/CH58x_uart2.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../SRC/StdPeriphDriver/CH58x_uart3.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../SRC/StdPeriphDriver/CH58x_usbdev.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../SRC/StdPeriphDriver/CH58x_usbhostBase.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../SRC/StdPeriphDriver/CH58x_usbhostClass.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../SRC/Startup/startup_CH585.S"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/APP/ble/profile/devinfoservice.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/APP/ble/profile/gattprofile.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../LIB/ble_task_scheduler.S"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../HAL/MCU.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../HAL/RTC.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../HAL/SLEEP.c"
+# mylib_c/*.c 不再在此编译 —— 见 ../mylib_c_lib/ 静态库工程,链接 libmylib_c.a
+"${CMAKE_CURRENT_SOURCE_DIR}/APP/hw_config.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/APP/hal_irq.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/APP/src/ledx.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/APP/ble/peripheral.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/APP/src/RF_main.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/APP/src/RF_PHY.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/APP/src/rx_hop.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/APP/src/sir24drv.c"
+"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/APP/src/ukey.c"
+)
+set(CMAKE_C_FLAGS " -march=rv32imc_zba_zbb_zbc_zbs_xw -mabi=ilp32 -mcmodel=medany -msmall-data-limit=8 -mno-save-restore -fmax-errors=20 -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -fno-common --param=highcode-gen-section-name=1 -g -I\"${_mylib_hdr_root}/include\" -I\"${_mylib_hdr_root}\" -I\"${_mylib_hdr_root}/lwpkt/lwpkt/src/include\" -I\"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../SRC/Startup\" -I\"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/APP/include\" -I\"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/APP\" -I\"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/APP/ble\" -I\"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/APP/ble/profile/include\" -I\"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../SRC/StdPeriphDriver/inc\" -I\"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../HAL/include\" -I\"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../SRC/Ld\" -I\"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../LIB\" -I\"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../SRC/RVMSIS\" -DBLE_BUFF_MAX_LEN=512 -DMCU_ENVIRONMENT=1 -DUSE_MEMORY_POOL=1 -std=gnu99")
+set(CMAKE_CXX_FLAGS " -march=rv32imc_zba_zbb_zbc_zbs_xw -mabi=ilp32 -mcmodel=medany -msmall-data-limit=8 -mno-save-restore -fmax-errors=20 -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -fno-common --param=highcode-gen-section-name=1 -g -std=gnu++11 -fabi-version=0")
+set(CMAKE_ASM_FLAGS " -march=rv32imc_zba_zbb_zbc_zbs_xw -mabi=ilp32 -mcmodel=medany -msmall-data-limit=8 -mno-save-restore -fmax-errors=20 -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -fno-common --param=highcode-gen-section-name=1 -g -x assembler-with-cpp")
+
+add_executable("${TARGET_ARTIFACT}" ${SRC_FILES})
+
+set_target_properties("${TARGET_ARTIFACT}" PROPERTIES LINK_FLAGS " -march=rv32imc_zba_zbb_zbc_zbs_xw -mabi=ilp32 -mcmodel=medany -msmall-data-limit=8 -mno-save-restore -fmax-errors=20 -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -fno-common --param=highcode-gen-section-name=1 -g -T \"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../SRC/Ld/Link.ld\"  -L\"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0\" -L\"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../LIB\" -L\"I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/../SRC/StdPeriphDriver\" -L\"${MYLIB_C_LIB_DIR}\"  -nostartfiles -Xlinker --gc-sections -Xlinker --print-memory-usage -Wl,-Map,\"test2.map\" --specs=nano.specs --specs=nosys.specs -o \"lrg_mogai_dianchi-new-2-0813-tiaopin-tpl.elf\" ")
+
+target_link_libraries(
+"${TARGET_ARTIFACT}"
+ISP585
+CH58xBLE
+${_mylib_libname}
+m
+)
+
+add_custom_command(TARGET "${TARGET_ARTIFACT}" 
+POST_BUILD 
+COMMAND ${CMAKE_OBJCOPY} ARGS -O ihex  "test2.elf" "test2.hex"
+COMMAND ${CMAKE_OBJDUMP} ARGS  --source --all-headers --demangle -M xw --line-numbers --wide "test2.elf" > "test2.lst"
+COMMAND ${CMAKE_SIZE} ARGS  --format=berkeley "test2.elf"
+)
+
+
+# ---- App-specific source files ----
+target_sources("${TARGET_ARTIFACT}" PRIVATE
+    "${CMAKE_CURRENT_SOURCE_DIR}/APP/hw_config.c"
+)
+
+# ---- Mixed-compilation include paths ----
+# App headers first (override template), template APP/ as fallback
+set(CMAKE_C_FLAGS "-I\"${CMAKE_CURRENT_SOURCE_DIR}/APP/include\" -I\"${CMAKE_CURRENT_SOURCE_DIR}/APP\" -I\"${CMAKE_CURRENT_SOURCE_DIR}\" ${CMAKE_C_FLAGS}")
+target_include_directories("${TARGET_ARTIFACT}" PRIVATE
+    "I:/temp/lowenergyscanner/CH585EVTx0729/CH585EVTx/EVT/EXAM/BLE/lrg_mogai_dianchi-new-2-0813-tiaopin-tpl/v1.0.0/APP"
+)

+ 4 - 0
app.json

@@ -0,0 +1,4 @@
+{
+  "modules": {},
+  "platform": "ch585"
+}

+ 12 - 0
app_meta.json

@@ -0,0 +1,12 @@
+{
+  "name": "test2",
+  "platform": "ch585",
+  "created_at": "2026-09-09T19:49:06Z",
+  "updated_at": "2026-09-09T19:49:06Z",
+  "description": "d",
+  "tags": [
+    "d"
+  ],
+  "template_version": "1.0.0",
+  "template_name": "lrg_mogai_dianchi"
+}