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.
2. 串口无输出 → 确认波特率是否匹配(多数 nRF5 例程为 115200),并验证 UART 引脚(TX = P0.06, RX = P0.08)。
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 环境搭建流程图
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统一构建,减少手动配置。