1. BLE 开发环境搭建:工具链选择、SDK 配置、编译测试、烧录与串口调试

BLE 多设备同步系统的底层离不开稳定、高效的开发环境。本章围绕工具链选型、SDK 配置、编译验证、固件烧录和串口调试五个环节,完成一套可重复使用的 BLE 开发基座。所有操作均以 nRF52840 搭配 nRF5 SDK 17.1.0 + GCC ARM Embedded 10.3-2021.10 为例,并同时说明 ESP32(ESP-IDF)和 STM32WB(Zephyr)的替代方案,便于后续章节扩展至多平台。

1.1 工具链选择与对比

裸机 / RTOS 方案 工具链 编译系统 调试器 适用芯片
nRF5 SDK(Nordic) GCC ARM Embedded CMake + Make J-Link / DAPLink nRF51/52/53
ESP-IDF(乐鑫) xtensa-esp32-elf-gcc CMake + Ninja OpenOCD / ESP-PROG ESP32/ESP32-S3
Zephyr(多厂商) Zephyr SDK ARM GCC West + CMake J-Link / BlackMagic STM32WB, nRF52, etc.

推荐原则: 前期单一平台快速验证选择 nRF5 SDK;多平台异构同步场景选择 Zephyr;Wi-Fi + BLE 混合场景选择 ESP-IDF。

1.2 安装工具链(GCC ARM Embedded)

以 Linux(Ubuntu 22.04)为例,下载并解压至 /opt/gcc-arm,添加至 PATH:

wget https://developer.arm.com/-/media/Files/downloads/gnu-rm/10.3-2021.10/gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2
sudo tar xjf gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2 -C /opt/
export PATH="/opt/gcc-arm-none-eabi-10.3-2021.10/bin:$PATH"
echo 'export PATH="/opt/gcc-arm-none-eabi-10.3-2021.10/bin:$PATH"' >> ~/.bashrc

验证安装:

arm-none-eabi-gcc --version
arm-none-eabi-gcc (GNU Arm Embedded Toolchain 10.3-2021.10) 10.3.1 20210824 (release)

1.3 SDK 配置与项目结构

下载 nRF5 SDK 17.1.0 并解压,建议使用 软链接 保持路径简洁:

cd ~/ble_projects
ln -s /opt/nRF5_SDK_17.1.0_9b0a123 nrf5_sdk

典型项目目录结构(以 ble_app_uart 为例):

ble_app_uart/
├── CMakeLists.txt
├── main.c
├── sdk_config.h
├── pca10056/
│   └── s140/
│       └── armgcc/
│           ├── Makefile      # 或 CMakeLists.txt 子目录
│           └── ble_app_uart.ld
└── boards/

重要: SDK 内包含 SoftDevice(BLE 协议栈),Nordic 推荐将协议栈以预编译 hex 形式烧录。在 CMake 中需显式指定 SoftDevice 路径:

set(SOFTDEVICE_PATH "${SDK_ROOT}/components/softdevice/s140/hex/s140_nrf52_7.3.0_softdevice.hex")
set(APPLICATION_HEX "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${PROJECT_NAME}.hex")

add_custom_command(TARGET flash_softdevice POST_BUILD
  COMMAND ${CMAKE_COMMAND} -E echo "Flashing SoftDevice..."
  COMMAND nrfjprog --program ${SOFTDEVICE_PATH} --chiperase --reset
  COMMENT "SoftDevice programmed")

1.4 编译测试

使用 CMake + Ninja 快速构建(首次需配置 SDK 根目录和芯片型号):

mkdir build && cd build
cmake .. -G "Ninja" \
  -DSDK_ROOT=/home/user/ble_projects/nrf5_sdk \
  -DBOARD=pca10056 \
  -DSOFTDEVICE=s140
ninja

成功输出:

[100%] Linking C executable ble_app_uart.out
   text    data     bss     dec     hex filename
  52440    1228    2524   56192    db80 ble_app_uart.out
Generating hex file: ble_app_uart.hex

提示:使用 ninja -j4 并行编译可节省 60% 时间。若内存不足,降低并行数 -j2。

1.5 烧录与串口调试

烧录协议栈 + 应用程序(需已安装 nRF Command Line Tools):

# 擦除整片 Flash
nrfjprog --eraseall

# 烧录 SoftDevice
nrfjprog --program s140_nrf52_7.3.0_softdevice.hex --verify

# 烧录应用
nrfjprog --program ble_app_uart.hex --verify

# 复位
nrfjprog --reset

连接串口(默认 115200 8N1):

sudo minicom -D /dev/ttyACM0 -b 115200

日志输出示例:

UART started.
BLE stack initialized.
Advertising as "Nordic_UART".
Connection established: peer addr 00:11:22:33:44:55

常见错误:
1. nrfjprog: error: Could not connect to the debug probe. → 检查 USB 线是否支持数据,尝试重新插拔或安装 J-Link 驱动。
2. 串口无输出 → 确认波特率是否匹配(多数 nRF5 例程为 115200),并验证 UART 引脚(TX = P0.06, RX = P0.08)。

1.6 环境搭建流程图

BLE 开发环境搭建流程 ① 工具链安装 ② SDK 配置 ③ 编译测试 ④ 烧录固件 ⑤ 串口调试 失败返回修复 关键工具 GCC ARM Embedded nRF Command Line Tools Minicom / PuTTY

1.7 常见问题与优化建议

  • 烧录失败:检查 J-Link 驱动版本,避免与 nRFjprog 冲突。建议使用 nrfjprog --version 验证。
  • 串口乱码:确认晶振频率(nRF52840 默认 64 MHz),部分 SDK 例程使用 NRF_UARTE0 而非 NRF_UART0。
  • 编译效率:首次配置 CMake 后,后续修改 sdk_config.h 只需 ninja,增量编译小于 5 s。
  • 多平台移植:使用 Zephyr 时,通过 west build -b nrf52840dk_nrf52840 统一构建,减少手动配置。