wizard 2 weeks ago
commit
bfa8f10060
9 changed files with 1062 additions and 0 deletions
  1. 4 0
      .gitignore
  2. 373 0
      APP/hw_config.c
  3. 71 0
      APP/include/hw_config.h
  4. 63 0
      APP/include/pindef.h
  5. 95 0
      APP/include/pindef.json
  6. 262 0
      APP/include/project_config.h
  7. 178 0
      CMakeLists.txt
  8. 4 0
      app.json
  9. 12 0
      app_meta.json

+ 4 - 0
.gitignore

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

+ 373 - 0
APP/hw_config.c

@@ -0,0 +1,373 @@
+/*
+ * hw_config.c
+ *
+ *  可变化的硬件相关逻辑。
+ *  换 PCB / 改引脚 / 调启动流程 — 只改这个文件, ukey.c 状态机不动。
+ *
+ *  函数清单:
+ *    GPIOA_IRQHandler  — 按键 GPIO 中断
+ *    key_handle_short_press   — 按键短按次数 → 操作分发
+ *    power_enter_sleep      — 进入低功耗睡眠 / 关机
+ *    power_boot       — 上电开机硬件初始化
+ */
+
+#include "hw_config.h"
+#include "ledx.h"
+#include "RF_PHY.h"
+#include "pindef.h"
+#include "ble/peripheral.h"
+#include "sir24drv.h"
+#include "hop_config.h"   /* power_boot: HOP_POOL */
+#include "rx_hop.h"       /* power_boot: rx_hop_init */
+#include "ukey.h"         /* power_set_mode, g_power_mode, OPMODE_* */
+#include "hal_irq.h"      /* hal_irq_dispatch_gpio: ISR 统一 dispatch + 清标志 */
+
+
+BOOL g_power_woke_by_irq=FALSE;   /* hw_config.c::power_enter_sleep 中置位, 本文件 power_request_reset 清零 */
+/* g_power_need_reset 定义在 ukey.c,声明见 ukey.h */
+__HIGH_CODE
+__attribute__((noinline))
+ void power_request_reset(){
+     g_power_woke_by_irq=FALSE;
+
+     //不要有延时之类的重操作,这个方法可能会在中断中执行。
+     /* LED 引脚 */
+      hal_gpio_mode_cfg(LED_PIN, GPIO_ModeOut_PP_5mA);
+      hal_gpio_set_low(LED_PIN);
+
+      led_pwm_init();
+
+
+
+      /* 声音引脚: 浮空输入 */
+      hal_gpio_mode_cfg(SOUND_PIN, GPIO_ModeIN_PU);
+
+      /* 声音开关: 输出低 */
+      hal_gpio_mode_cfg(SOUND_SW, GPIO_ModeOut_PP_5mA);
+      hal_gpio_set_low(SOUND_SW);
+      
+ }
+/* ==================== GPIO 中断 ====================
+ * ISR 定义仍在 hw_config.c(startup 向量表强符号),但 dispatch/清标志交给
+ * hal_irq_dispatch_gpio()。原引脚专属逻辑(按键唤醒、sound_hold 装载)保留:
+ *   - dispatch 先读 IF → 入队 → 写 IF 清标志(RW1,整个端口全清)
+ *   - 之后的 hal_gpio_read 读的是引脚实时电平,与 IF 是否已清无关
+ *   - 原 ClearITFlagBit 那行已由 dispatch 内部清覆盖,此处不再重复写 */
+__INTERRUPT
+__HIGH_CODE
+void GPIOA_IRQHandler(void)
+{
+    hal_irq_dispatch_gpio(0);
+    /* SW_KEY 唤醒:标志已由 dispatch 清,唤醒判定走 g_power_woke_by_irq 主循环路径 */
+}
+
+#if (SOUND_TRIG_MODE == SOUND_TRIG_IRQ)
+/* 声控触发(中断方式):SOUND_PIN 下降沿 -> 装载保持计数,倒计时由 sound_poll() 消费 */
+__INTERRUPT
+__HIGH_CODE
+void GPIOB_IRQHandler(void)
+{
+    hal_irq_dispatch_gpio(1);
+    if (hal_gpio_read(SOUND_PIN) == 0) {
+        sound_hold = SOUND_ACTIVE_DURATION;
+    }
+}
+#endif
+
+
+/* ==================== 按键短按处理 ==================== */
+void key_handle_short_press(uint32_t key_release_tick)
+{
+    if (key_short_count > 0) {
+        if (RTC_GetCycle32k() - key_press_tick > KEY_SEQUENCE_TIMEOUT) {
+
+            if (key_short_count == 2) {
+                /* 双击: 预留(原为配对/BLE) */
+
+            } else if (key_short_count == 1 && POWER_CAN_GO_NORMAL()) {
+                /* 单按: 进入普通模式 */
+                power_set_mode(OPMODE_NORMAL);
+
+            } else if (key_short_count == 1 && g_power_mode == OPMODE_NORMAL) {
+                /* 普通模式下单按: 切换闪烁模式 */
+                if (g_rf_is_on) {
+                    key_short_count = 0;
+                    return;
+                }
+                eco_reset();
+                led_set_next_mode();
+            }
+            key_short_count = 0;
+        }
+    }
+}
+
+
+/* ==================== 进入睡眠 / 关机 ==================== */
+void power_enter_sleep(void)
+{
+    RF2401_Shutdown();
+    g_power_idle_count = 0;
+    led_set_brightness(0);
+
+    /* 按键唤醒: 走订阅层。hal_irq_subscribe 配下降沿 + INT_EN + 使能 GPIO_A NVIC,
+     * 且把 SW_KEY 记入 _hal_irq_dispatch_mask[0], 不会被其它 PA 引脚的退订误关。 */
+    hal_gpio_mode_cfg(SW_KEY, GPIO_ModeIN_PU);
+    hal_irq_subscribe(HAL_IRQ_GPIO, SW_KEY, HAL_IRQ_EDGE_FALL);
+
+    hal_gpio_mode_cfg(SOUND_PIN, GPIO_ModeIN_PU);
+    /* 声音开关: 上拉关断 */
+    hal_gpio_mode_cfg(SOUND_SW, GPIO_ModeOut_PP_5mA);
+    hal_gpio_set_high(SOUND_SW);
+
+    /* 关掉声音检测引脚的唤醒使能: disarm SOUND 中断 (清 INT_EN 位 + 清残留 IF)。
+     * SOUND 在 PB, SW_KEY 在 PA, 故 GPIO_B NVIC 可随退订关闭, GPIO_A 仍武装按键唤醒。
+     * hal_irq_unsubscribe 不清 INT_MODE 位, 但 INT_EN 已清则该 pin 不再触发, 等价。 */
+    hal_irq_unsubscribe(HAL_IRQ_GPIO, SOUND_PIN);
+
+    /* LED 引脚设为输出低 */
+    hal_gpio_mode_cfg(LED_PIN, GPIO_ModeOut_PP_5mA);
+    hal_gpio_set_low(LED_PIN);
+
+    /* GPIO_A NVIC 已由上面 hal_irq_subscribe(SW_KEY) 使能, 无需再裸调 PFIC_EnableIRQ。 */
+
+    PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay);
+    DelayMs(50);
+
+    /* 标记: 本次由中断唤醒 (若 RTC 唤醒则此标志未被设置, 说明中断失效, 人工唤醒) */
+    g_power_woke_by_irq = TRUE;
+    DelayMs(100);
+
+    LowPower_Shutdown(0);
+    HSECFG_Current(HSE_RCur_100);
+    g_power_need_reset = TRUE;
+}
+
+
+/* ==================== 开机初始化 ==================== */
+void power_boot(void)
+{
+
+
+    /* 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_short_count = 0;
+    g_power_idle_count   = 0;
+
+    /* 开机防抖计时:上电后 STRATUP_GUARD_MS 内长按不触发关机 */
+    g_power_boot_tick = RTC_GetCycle32k();
+       /* 进入普通模式 */
+     power_set_mode(OPMODE_NORMAL);
+
+    eco_reset();
+}
+
+/* ==================== 节能亮度曲线 ==================== */
+/* 每阶段从 pwm_start 线性过渡到 pwm_end, 持续 sec 秒。
+ * is_loop=1 的阶段构成循环体; loop_max_sec 限制循环总时长。
+ * 修改此表即可调整节能策略, 无需改动 ledx.c 逻辑。 */
+
+/* 节能曲线数据由 pindef.h::MLED_ECO_PLAN_DATA 提供 (便于按设备/PCB 调整)。
+ * ECO_PLAN_LEN 用 sizeof 自动计算, 改数据无需手动同步长度。 */
+struct eco_s eco_plan[] = {
+    MLED_ECO_PLAN_DATA
+};
+#define ECO_PLAN_LEN  (sizeof(eco_plan) / sizeof(eco_plan[0]))
+
+/* ---- 节能状态机 ---- */
+volatile uint8_t  eco_idx      = 0;
+volatile uint16_t eco_sec      = 0;
+volatile uint16_t eco_loop_sec = 0;
+
+void eco_reset(void)
+{
+    eco_idx      = 0;
+    eco_sec      = 0;
+    eco_loop_sec = 0;
+    g_led_pwm_echo = eco_plan[0].pwm_start;
+}
+
+uint8_t eco_advance(void)
+{
+    led_pwm_apply_brightness(g_led_brightness);
+
+    struct eco_s *cur = &eco_plan[eco_idx];
+    eco_sec++;
+    g_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;
+                g_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++;
+        }
+        g_led_pwm_echo = eco_plan[eco_idx].pwm_start;
+    }
+
+    return 2;
+}
+
+
+/* ==================== 声音检测 ==================== */
+
+/* 相邻两次采样的最小间隔(RTC tick),小于此值不重复判定。
+ * 轮询与中断两种方式共用此节拍:轮询用它决定采样节奏,中断用它决定
+ * sound_hold 倒计时节奏,故两种方式的点灯时长一致。 */
+#define SOUND_SAMPLE_INTERVAL   MS_TO_RTC(SOUND_CHECK_INTERVAL_MS)
+
+/* 触发方式由 project_config.h 的 SOUND_TRIG_MODE 二选一(见该文件第 6 节):
+ *   SOUND_TRIG_POLL  轮询采样 GPIO + 去抖,稳定低电平即触发
+ *   SOUND_TRIG_IRQ   GPIOB 下降沿中断,ISR 直接装载 sound_hold
+ * 两种方式共用下面的 sound_hold 倒计时与点灯逻辑。 */
+
+#if (SOUND_TRIG_MODE == SOUND_TRIG_POLL)
+/* 轮询触发(默认):原 sound_poll() 逻辑原样保留 */
+static uint8_t sound_poll_gpio(void)
+{
+    uint32_t current_time = RTC_GetCycle32k();
+
+    /* 无符号差值天然处理 32 位回绕(与旧写的显式分支等价) */
+    uint32_t time_diff = current_time - sound_last_tick;
+
+    if (time_diff > SOUND_SAMPLE_INTERVAL) {
+        sound_last_tick = current_time;
+
+        /* 读取 GPIO 并去抖动 */
+        uint8_t current_gpio_state = (hal_gpio_read(SOUND_PIN) == 0) ? 0 : 1;
+
+        if (current_gpio_state != sound_last_level) {
+            sound_debounce = 0;
+        } else {
+            if (sound_debounce < SOUND_DEBOUNCE_COUNT) {
+                sound_debounce++;
+            }
+        }
+        sound_last_level = current_gpio_state;
+
+        /* 去抖动稳定后判定声音 */
+        if (sound_debounce >= SOUND_DEBOUNCE_COUNT) {
+            if (current_gpio_state == 0) {
+                sound_hold = SOUND_ACTIVE_DURATION;
+                led_set_brightness(255);
+                return 1;
+            }
+        }
+
+        /* 声音后保持亮度倒计时 */
+        if (sound_hold > 0) {
+            sound_hold--;
+            if (sound_hold > 0) {
+                led_set_brightness(255);
+                return 1;
+            }
+        }
+        led_set_brightness(0);
+        return 2;
+    }
+
+    return 0;
+}
+#else
+/* 中断触发:sound_hold 由 GPIOB_IRQHandler 在下降沿装载,这里只做固定节拍倒计时 */
+static uint8_t sound_poll_irq(void)
+{
+    uint32_t current_time = RTC_GetCycle32k();
+    uint32_t time_diff = current_time - sound_last_tick;
+
+    if (time_diff > SOUND_SAMPLE_INTERVAL) {
+        sound_last_tick = current_time;
+
+        if (sound_hold > 0) {
+            sound_hold--;
+            led_set_brightness(255);
+            return 1;
+        }
+        led_set_brightness(0);
+        return 2;
+    }
+
+    return 0;
+}
+#endif
+
+/* 声控入口:led_glow_tick() 每主循环调用,按 SOUND_TRIG_MODE 派发 */
+uint8_t sound_poll(void)
+{
+#if (SOUND_TRIG_MODE == SOUND_TRIG_IRQ)
+    return sound_poll_irq();
+#else
+    return sound_poll_gpio();
+#endif
+}
+
+
+/* ---- 进入/退出声控模式(led_set_mode 调用) ----
+ * 进入:配置 SOUND_PIN 为上拉输入。
+ *       IRQ 方式: hal_irq_subscribe 订阅下降沿 (配 INT_MODE + 使能 INT_EN/NVIC)。
+ *       POLL 方式: 不触碰 NVIC (主循环 sound_poll_gpio 轮询引脚电平)。
+ * 退出: IRQ 方式 hal_irq_unsubscribe 退订 (disarm + 无其它订阅者时关 NVIC);
+ *       POLL 方式无操作。 */
+void sound_detect_start(void)
+{
+    hal_gpio_mode_cfg(SOUND_PIN, GPIO_ModeIN_PU);
+#if (SOUND_TRIG_MODE == SOUND_TRIG_IRQ)
+    /* IRQ 方式: 走统一订阅层。hal_irq_subscribe 配置下降沿 + 使能 GPIO_B NVIC,
+     * 且把 SOUND_PIN 记入 _hal_irq_dispatch_mask[1], 退订时据其判断是否关 NVIC。 */
+    hal_irq_subscribe(HAL_IRQ_GPIO, SOUND_PIN, HAL_IRQ_EDGE_FALL);
+#endif
+    /* POLL 方式: SOUND 走主循环轮询, 不触碰 GPIO_B NVIC (初始化时已关, 见 RF_main.c) */
+}
+
+void sound_detect_stop(void)
+{
+#if (SOUND_TRIG_MODE == SOUND_TRIG_IRQ)
+    /* 退订: disarm SOUND 中断 (清 INT_EN + IF); 该端口无其它订阅者时自动关 NVIC */
+    hal_irq_unsubscribe(HAL_IRQ_GPIO, SOUND_PIN);
+#endif
+    /* POLL 方式: 无需操作 (未订阅即无 NVIC/INT_EN 可退) */
+}

