# mcm-ddc-ble 开发日志 独立 BLE 工程:从 0x01000000 直接起跑(无 bootloader、无 OTA),用于在单镜像环境下 验证 BLE 功能与后续功能开发。 --- 日期:2026-09-02 ## 1. 工程创建(基于 SDK rdtss 例程) ### 1.1 选型 以 `nations-tec/N32WB03x_SDK_V2.0.0/projects/n32wb03x_EVAL/ble/rdtss` 为蓝本: BLE 原始数据透传服务(128-bit UUID,下行写 + 上行 notify),与 mcm-ddc-04 的自定义 GATT 透传服务(CLS)形态最接近,适合作为手机 APP 通信协议的载体。heart_rate 是标准 profile,不适合做数据通道。 ### 1.2 移植方式 - 整目录复制 `src/`、`inc/`、`MDK-ARM/` 到 `mcm-ddc-ble/`,工程改名 `mcm-ddc-ble`, 输出 `bin/mcm-ddc-ble.bin`。 - uvprojx/uvoptx 中 268+11 处 SDK 相对路径由 `..\..\..\..\..\` 重定向为 `..\..\nations-tec\N32WB03x_SDK_V2.0.0\`(新工程深度不同); 另有 11+3 处 `..\..\..\dfu\common` 指向 SDK 的 `projects/n32wb03x_EVAL/dfu/common`。 `nations-tec/` 只读,未做任何修改。 - 只使用第一个 target `N32WB03x`(IROM 0x01000000/0x40000);`OTA_IMG_1`/`OTA_IMG_2` 两个 target 未适配(其 after-build 脚本会写 SDK 目录),不要构建。 ### 1.3 引脚核对(重点:避开 SWD) - SWD 调试管脚:SWCLK=PA4 / SWDIO=PA5,全工程无任何占用。 - LED1=PB0、LED2=PA6(与 mcm-ddc-04、STB 板一致)。 - USART1 透传通道:TX=PB6 / RX=PB7(AF4,115200 8N1),与我们板子一致。 - 日志 LPUART:TX=PB1(NS_LOG)。 - `app_usart.h` 里的 PIN_4/PIN_5 是被注释掉的 USART2 备选(PB4/PB5),无影响。 ### 1.4 保 SWD:禁止睡眠 例程主循环会进 deep sleep,SWD 随之断开(readme 也提示需 RESET 时机烧录)。 在 `main.c` 主循环前调用 `ns_sleep_lock_acquire()` 永久锁睡眠,SWD 全程可调试; 代价是功耗偏高(仅调试阶段,后续做低功耗时再评估)。 ### 1.5 构建 `UV4 -b mcm-ddc-ble.uvprojx -t "N32WB03x"`:0 Error / 0 Warning, `Code=23340 RO-data=3352 RW-data=1876 ZI-data=6052`,bin 28224B。 --- 日期:2026-09-02 ## 2. 接入 FreeRTOS + 点灯任务 ### 2.1 内容 - 内核:SDK 自带 FreeRTOS V9(`middlewares/Third_Party/FreeRTOS`),工程新增 FREERTOS 组: `tasks/queue/list/timers.c` + `heap_4.c` + `port.c`(RVDS/ARM_CM0),只加进 `N32WB03x` target。 - `inc/FreeRTOSConfig.h`:从 mcm-ddc-04 移植,heap 缩为 **8KB**(本工程仅 3 个任务); SVC/PendSV/SysTick 由 port 接管(宏映射),本工程无 `n32wb03x_it.c`,无重复定义问题。 - `main.c` 任务化: - `ble_schedule_task`(512 字栈,优先级 2):`rwip_schedule()` + 1ms 延时, 替代裸机 while 循环(rwip 只允许单上下文运行)。 - `led_task`(128 字栈,优先级 1):LED1(PB0) 每 500ms 翻转做运行指示; LED2(PA6) 仍由 app_ble.c 驱动作连接状态指示。 - 睡眠保持锁定(deep sleep 与 RTOS tick 冲突,且保 SWD)。 - 串口透传路径为事件驱动(`usart_forward_to_ble_loop` 由 profile 回调触发、 `app_usart_tx_process` 由 BLE 消息处理触发),rwip_schedule 进任务后行为不变。 ### 2.2 踩坑记录 脚本往 uvprojx 写路径时 `\t` 被 Python 解释成制表符(`Source\tasks.c` → `Sourceasks.c`), Keil 报 `cannot create command input file 'source tasks.__i'`;另外 `` 必须写纯文件名 (带路径会被 Keil 当成对象名,同样报此错)。修正后全量重建通过。 ### 2.3 构建 0 Error / 0 Warning,`Code=24736 RO-data=3352 RW-data=1964 ZI-data=14484`; bin ≈ 27.4KB,RAM(RW+ZI)≈ 16.1KB / 48KB(含 8KB FreeRTOS heap)。 ### 2.4 上板预期 LED1 每 500ms 闪烁;手机可搜到并连接 `NS_RDTSS`,连接后 LED2 亮; 串口(PB6/PB7,115200)与手机 BLE 互发透传。