2. 开发环境搭建:SDK安装、工具链配置与第一个空工程

说实话,很多初学者一上来就急着写代码,结果卡在环境搭建上两三天。我见过太多人把时间浪费在「编译器报错找不到头文件」这种问题上。所以这一章,咱们把地基打牢。

我会以 nRF5 SDK 和 ESP-IDF 两条线并行讲解。你根据自己的硬件选一条走就行。两条路我都踩过坑,放心。

2.1 选哪个SDK?先看这张图

在动手之前,你得清楚这两个平台的核心差异。我画了张图,帮你快速建立全局认知。

nRF5 SDK vs ESP-IDF 开发环境对比 nRF5 SDK 芯片:nRF51 / nRF52 / nRF53 系列 Nordic 自家方案,BLE 协议栈集成度高 IDE:Segger Embedded Studio / Keil 我推荐 SES,免费且对 Nordic 支持最好 协议栈:SoftDevice(S132/S140) 独立二进制,与用户应用分开烧录 调试器:J-Link / nRF52-DK 板载调试器 稳定,支持 RTT 日志输出 适合:低功耗 BLE 产品、穿戴设备 ESP-IDF 芯片:ESP32 / ESP32-S3 / ESP32-C3 乐鑫方案,Wi-Fi + BLE 双模 IDE:VS Code + ESP-IDF 插件 命令行 + 图形化,CMake 构建系统 协议栈:Bluedroid / NimBLE 开源,可裁剪,NimBLE 更轻量 调试器:USB 串口 + JTAG(内置) 便宜,但 RTT 支持不如 J-Link 适合:IoT 网关、Wi-Fi + BLE 混合产品

我个人习惯是:做纯 BLE 低功耗产品用 nRF5 SDK,做需要 Wi-Fi 或算力强的项目用 ESP-IDF。你想想看,如果项目只需要蓝牙广播温湿度数据,拿 ESP32 去做就有点大材小用了。

2.2 nRF5 SDK 安装与工具链配置

2.2.1 下载 SDK 与 SoftDevice

去 Nordic 官网下载 nRF5 SDK 17.1.0(最新稳定版)。别追新,17.1.0 经过大量项目验证,很稳。

下载后解压,路径不要带中文和空格。我习惯放在 C:\nRF5_SDK_17.1.0 或 ~/nRF5_SDK_17.1.0。

注意:SDK 路径不要有空格!比如 Program Files (x86) 这种路径,编译时链接器会报一些莫名其妙的错误。我曾经因为这个折腾了一下午。

然后下载对应的 SoftDevice。nRF52832 用 S132,nRF52840 用 S140。SoftDevice 是一个独立的二进制文件,负责 BLE 协议栈底层。你的应用代码和它分开烧录。

2.2.2 安装编译器与 IDE

我推荐 Segger Embedded Studio (SES),免费,对 Nordic 芯片支持最好。去 Segger 官网下载安装即可。

安装完后,打开 SES,在 Tools → Options → Building 里设置 SDK 路径。这一步很多人漏掉,结果打开例程全是红叉。

小技巧:SES 自带的编译器是 GCC 变种,不需要额外装 ARM GCC。但如果你用 Keil,需要自己装 ARMCC 或 AC6。

2.2.3 编译第一个空工程

打开 SDK 目录下的 examples/ble_peripheral/ble_app_template。这个工程是个空壳,只初始化了 BLE 协议栈,没做任何业务逻辑。非常适合验证环境。

双击 pca10040/s132/ses/ble_app_template.emProject 打开工程。在 SES 里按 F7 编译。

如果一切顺利,你会看到:

Build completed successfully.
Output: _build/nrf52832_xxaa.hex

嗯,看到这行输出,说明你的工具链已经通了。

2.3 ESP-IDF 安装与工具链配置

2.3.1 安装 ESP-IDF

乐鑫官方提供了安装器,Windows 用户下载 ESP-IDF Tools Installer,一路 Next 就行。它会自动装好 Python、Git、CMake、交叉编译器。

Linux/Mac 用户用命令行:

git clone --recursive https://github.com/espressif/esp-idf.git
cd esp-idf
./install.sh

这个过程会下载工具链和 Python 包。网速慢的话,可能需要十几分钟。我建议用手机热点试试,有时候比公司网络快。

2.3.2 设置环境变量

每次打开终端,都需要运行:

source ~/esp/esp-idf/export.sh

我个人习惯把这行加到 .bashrc 或 .zshrc 里,省得每次手动敲。

验证安装:运行 idf.py --version,如果输出版本号,说明安装成功。

2.3.3 编译第一个空工程

ESP-IDF 自带了一个 hello_world 例程,咱们拿它开刀:

cp -r $IDF_PATH/examples/get-started/hello_world ./my_first_project
cd my_first_project
idf.py set-target esp32c3   # 根据你的芯片选择
idf.py menuconfig           # 可以暂时不配,直接默认
idf.py build

编译完成后,你会看到:

Project build complete. To flash, run:
idf.py -p PORT flash

把 ESP32 开发板插上,运行 idf.py -p /dev/ttyUSB0 flash(Windows 下是 COM 口),然后按板子上的复位键。用串口工具(比如 PuTTY)连上,应该能看到 Hello world! 每隔几秒打印一次。

2.4 下载与调试:两种平台的差异

操作 nRF5 SDK (SES) ESP-IDF (命令行)
编译 F7 idf.py build
下载 F5(调试模式)或 Tools → Flash idf.py -p PORT flash
日志输出 RTT Viewer / 串口 idf.py -p PORT monitor
断点调试 原生支持(J-Link) 需要 OpenOCD + 硬件 JTAG
烧录 SoftDevice 需要单独烧录 .hex 文件 协议栈已集成在固件中

这里有个坑:nRF5 SDK 的 SoftDevice 和用户应用是分开的。如果你只烧录了应用固件,没烧 SoftDevice,蓝牙是跑不起来的。我第一次用 nRF52832 时就犯了这错,折腾了半天才发现 SoftDevice 没烧进去。

我的习惯:用 nRF Connect 桌面版或手机 App 来验证蓝牙广播。如果设备能搜到广播包,说明 SoftDevice 和应用都跑起来了。

2.5 常见问题与避坑指南

  • 编译报错找不到头文件:检查 SDK 路径是否设置正确,路径里有没有空格。
  • 下载失败:nRF 用 J-Link 的话,检查驱动是否安装;ESP32 检查串口驱动(CP2102/CH340)。
  • 烧录后没反应:nRF 检查 SoftDevice 是否烧录;ESP32 检查是否按了复位键,或者 boot 模式是否正确。
  • 日志乱码:波特率没对上。nRF 串口默认 115200,ESP-IDF monitor 自动匹配。

我曾经在一个项目里,ESP32 死活连不上蓝牙。折腾了两天,最后发现是电源不稳定,供电不足导致射频模块工作异常。换了个 USB 口就好了。所以,遇到奇怪的问题,先检查电源。

2.6 本章小结

到这步,你的开发环境应该已经跑通了。nRF5 SDK 和 ESP-IDF 两条路,你至少有一条能编译下载成功。接下来,我们就可以真正开始写 GATT 服务的代码了。

记住:环境搭建是门槛,跨过去之后,后面的路会越来越顺。