85 lines
3.8 KiB
Markdown
85 lines
3.8 KiB
Markdown
# 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 互发透传。
|