第四章:开发环境搭建——Keil/IAR/VS Code + GCC工具链配置、SDK获取与安装、第一个Hello World程序
好,咱们正式开始动手了。这一章我带你搭环境。
说实话,做蓝牙开发这么多年,我见过太多人在环境搭建上栽跟头。有的折腾两天装不上编译器,有的SDK路径带中文导致编译报错。嗯,咱们今天就把这事一次性理清楚。
4.1 工具链的选择:Keil、IAR还是VS Code + GCC?
先说说这三个主流方案的区别。我个人习惯是:项目初期用Keil或IAR快速验证,后期调试用VS Code + GCC。为什么?你想想看,Keil和IAR的调试器集成度高,点一下就能下载跑起来,适合新手。但到了后期要改链接脚本、要定制编译选项,GCC的灵活性就体现出来了。
| 工具链 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Keil MDK | 调试器集成好,上手快 | 收费,代码量大了编译慢 | 小项目、快速原型 |
| IAR EWARM | 编译优化强,代码密度高 | 界面老旧,License贵 | 量产项目、对代码大小敏感 |
| VS Code + GCC | 免费,插件生态丰富 | 需要手动配置,调试器设置麻烦 | 开源项目、Linux开发 |
我在项目中遇到过用IAR编译出来的固件比Keil小15%的情况,但Keil的调试体验确实更友好。所以别纠结,选你手头有的工具就行。
4.2 SDK获取与安装——别踩这些坑
拿到开发板后,第一件事就是去芯片厂商官网下载SDK。以Nordic nRF5 SDK为例,我建议你下载完整版,别只下那个"lite"版本。为什么?因为完整版里包含了所有例程、文档和协议栈镜像,你后面调试蓝牙协议栈时,这些文件一个都少不了。
- SDK路径不要有中文和空格!比如
D:\项目\nRF5_SDK_17.1.0这种路径,GCC编译时会报路径解析错误。 - 安装路径不要太深。我见过有人把SDK放在
C:\Users\张三\Documents\Projects\Bluetooth\SDK\v17,结果编译时路径超长报错。 - 建议统一放在
C:\nRF5_SDK\或D:\SDK\这种短路径下。
安装步骤其实很简单:解压SDK压缩包到指定目录,然后设置环境变量。我个人习惯在系统环境变量里加一个 NRF5_SDK_ROOT,指向SDK根目录。这样后面所有工程都能引用这个变量,换版本时改一个地方就行。
4.3 Keil环境配置——三步搞定
Keil的配置其实不复杂,但有几个关键点要注意。
- 安装Device Pack:打开Keil,点击
Pack Installer,搜索你的芯片型号(比如nRF52840),安装对应的Device Family Pack。这一步漏了的话,编译时会报"找不到芯片定义"。 - 配置Flash烧录算法:在工程选项的
Debug标签页里,选择你的调试器(J-Link或DAP-Link),然后在Flash Download里添加对应的Flash算法文件。我刚开始做时忘了这步,每次下载都提示"Flash Timeout"。 - 设置RAM和Flash地址:蓝牙协议栈会占用一部分RAM和Flash,所以你的应用程序地址要往后偏移。具体偏移量看SDK文档,一般在
nrf52840_xxaa.icf或.sct文件里定义。
examples\ble_peripheral\ble_app_uart\pca10056\s140\arm5_no_packs 下的工程文件。这个工程已经配置好了所有东西,你直接编译就能跑。
4.4 VS Code + GCC配置——自由但需要耐心
说实话,VS Code + GCC的配置比Keil麻烦不少,但一旦配好,后面就一劳永逸了。我现在的主力开发环境就是这套。
你需要安装以下工具:
- GCC ARM Embedded:从ARM官网下载,安装后把
bin目录加到PATH里。 - CMake:用于生成构建系统。nRF5 SDK从17.0.0开始官方支持CMake。
- VS Code插件:C/C++、Cortex-Debug、CMake Tools这三个必装。
配置步骤大致如下:
# 1. 验证GCC是否安装成功
arm-none-eabi-gcc --version
# 2. 克隆nRF5 SDK的CMake支持
git clone https://github.com/NordicSemiconductor/nrf5-sdk-cmake.git
# 3. 创建构建目录
mkdir build && cd build
# 4. 运行CMake配置
cmake .. -DNRF5_SDK_ROOT=C:/nRF5_SDK_17.1.0 -DBOARD=NRF52840_DK
# 5. 编译
make -j4
我在项目中遇到过一个问题:CMake找不到GCC编译器。后来发现是环境变量没生效,重启VS Code就好了。嗯,这种小问题很常见,别慌。
4.5 第一个Hello World程序——点亮LED
好了,环境搭好了,咱们来写第一个程序。蓝牙开发圈的Hello World不是打印字符串,而是点亮开发板上的LED。为什么?因为蓝牙设备通常没有屏幕,LED是最直接的反馈。
以nRF52840 DK为例,板子上有4个LED,分别对应GPIO的P0.13到P0.16。咱们让LED1闪烁:
#include "nrf_gpio.h"
#include "nrf_delay.h"
#define LED_1 13 // P0.13
int main(void)
{
// 配置LED引脚为输出
nrf_gpio_cfg_output(LED_1);
while (1)
{
// 点亮LED(低电平有效)
nrf_gpio_pin_clear(LED_1);
nrf_delay_ms(500);
// 熄灭LED
nrf_gpio_pin_set(LED_1);
nrf_delay_ms(500);
}
}
这段代码很简单,但有几个细节要注意:
- 低电平有效:nRF52840 DK的LED是共阳极接法,所以
pin_clear是点亮,pin_set是熄灭。我第一次用这个板子时搞反了,LED死活不亮。 - 延时函数:
nrf_delay_ms是阻塞延时,实际产品中别这么用,但做实验没问题。
编译下载后,如果看到LED以1Hz的频率闪烁,恭喜你,环境搭建成功了!
- 编译无错误、无警告
- 下载成功,调试器能识别芯片
- LED按预期闪烁
- 按下复位键后程序重新运行
4.6 避坑指南——我踩过的那些雷
最后分享几个我实际遇到过的坑,你遇到了可以直接对照排查:
- 编译报错 "undefined reference to `nrf_gpio_cfg_output'":大概率是没包含对应的源文件。检查工程里有没有添加
nrf_gpio.c和nrf_delay.c。 - 下载时报 "No Cortex-M SW Device Found":检查调试器连接,确认SWD接口的VCC、GND、SWDIO、SWCLK四根线都接好了。我遇到过SWDIO虚焊的情况,折腾了一下午。
- LED不亮但代码看起来没问题:用万用表量一下LED引脚电压。如果一直是高电平,检查是不是GPIO配置错了。如果一直是低电平,检查是不是代码没跑起来(比如卡在某个初始化函数里)。
嗯,环境搭建这部分就到这里。下一章咱们开始真正接触蓝牙协议栈,我会带你从零搭建一个蓝牙从机工程。到时候你会发现,今天搭的环境就是后面所有实验的基础。