2. 开发环境搭建:SDK安装、工具链配置与第一个空工程
说实话,很多初学者一上来就急着写代码,结果卡在环境搭建上两三天。我见过太多人把时间浪费在「编译器报错找不到头文件」这种问题上。所以这一章,咱们把地基打牢。
我会以 nRF5 SDK 和 ESP-IDF 两条线并行讲解。你根据自己的硬件选一条走就行。两条路我都踩过坑,放心。
2.1 选哪个SDK?先看这张图
在动手之前,你得清楚这两个平台的核心差异。我画了张图,帮你快速建立全局认知。
我个人习惯是:做纯 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。
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 路径。这一步很多人漏掉,结果打开例程全是红叉。
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 没烧进去。
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 服务的代码了。
记住:环境搭建是门槛,跨过去之后,后面的路会越来越顺。