第三章 开发环境搭建:Keil/IAR/VS Code配置、SDK获取与编译、J-Link/Segger调试器连接

好,咱们进入第三章。这一章说实话挺关键的,但也是很多新手容易卡住的地方。我记得刚开始带团队时,有个小伙子拿着新买的开发板,折腾了一整天环境都没跑起来。后来我过去一看,嗯,SDK版本和编译器不匹配。这种坑,我踩过不止一次。

今天咱们就把开发环境这件事彻底讲透。你跟着我的节奏来,保证半小时内让LED闪起来。

3.1 编译器选择:Keil、IAR还是VS Code?

先说结论:三个都能用,但各有侧重。我个人习惯是——项目初期用Keil,调试方便;量产阶段切到IAR,代码优化更狠;至于VS Code,我主要拿它看代码、改注释,真正编译还是交给命令行。

你可能会问:「那我该选哪个?」我的建议是:如果你是刚入门,从Keil开始。为什么?因为Nordic、TI这些大厂的官方例程,默认就是Keil工程。你打开就能编译,省心。

编译器 优点 缺点 适合场景
Keil MDK 上手快、例程多、调试直观 代码体积大、License贵 学习、原型验证
IAR EWARM 优化强、编译快、代码密度高 界面老旧、配置繁琐 量产、资源受限项目
VS Code + GCC 免费、灵活、插件丰富 需要自己配Makefile Linux开发、开源项目
小提示:如果你用的是Nordic nRF5系列,我强烈建议你装个VS Code的「nRF Connect」插件。看代码时高亮和跳转比Keil舒服太多了。

3.2 SDK获取与工程编译

拿到开发板后第一件事——去官网下载SDK。以Nordic nRF52840为例,我一般去Nordic官网的「Downloads」页面,找「nRF5 SDK」。注意版本号,我个人推荐用17.0.2或17.1.0,这两个版本最稳定。

下载下来是个压缩包,大概1.2GB。解压后你会看到这样的目录结构:

nRF5_SDK_17.1.0_ddde560/
├── components/        # 核心组件:蓝牙协议栈、外设驱动等
├── examples/          # 官方例程,咱们主要用这个
├── external/          # 第三方库,比如FreeRTOS
├── integration/       # 集成开发环境相关文件
├── modules/           # 一些工具模块
└── documentation/     # API文档,建议通读一遍

打开一个例程,比如 examples/ble_peripheral/ble_app_uart。里面会有 pca10056(对应nRF52840 DK板)和 pca10040(对应nRF52832 DK板)两个文件夹。选对板子,进去后找到 armgcckeil 文件夹。

用Keil打开 .uvprojx 文件,直接点编译。我第一次编译时等了大概两分钟,心里还嘀咕是不是卡住了。后来发现是SDK在预编译蓝牙协议栈的库文件。嗯,正常现象。

注意:如果你用的是Keil MDK v5.38以上版本,记得把编译器版本选为V6。我遇到过有人用V5编译,结果报了一堆语法错误——其实是编译器对C99的支持不一样。

3.3 J-Link/Segger调试器连接

代码编译通过了,接下来就是烧录和调试。这里我重点说说J-Link。Segger的J-Link是嵌入式调试的标配,几乎支持所有ARM Cortex-M内核的芯片。

连接方式很简单:

  1. 用20针的JTAG/SWD排线,把J-Link连到开发板的SWD接口
  2. J-Link的USB口插到电脑
  3. 开发板供电(可以用USB,也可以用外部电源)

注意看J-Link上的指示灯——绿色常亮表示连接正常。如果红灯闪烁,八成是接线错了。我曾经有一次把SWDIO和SWCLK接反了,折腾了半小时才发现。

在Keil里配置调试器:

  1. 点击「Project」→「Options for Target」
  2. 选择「Debug」选项卡
  3. 在「Use」下拉框里选「J-LINK / J-TRACE Cortex」
  4. 点击「Settings」,确认SWD模式,速度建议选1MHz以下(特别是线比较长的时候)
避坑指南:我曾经在调试一个低功耗项目时,发现J-Link连上后芯片无法进入睡眠模式。查了半天,原来是调试接口的时钟还在跑。解决办法:在进入睡眠前调用 NRF_CLOCK->TASKS_HFCLKSTOP = 1; 关掉高频时钟。调试器不会影响功耗测试,但会干扰时钟管理。

3.4 第一个BLE工程:从编译到运行

好,咱们动手跑一个最简单的例程——ble_app_beacon。这个例程会让开发板广播一个iBeacon数据包,你用手机上的「nRF Connect」App就能扫描到。

步骤:

  1. 打开 examples/ble_peripheral/ble_app_beacon/pca10056/s140/keil/ble_app_beacon.uvprojx
  2. 按F7编译,等进度条走完
  3. 按F8下载,或者点「Load」按钮
  4. 下载成功后,开发板上的LED会开始闪烁

打开手机App,扫描——你应该能看到一个名为「Nordic_Beacon」的设备。点进去,能看到广播数据里的UUID、Major、Minor等信息。

如果你看不到,别急。先检查J-Link的指示灯,再确认开发板的供电。我遇到过最奇葩的一次——开发板的USB线是坏的,只能供电不能传数据。换根线就好了。

调试技巧:在Keil里按Ctrl+F5进入调试模式,在 main() 函数开头打个断点。单步执行,看变量值的变化。特别是 err_code 这个变量——如果返回非0值,说明某个API调用失败了。这时候去查SDK的API文档,基本都能找到原因。

3.5 多IDE协同工作流

最后聊点进阶的。我现在的开发流程是这样的:

  • 代码编辑:VS Code + C/C++插件,语法高亮、自动补全、代码跳转
  • 编译构建:用Makefile + GCC,或者直接用Keil/IAR的命令行模式
  • 调试烧录:J-Link + Ozone(Segger的免费调试器),或者Keil自带的调试器

为什么这么折腾?因为VS Code看代码确实舒服,但调试功能不如Keil/IAR成熟。所以我写代码用VS Code,调试时切回Keil。两个工具各取所长。

你如果也想这么干,记得在VS Code里装个「Cortex-Debug」插件,配合J-Link的GDB Server,也能实现断点调试。不过说实话,配置起来有点麻烦。我建议你先用Keil把流程跑通,再考虑折腾这些。

好,这一章就到这里。下一章咱们开始写真正的BLE代码——从广播到连接,一步步来。