+ 71 - 0
APP/include/hw_config.h

@@ -0,0 +1,71 @@
+/*
+ * hw_config.h
+ *
+ *  可变化的硬件相关逻辑: GPIO 中断、睡眠/唤醒时序、开机初始化、
+ *  节能曲线表、声音检测。
+ *  换 PCB / 改引脚 / 调启动流程时只需修改 hw_config.c 即可,
+ *  ukey.c 和 ledx.c 的纯逻辑代码不动。
+ */
+
+#ifndef HW_CONFIG_H
+#define HW_CONFIG_H
+
+#include "CH58x_common.h"
+
+/* ---- 节能亮度曲线 ----
+ * 定义在 hw_config.c 的 eco_plan[],由 eco_advance()/eco_reset() 消费。
+ * 本结构此前放在 ledx.h,导致 hw_config.c 必须包含 ledx.h 才能引用它;
+ * 移到此处后 hw_config.h 自足,ledx.h <-> hw_config.h 的循环包含被断开。 */
+struct eco_s {
+    uint16_t pwm_start;      /* 阶段起始 PWM (1/100 单位) */
+    uint16_t sec;            /* 阶段持续时间 (秒) */
+    uint16_t pwm_end;        /* 阶段结束 PWM */
+    uint8_t  is_loop;        /* 1=循环体 (结束后跳回循环体起点) */
+    uint16_t loop_max_sec;   /* 循环体总时长上限 (秒), 0=无限 */
+};
+extern struct eco_s eco_plan[];
+
+
+
+
+/* ---- 按键/电源状态(定义在 ukey.c) ---- */
+extern uint8_t  key_short_count;   /* 短按计数,key_handle_short_press 消费 */
+extern uint32_t key_press_tick;      /* 本次按下时刻 */
+extern uint16_t g_power_idle_count;     /* 掉电态空闲计数 */
+extern uint32_t g_power_boot_tick;      /* 开机时刻,用于防抖判定 */
+extern BOOL     g_power_woke_by_irq;      /* 本次唤醒是否来自 GPIO 中断 */
+extern BOOL     g_power_need_reset;          /* 上电复位请求,key_poll 消费后清零 */
+
+/* ---- 其他模块变量 ---- */
+extern BOOL g_rf_is_on;          /* RF_PHY.c */
+extern BOOL IS_RF_INITED;    /* RF_main.c  */
+
+
+/* eco_plan[] 定义在 hw_config.c, 阶段数 ECO_PLAN_LEN 由 sizeof 自动计算 (仅 hw_config.c 内部用)。
+ * 数据由 pindef.h::MLED_ECO_PLAN_DATA 提供, 改数据无需手动同步长度。 */
+
+/* ---- 节能状态机 (定义在 hw_config.c) ---- */
+extern volatile uint8_t  eco_idx;
+extern volatile uint16_t eco_sec;
+extern volatile uint16_t eco_loop_sec;
+
+void eco_reset(void);
+uint8_t eco_advance(void);
+
+/* ---- 声音检测 (原 ledx.c static 变量去 static) ---- */
+extern uint32_t           sound_last_tick;
+extern volatile uint16_t  sound_hold;
+extern uint8_t            sound_debounce;
+extern uint8_t            sound_last_level;
+
+/* ---- 函数声明 ---- */
+__INTERRUPT __HIGH_CODE void GPIOA_IRQHandler(void);
+__INTERRUPT __HIGH_CODE void GPIOB_IRQHandler(void);
+void                        key_handle_short_press(uint32_t key_release_tick);
+void                        power_enter_sleep(void);
+void                        power_boot(void);
+uint8_t                     sound_poll(void);
+void                        sound_detect_start(void);
+void                        sound_detect_stop(void);
+
+#endif /* HW_CONFIG_H */

