第四章:开发环境搭建——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的配置其实不复杂,但有几个关键点要注意。

  1. 安装Device Pack:打开Keil,点击 Pack Installer,搜索你的芯片型号(比如nRF52840),安装对应的Device Family Pack。这一步漏了的话,编译时会报"找不到芯片定义"。
  2. 配置Flash烧录算法:在工程选项的 Debug 标签页里,选择你的调试器(J-Link或DAP-Link),然后在 Flash Download 里添加对应的Flash算法文件。我刚开始做时忘了这步,每次下载都提示"Flash Timeout"。
  3. 设置RAM和Flash地址:蓝牙协议栈会占用一部分RAM和Flash,所以你的应用程序地址要往后偏移。具体偏移量看SDK文档,一般在 nrf52840_xxaa.icf.sct 文件里定义。
💡 小技巧: 如果你用的是nRF5 SDK,可以直接打开 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.cnrf_delay.c
  • 下载时报 "No Cortex-M SW Device Found":检查调试器连接,确认SWD接口的VCC、GND、SWDIO、SWCLK四根线都接好了。我遇到过SWDIO虚焊的情况,折腾了一下午。
  • LED不亮但代码看起来没问题:用万用表量一下LED引脚电压。如果一直是高电平,检查是不是GPIO配置错了。如果一直是低电平,检查是不是代码没跑起来(比如卡在某个初始化函数里)。

嗯,环境搭建这部分就到这里。下一章咱们开始真正接触蓝牙协议栈,我会带你从零搭建一个蓝牙从机工程。到时候你会发现,今天搭的环境就是后面所有实验的基础。