## 前言
评测计划任务 3 原文:"U3C5 和 B-WBA5M-WPAN 合体,使用 U3C5 的 ADC 采集数据,I2C 读取电源芯片的电压电流参数,通过 B-WBA5M-WPAN 完成上报。"
这是一个典型的"**采集 MCU + 无线 MCU**"分工架构:U3C5(超低功耗、模拟外设丰富)负责 ADC 采集和 I2C 读电源芯片,WBA5M(射频专精)负责 BLE 上报,两板之间用一条串口连接。本篇记录:两板怎么连、桥接固件怎么设计、协议怎么定、以及联调结果;最后给出整个系列的总结与评分。
---
## 一、双板"合体"的物理层:M.2 互联
### 1.1 架构总览
```┌───────────────────────┐ M.2 KEY-E ┌───────────────────────┐│ MB2222 载板 │ 金手指对插 │ MB2131 WBA 模块板 ││ STM32U3C5ZIT6Q │ ◄────────────────────► │ STM32WBA5MMG ││ · ADC 采集(用户外设) │ pin22 UART_TXD ────► │ · USART2_RX = PB2 ││ · I2C 读电源芯片(待接) │ pin32 UART_RXD ◄──── │ · USART2_TX = PB15 ││ · 板载 ST-LINK-V3EC │ pin59/60 I2C 预留 │ · BLE 上报 │└───────────────────────┘ └───────────────────────┘```
两板不是杜邦线乱接——**M.2 KEY-E 金手指本身就定义了 UART/I2C 等信号**。对照两张原理图(`mb2131`/`mb2222`)核对的关键映射:
| 信号 | MB2131(WBA 模块) | M.2 引脚 | MB2222(U3C5 载板) | 方向 ||---|---|---|---|---|| UART_TXD | **PB15 = USART2_TX**(AF3) | pin22 | 经焊桥 SB35+R34 → **PG12** | WBA → U3C5 || UART_RXD | **PB2 = USART2_RX**(AF3) | pin32 | 经焊桥 → XSPI_D3 网络(具体 U3C5 引脚以焊桥/CubeMX 为准) | U3C5 → WBA || I2C | 模块侧预留 | pin59/60 | U3C5 I2C1(PB6/PB7) | 预留 || 3V3 供电 | M2_3V3 | pin2/4 | 载板 3V3(1.3A LDO) | 载板 → 模块 |
【图3-1:两板对插照片 + M.2 金手指特写(待补)】
> **注意点**:MB2222 的 M.2 引脚到 U3C5 GPIO 之间是**焊桥+0R 电阻**的可配置布线,U3C5 侧最终引脚要按实际焊桥核对(pin22 已确认 → PG12)。串口参数统一 **115200-8N1、无流控、3.3V 电平**。> 没有载板时也可以用 USB-TTL 直接接 M.2 pin32 模拟 U3C5 发帧——联调不依赖第二块板。
### 1.2 MB2222 载板速览
| 资源 | 说明 ||---|---|| 主控 | STM32U3C5ZIT6Q(Cortex-M33,超低功耗 U3 系列) || 调试 | 板载 ST-LINK-V3EC(免外接调试器) || 扩展 | Arduino/Morpho 排针(ADC 采集口)、USB、按键/LED || M.2 插座 | KEY-E,XSPI/SPI/I2C/UART 全引到 U3C5 |
【图3-2:MB2222 载板资源特写(待补)】
---
## 二、桥接固件设计(WBA 侧 v3.0.0)
### 2.1 设计目标
- U3C5 发来的数据帧 → **BLE 特征 U3C5_DATA_C**(READ+NOTIFY)实时上报;- PC 经 BLE 写 **U3C5_CMD_C** → 字节**原样转发** U3C5(反向通道,为任务 4 铺路);- 不破坏官方例程:v3 = v2 的完整复制工程 + 一个独立新模块 `uart_bridge.c/h`,ST 原有逻辑零改动。
### 2.2 硬件通道选择
板卡原理图里 WBA 的 USART1(PA8/PB12)是 trace 调试口,必须保留;两板互联用的是 **USART2(PB15/PB2,AF3)**——这正是 MB2131 做 M.2 "女儿板模式"的预留设计。实现要点:
- 中断方式单字节接收(115200 下每字节 87µs,中断开销可忽略),比 DMA 环形缓冲简单一个数量级,评测阶段可审计性优先;- USART2 中断优先级设为 7,与 trace 的 USART1 同级,**不高于** BLE 关键中断。
### 2.3 帧协议(U3C5 → WBA)
无线链路对数据完整性敏感,协议上宁可笨一点也要稳:
```[0xA5][0x5A][type][len][payload×len][crc8]│ │ │ └── CRC8:多项式 0x07、初值 0x00,│ │ │ 覆盖 [type][len][payload];len ≤ 32│ │ └── 0x01 POWER:[mV u16][mA u16][mW u16][flags u8]│ │ 0x02 ADC :[ch u8][mV u16]│ │ 0x03 TEXT :ASCII(≤32B)│ └── 载荷长度└── 帧类型```
固件侧实现为一个**逐字节状态机**(SYNC→TYPE→LEN→PAYLOAD→CRC):
- CRC 错/长度超限 → 计数器 +1,回到找同步态(尾字节恰为 0xA5 时直接续找新帧头,背靠背帧不丢节拍);- 完整帧 → 写入**双缓冲的非活动侧**再交换指针,序接任务(`CFG_TASK_UART_RX_ID`)里再拷贝、更新 BLE 特征——ISR 与任务对同一缓冲的读写撕裂被结构性消除;- `ok/err` 帧计数在 trace 口(USART1 VCP)可观测,联调时一眼看出链路质量。
### 2.4 BLE 侧变化
在 v2 的服务上追加两个特征(`max_attr_record` 10 → 15):
| 特征 | UUID | 属性 | 行为 ||---|---|---|---|| U3C5_DATA_C | `0000cd00-…` | READ+NOTIFY(40B) | 每收到有效帧更新:[type][len][payload];CCCD 已订阅则自动通知 || U3C5_CMD_C | `0000ce00-…` | WRITE(20B) | 写入字节阻塞转发 USART2 TX(≤20B @115200 ≈1.7ms,可接受) |
构建结果:Release **0 errors / 0 warnings**,bin 226 KB。
---
## 三、U3C5 侧参考代码
U3C5 固件不在本 Cube 包内,我提供了可直接移植的参考发送模块(`BLE-TEST/u3c5_reference/u3c5_uart_sender.c`),核心就两个函数:
```ccrc8_07_byte() /* CRC8 逐字节迭代,边发边算 */u3c5_send_frame(type, payload, len) /* 组帧发送,≤32B 载荷 */
/* 用法示例:把电源芯片读数发出去 */uint8_t p[7] = { 0xE4,0x0C, /* 3300 mV (LE16) */ 0x96,0x00, /* 150 mA (LE16) */ 0xEF,0x01, /* 495 mW (LE16) */ 0x00 }; /* flags */u3c5_send_frame(0x01, p, 7); /* type=POWER */```
U3C5 工程里只需实现 `u3c5_uart_write()`(对应其 UART TX 引脚,115200-8N1),剩下的按评测计划把 ADC 采样值和 I2C 电源芯片读数(电压/电流/功率)填进 payload 即可。反向收到 WBA 转发的命令字节后,怎么解析由 U3C5 应用自定义——回显一个 TEXT 帧即可完成环回自测。
---
## 四、联调测试步骤与实测记录
| # | 步骤 | 预期 | 实测 ||---|---|---|---|| 1 | 两板对插(或 USB-TTL 接 pin32) | — | 【待补】 || 2 | 烧录 v3 固件,PC 连接 `WBA5M_xx` | 枚举出 U3C5_DATA_C / U3C5_CMD_C | 【待补】 || 3 | PC 写 U3C5_CMD_C `"PING"` | trace 口打印 `forwarded 4 byte(s) to U3C5` | 【待补】 || 4 | U3C5 发 POWER/ADC/TEXT 帧 | PC 收到三条解码通知 | 【待补】 || 5 | 故意发坏 CRC 帧 | trace 口 `CRC error (ok=x err=y)` 递增,PC 不收脏数据 | 【待补】 || 6 | 长时间连发(压力) | 帧计数 ok 持续增长、err≈0 | 【待补】 |
【图3-3:上位机收到 U3C5 POWER/ADC/TEXT 数据截图(待补)】
**预期输出示例**(上位机解码):
```U3C5 POWER 电压=3300mV 电流=150mA 功率=495mW flags=0x00U3C5 ADC 通道=3 1234mVU3C5 TEXT 'Hello from U3C5'```
---
## 五、任务 4 展望:双向固件更新
评测任务 4(选做)是"PC ↔ B-WBA5M ↔ U3C5 双向固件更新",本轮**未交付 OTA 固件**,原因和路线如下:
- **现状**:V1.9.0 包内 B-WBA5M-WPAN **没有现成 OTA 例程**——OTA 示例只有 NUCLEO-WBA55CG / WBA25CE / WBA65RI 版本,芯片与板卡不同,不能直接烧;- **路线**:把 `NUCLEO-WBA55CG/Applications/BLE/BLE_p2pServer_ota` 移植到本板,涉及 KMS 签名 + bootloader 应用 + user app 双分区,工作量与验证成本都不适合和任务 1~3 一起"盲改",更适合单独一轮做;- **已铺好的路**:本轮 v3 固件的 **U3C5_CMD_C → UART → U3C5** 反向通道,就是"WBA5M 更新 U3C5"(U3C5 侧 Bootloader 收流)的传输层;"PC 更新 WBA5M" 则走标准 BLE OTA(手机/PC 作 GATT 客户端)。
---
## 六、系列总结与评分
### 6.1 三篇回顾
| 任务 | 完成情况 | 交付物 ||---|---|---|| 1 LED 点灯 | ✅ 完成(第一篇) | v1 固件 + 独立 Makefile 工程 || 2 BLE 数据上报 | ✅ 完成(第二篇) | v2 固件(Sensor Hub + TEMP_MULTI_C)+ PC 上位机 || 3 双板合体上报 | ✅ 固件/协议/工具就绪(本篇) | v3 固件(UART 桥接 + 双向通道)+ U3C5 参考代码 || 4 双向 OTA | ⏸ 规划完成,未交付固件 | 移植路线已明确 |
所有固件(bin/hex/elf)、上位机、文档集中在仓库 `BLE-TEST/` 与 `EVAL-REPORT/`,构建复现命令见 `BLE-TEST/README.md`。
### 6.2 优缺点清单
**优点**
- **形态加分**:M.2 模块化设计是真亮点——BLE 能力像"无线网卡"一样插进任何载板,本系列的双板合体就是直接受益者;- **包齐文档全**:V1.9.0 包内例程(BLE/Thread/Zigbee)、BSP、原理图、Wiki 教程齐备,BLE_Sensor 例程开箱即用;- **工程规范**:USER CODE 区约定执行得好,二次开发可以放心与 CubeMX 共存;Trace 口(USART1 VCP)可观测性好,联调省心;- WBA5M 的 M.2 预留 UART/I2C 走线完整,"女儿板模式"不是摆设,实测接线即通。
**不足/槽点**
- **板载只有一个 LED**,裸板调试缺少状态指示(好在 M.2 上预留了 LED_1#/2#);- **CubeIDE 工程逐文件链接**,往例程里加文件不显式登记就链接失败,对新手不友好;- **无本板 OTA 例程**,任务 4 这类需求要从别的板移植,社区资料暂时偏少(新板可以理解);- MB2222 载板 M.2 信号走**焊桥+0R** 配置,U3C5 侧引脚要在 CubeMX 里核对焊桥后确认,上手有一道弯。
### 6.3 一句话总结
> **B-WBA5M-WPAN 把"蓝牙开发板"做成了"蓝牙模组"**:单板能学、合体能用,从点灯到自定义 GATT 到双板桥接一路走下来没有硬阻塞;如果你在做一个需要 BLE 上报的多板系统,这块 M.2 模块 + U3C5 载板的组合值得认真考虑。
评测计划任务 3 原文:"U3C5 和 B-WBA5M-WPAN 合体,使用 U3C5 的 ADC 采集数据,I2C 读取电源芯片的电压电流参数,通过 B-WBA5M-WPAN 完成上报。"
这是一个典型的"**采集 MCU + 无线 MCU**"分工架构:U3C5(超低功耗、模拟外设丰富)负责 ADC 采集和 I2C 读电源芯片,WBA5M(射频专精)负责 BLE 上报,两板之间用一条串口连接。本篇记录:两板怎么连、桥接固件怎么设计、协议怎么定、以及联调结果;最后给出整个系列的总结与评分。
---
## 一、双板"合体"的物理层:M.2 互联
### 1.1 架构总览
```┌───────────────────────┐ M.2 KEY-E ┌───────────────────────┐│ MB2222 载板 │ 金手指对插 │ MB2131 WBA 模块板 ││ STM32U3C5ZIT6Q │ ◄────────────────────► │ STM32WBA5MMG ││ · ADC 采集(用户外设) │ pin22 UART_TXD ────► │ · USART2_RX = PB2 ││ · I2C 读电源芯片(待接) │ pin32 UART_RXD ◄──── │ · USART2_TX = PB15 ││ · 板载 ST-LINK-V3EC │ pin59/60 I2C 预留 │ · BLE 上报 │└───────────────────────┘ └───────────────────────┘```
两板不是杜邦线乱接——**M.2 KEY-E 金手指本身就定义了 UART/I2C 等信号**。对照两张原理图(`mb2131`/`mb2222`)核对的关键映射:
| 信号 | MB2131(WBA 模块) | M.2 引脚 | MB2222(U3C5 载板) | 方向 ||---|---|---|---|---|| UART_TXD | **PB15 = USART2_TX**(AF3) | pin22 | 经焊桥 SB35+R34 → **PG12** | WBA → U3C5 || UART_RXD | **PB2 = USART2_RX**(AF3) | pin32 | 经焊桥 → XSPI_D3 网络(具体 U3C5 引脚以焊桥/CubeMX 为准) | U3C5 → WBA || I2C | 模块侧预留 | pin59/60 | U3C5 I2C1(PB6/PB7) | 预留 || 3V3 供电 | M2_3V3 | pin2/4 | 载板 3V3(1.3A LDO) | 载板 → 模块 |
【图3-1:两板对插照片 + M.2 金手指特写(待补)】
> **注意点**:MB2222 的 M.2 引脚到 U3C5 GPIO 之间是**焊桥+0R 电阻**的可配置布线,U3C5 侧最终引脚要按实际焊桥核对(pin22 已确认 → PG12)。串口参数统一 **115200-8N1、无流控、3.3V 电平**。> 没有载板时也可以用 USB-TTL 直接接 M.2 pin32 模拟 U3C5 发帧——联调不依赖第二块板。
### 1.2 MB2222 载板速览
| 资源 | 说明 ||---|---|| 主控 | STM32U3C5ZIT6Q(Cortex-M33,超低功耗 U3 系列) || 调试 | 板载 ST-LINK-V3EC(免外接调试器) || 扩展 | Arduino/Morpho 排针(ADC 采集口)、USB、按键/LED || M.2 插座 | KEY-E,XSPI/SPI/I2C/UART 全引到 U3C5 |
【图3-2:MB2222 载板资源特写(待补)】
---
## 二、桥接固件设计(WBA 侧 v3.0.0)
### 2.1 设计目标
- U3C5 发来的数据帧 → **BLE 特征 U3C5_DATA_C**(READ+NOTIFY)实时上报;- PC 经 BLE 写 **U3C5_CMD_C** → 字节**原样转发** U3C5(反向通道,为任务 4 铺路);- 不破坏官方例程:v3 = v2 的完整复制工程 + 一个独立新模块 `uart_bridge.c/h`,ST 原有逻辑零改动。
### 2.2 硬件通道选择
板卡原理图里 WBA 的 USART1(PA8/PB12)是 trace 调试口,必须保留;两板互联用的是 **USART2(PB15/PB2,AF3)**——这正是 MB2131 做 M.2 "女儿板模式"的预留设计。实现要点:
- 中断方式单字节接收(115200 下每字节 87µs,中断开销可忽略),比 DMA 环形缓冲简单一个数量级,评测阶段可审计性优先;- USART2 中断优先级设为 7,与 trace 的 USART1 同级,**不高于** BLE 关键中断。
### 2.3 帧协议(U3C5 → WBA)
无线链路对数据完整性敏感,协议上宁可笨一点也要稳:
```[0xA5][0x5A][type][len][payload×len][crc8]│ │ │ └── CRC8:多项式 0x07、初值 0x00,│ │ │ 覆盖 [type][len][payload];len ≤ 32│ │ └── 0x01 POWER:[mV u16][mA u16][mW u16][flags u8]│ │ 0x02 ADC :[ch u8][mV u16]│ │ 0x03 TEXT :ASCII(≤32B)│ └── 载荷长度└── 帧类型```
固件侧实现为一个**逐字节状态机**(SYNC→TYPE→LEN→PAYLOAD→CRC):
- CRC 错/长度超限 → 计数器 +1,回到找同步态(尾字节恰为 0xA5 时直接续找新帧头,背靠背帧不丢节拍);- 完整帧 → 写入**双缓冲的非活动侧**再交换指针,序接任务(`CFG_TASK_UART_RX_ID`)里再拷贝、更新 BLE 特征——ISR 与任务对同一缓冲的读写撕裂被结构性消除;- `ok/err` 帧计数在 trace 口(USART1 VCP)可观测,联调时一眼看出链路质量。
### 2.4 BLE 侧变化
在 v2 的服务上追加两个特征(`max_attr_record` 10 → 15):
| 特征 | UUID | 属性 | 行为 ||---|---|---|---|| U3C5_DATA_C | `0000cd00-…` | READ+NOTIFY(40B) | 每收到有效帧更新:[type][len][payload];CCCD 已订阅则自动通知 || U3C5_CMD_C | `0000ce00-…` | WRITE(20B) | 写入字节阻塞转发 USART2 TX(≤20B @115200 ≈1.7ms,可接受) |
构建结果:Release **0 errors / 0 warnings**,bin 226 KB。
---
## 三、U3C5 侧参考代码
U3C5 固件不在本 Cube 包内,我提供了可直接移植的参考发送模块(`BLE-TEST/u3c5_reference/u3c5_uart_sender.c`),核心就两个函数:
```ccrc8_07_byte() /* CRC8 逐字节迭代,边发边算 */u3c5_send_frame(type, payload, len) /* 组帧发送,≤32B 载荷 */
/* 用法示例:把电源芯片读数发出去 */uint8_t p[7] = { 0xE4,0x0C, /* 3300 mV (LE16) */ 0x96,0x00, /* 150 mA (LE16) */ 0xEF,0x01, /* 495 mW (LE16) */ 0x00 }; /* flags */u3c5_send_frame(0x01, p, 7); /* type=POWER */```
U3C5 工程里只需实现 `u3c5_uart_write()`(对应其 UART TX 引脚,115200-8N1),剩下的按评测计划把 ADC 采样值和 I2C 电源芯片读数(电压/电流/功率)填进 payload 即可。反向收到 WBA 转发的命令字节后,怎么解析由 U3C5 应用自定义——回显一个 TEXT 帧即可完成环回自测。
---
## 四、联调测试步骤与实测记录
| # | 步骤 | 预期 | 实测 ||---|---|---|---|| 1 | 两板对插(或 USB-TTL 接 pin32) | — | 【待补】 || 2 | 烧录 v3 固件,PC 连接 `WBA5M_xx` | 枚举出 U3C5_DATA_C / U3C5_CMD_C | 【待补】 || 3 | PC 写 U3C5_CMD_C `"PING"` | trace 口打印 `forwarded 4 byte(s) to U3C5` | 【待补】 || 4 | U3C5 发 POWER/ADC/TEXT 帧 | PC 收到三条解码通知 | 【待补】 || 5 | 故意发坏 CRC 帧 | trace 口 `CRC error (ok=x err=y)` 递增,PC 不收脏数据 | 【待补】 || 6 | 长时间连发(压力) | 帧计数 ok 持续增长、err≈0 | 【待补】 |
【图3-3:上位机收到 U3C5 POWER/ADC/TEXT 数据截图(待补)】
**预期输出示例**(上位机解码):
```U3C5 POWER 电压=3300mV 电流=150mA 功率=495mW flags=0x00U3C5 ADC 通道=3 1234mVU3C5 TEXT 'Hello from U3C5'```
---
## 五、任务 4 展望:双向固件更新
评测任务 4(选做)是"PC ↔ B-WBA5M ↔ U3C5 双向固件更新",本轮**未交付 OTA 固件**,原因和路线如下:
- **现状**:V1.9.0 包内 B-WBA5M-WPAN **没有现成 OTA 例程**——OTA 示例只有 NUCLEO-WBA55CG / WBA25CE / WBA65RI 版本,芯片与板卡不同,不能直接烧;- **路线**:把 `NUCLEO-WBA55CG/Applications/BLE/BLE_p2pServer_ota` 移植到本板,涉及 KMS 签名 + bootloader 应用 + user app 双分区,工作量与验证成本都不适合和任务 1~3 一起"盲改",更适合单独一轮做;- **已铺好的路**:本轮 v3 固件的 **U3C5_CMD_C → UART → U3C5** 反向通道,就是"WBA5M 更新 U3C5"(U3C5 侧 Bootloader 收流)的传输层;"PC 更新 WBA5M" 则走标准 BLE OTA(手机/PC 作 GATT 客户端)。
---
## 六、系列总结与评分
### 6.1 三篇回顾
| 任务 | 完成情况 | 交付物 ||---|---|---|| 1 LED 点灯 | ✅ 完成(第一篇) | v1 固件 + 独立 Makefile 工程 || 2 BLE 数据上报 | ✅ 完成(第二篇) | v2 固件(Sensor Hub + TEMP_MULTI_C)+ PC 上位机 || 3 双板合体上报 | ✅ 固件/协议/工具就绪(本篇) | v3 固件(UART 桥接 + 双向通道)+ U3C5 参考代码 || 4 双向 OTA | ⏸ 规划完成,未交付固件 | 移植路线已明确 |
所有固件(bin/hex/elf)、上位机、文档集中在仓库 `BLE-TEST/` 与 `EVAL-REPORT/`,构建复现命令见 `BLE-TEST/README.md`。
### 6.2 优缺点清单
**优点**
- **形态加分**:M.2 模块化设计是真亮点——BLE 能力像"无线网卡"一样插进任何载板,本系列的双板合体就是直接受益者;- **包齐文档全**:V1.9.0 包内例程(BLE/Thread/Zigbee)、BSP、原理图、Wiki 教程齐备,BLE_Sensor 例程开箱即用;- **工程规范**:USER CODE 区约定执行得好,二次开发可以放心与 CubeMX 共存;Trace 口(USART1 VCP)可观测性好,联调省心;- WBA5M 的 M.2 预留 UART/I2C 走线完整,"女儿板模式"不是摆设,实测接线即通。
**不足/槽点**
- **板载只有一个 LED**,裸板调试缺少状态指示(好在 M.2 上预留了 LED_1#/2#);- **CubeIDE 工程逐文件链接**,往例程里加文件不显式登记就链接失败,对新手不友好;- **无本板 OTA 例程**,任务 4 这类需求要从别的板移植,社区资料暂时偏少(新板可以理解);- MB2222 载板 M.2 信号走**焊桥+0R** 配置,U3C5 侧引脚要在 CubeMX 里核对焊桥后确认,上手有一道弯。
### 6.3 一句话总结
> **B-WBA5M-WPAN 把"蓝牙开发板"做成了"蓝牙模组"**:单板能学、合体能用,从点灯到自定义 GATT 到双板桥接一路走下来没有硬阻塞;如果你在做一个需要 BLE 上报的多板系统,这块 M.2 模块 + U3C5 载板的组合值得认真考虑。
我要赚赏金