+ 63 - 0
APP/include/pindef.h

@@ -0,0 +1,63 @@
+/* pindef.h — 由 pindef.json 生成 (html_tools/pindef 编辑器)。勿手改, 改 pindef.json 后重新生成。
+ * 引脚定义为 hal_pin_t 单值 (PA()/PB(), 见 hal_gpio_port.h)。 */
+
+#ifndef INCLUDE_PINDEF_H_
+#define INCLUDE_PINDEF_H_
+
+#include "CH58x_common.h"
+#include "hal_gpio_port.h"   /* PA()/PB()/hal_pin_t */
+
+/* GPIOB 辅助宏 (SDK 只提供 GPIOB_PinOutput/Input) */
+#define GPIOB_PinOutput(pin)      (R32_PB_DIR    |= pin)
+#define GPIOB_PinInput(pin)       (R32_PB_DIR    &= ~pin)
+
+/* 引脚定义 (hal_pin_t) */
+#define LED_PIN    PB(GPIO_Pin_14)   // PB14
+#define LED_SW     PB(GPIO_Pin_11)   // PB11 (LED开关 - 备用)
+#define SOUND_PIN  PB(GPIO_Pin_9)   // PB9
+#define SOUND_SW   PA(GPIO_Pin_10)   // PA10
+#define SW_KEY     PA(GPIO_Pin_4)   // PA4
+#define ZZZ        PB(GPIO_Pin_12)
+
+/* PWM 通道 */
+#define PWM_LED_CHANNEL  CH_PWM10
+
+/* 按键检测位 (从 SW_KEY 派生, 原始寄存器快速读, 不走 hal_gpio 抽象) */
+#define KEY10_BV  BV(4)
+#define KEY10_IN  (ACTIVE_LOW(R32_PA_PIN & KEY10_BV))
+
+/* ==================== RF 构建变体 ====================
+ * SI24R1 5字节通信地址 + 信道。build 脚本按设备重写 (通过 -D 覆盖, #ifndef 守卫)。
+ * 【重要】中控与从机两端必须完全一致, 否则无法通信。修改后两端同步重新编译部署。 */
+#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
+
+/* ==================== 跳频信道池 ====================
+ * 跳频信道池: 避开 WiFi ch1/6/11/13。
+ * 用法: static const uint8_t pool[HOP_POOL_SIZE] = HOP_POOL;
+ * HOP_POOL_SIZE 自动 = 元素数 (生成器计算, 无需手工同步)。 */
+#ifndef HOP_POOL
+#define HOP_POOL            {16,84,98,112}
+#endif
+#ifndef HOP_POOL_SIZE
+#define HOP_POOL_SIZE       4       /* 自动 = HOP_POOL 元素数 */
+#endif
+
+/* LED 节能亮度曲线数据 (struct eco_s 聚合初始化值, 见 hw_config.h)。
+ * 字段顺序: { pwm_start, sec, pwm_end, is_loop, loop_max_sec }
+ * pwm 单位 1/100 (10000=满亮度), sec 单位秒。
+ * 展开为 hw_config.c: struct eco_s eco_plan[] = { MLED_ECO_PLAN_DATA };
+ * 阶段数由 hw_config.c 用 sizeof 自动计算, 无需手动维护 ECO_PLAN_LEN。 */
+#define MLED_ECO_PLAN_DATA \
+    { 6500, 300, 6000, 0, 0 }, \
+    { 6000, 1200, 6000, 0, 0 }, \
+    { 6000, 300, 5500, 0, 0 }, \
+    { 5500, 600, 5500, 0, 0 }, \
+    { 5500, 600, 5000, 0, 0 }, \
+    { 5000, 60, 5000, 0, 0 }
+
+#endif /* INCLUDE_PINDEF_H_ */

