mothercup/mcm-ddc-ble/docs/开发日志.md

85 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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` → `Source<TAB>asks.c`),
Keil 报 `cannot create command input file 'source tasks.__i'`;另外 `<FileName>` 必须写纯文件名
(带路径会被 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 互发透传。