+ 95 - 0
APP/include/pindef.json

@@ -0,0 +1,95 @@
+{
+  "pins": [
+    {
+      "name": "LED_PIN",
+      "port": "B",
+      "pin": 14,
+      "comment": "PB14"
+    },
+    {
+      "name": "LED_SW",
+      "port": "B",
+      "pin": 11,
+      "comment": "PB11 (LED开关 - 备用)"
+    },
+    {
+      "name": "SOUND_PIN",
+      "port": "B",
+      "pin": 9,
+      "comment": "PB9"
+    },
+    {
+      "name": "SOUND_SW",
+      "port": "A",
+      "pin": 10,
+      "comment": "PA10"
+    },
+    {
+      "name": "SW_KEY",
+      "port": "A",
+      "pin": 4,
+      "comment": "PA4"
+    },
+    {
+      "name": "ZZZ",
+      "port": "B",
+      "pin": 12,
+      "comment": ""
+    }
+  ],
+  "pwm_channel": "CH_PWM10",
+  "rf": {
+    "init_addr": "0x34,0x43,0x10,0x10,0x02",
+    "channel": 16
+  },
+  "hop_pool": [
+    16,
+    84,
+    98,
+    112
+  ],
+  "eco_plan": [
+    {
+      "pwm_start": 6500,
+      "sec": 300,
+      "pwm_end": 6000,
+      "is_loop": false,
+      "loop_max_sec": 0
+    },
+    {
+      "pwm_start": 6000,
+      "sec": 1200,
+      "pwm_end": 6000,
+      "is_loop": false,
+      "loop_max_sec": 0
+    },
+    {
+      "pwm_start": 6000,
+      "sec": 300,
+      "pwm_end": 5500,
+      "is_loop": false,
+      "loop_max_sec": 0
+    },
+    {
+      "pwm_start": 5500,
+      "sec": 600,
+      "pwm_end": 5500,
+      "is_loop": false,
+      "loop_max_sec": 0
+    },
+    {
+      "pwm_start": 5500,
+      "sec": 600,
+      "pwm_end": 5000,
+      "is_loop": false,
+      "loop_max_sec": 0
+    },
+    {
+      "pwm_start": 5000,
+      "sec": 60,
+      "pwm_end": 5000,
+      "is_loop": false,
+      "loop_max_sec": 0
+    }
+  ]
+}

File diff suppressed because it is too large
+ 262 - 0
APP/include/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 "zzztest6copy")
+set(TARGET_ARTIFACT "zzztest6copy.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,\"zzztest6copy.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  "zzztest6copy.elf" "zzztest6copy.hex"
+COMMAND ${CMAKE_OBJDUMP} ARGS  --source --all-headers --demangle -M xw --line-numbers --wide "zzztest6copy.elf" > "zzztest6copy.lst"
+COMMAND ${CMAKE_SIZE} ARGS  --format=berkeley "zzztest6copy.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": "zzztest6copy",
+  "platform": "ch585",
+  "created_at": "2026-09-20T14:27:15Z",
+  "updated_at": "2026-09-20T14:27:15Z",
+  "description": "111",
+  "tags": [
+    "11"
+  ],
+  "template_version": "1.0.0",
+  "template_name": "lrg_mogai_dianchi"
+}

Some files were not shown because too many files changed in this diff