第二章 开发环境搭建:选择合适的MCU与工具链

说实话,做蓝牙协议栈移植这件事,第一步往往就把人卡住了——开发环境没搭好。我见过太多朋友,兴致勃勃下载了SDK,结果编译报错一整天,最后连个LED都没点亮。嗯,这一章我们就来把这摊事理顺。

2.1 选MCU:nRF52还是CC26xx?

我个人习惯,先看项目需求再选芯片。不是越贵越好,也不是越便宜越合适。

对比项 Nordic nRF52840 TI CC2640R2F
内核 ARM Cortex-M4F (64MHz) ARM Cortex-M3 (48MHz)
Flash/RAM 1MB / 256KB 352KB / 80KB
蓝牙版本 BLE 5.3 BLE 5.1
协议栈 SoftDevice / Zephyr TI BLE-Stack
典型价格 ~$3.5 ~$2.0

我在项目中遇到过一个问题:用CC2640做OTA升级,Flash空间差点不够用。后来换成nRF52840,空间宽裕多了。所以如果你要做复杂应用,比如同时跑蓝牙和Thread,我建议直接上nRF52系列。

我的小建议: 初学者先用nRF52840 DK开发板。资料多,社区活跃,遇到问题好找人问。TI的片子也不错,但它的协议栈封装得比较紧,想深入移植反而有点束手束脚。

2.2 IDE安装与配置:Keil、IAR、VS Code

IDE这东西,说白了就是个顺手的问题。我三种都用过,说说我的感受。

2.2.1 Keil MDK

Keil在ARM生态里是老大哥了。安装时注意两点:

  • 版本选5.38以上,对Cortex-M4支持更好
  • 记得装Device Family Pack,不然找不到芯片型号

我曾经因为没装nRF52的DFP,编译一直报"device not found",折腾了半小时才发现问题。

2.2.2 IAR Embedded Workbench

IAR的编译器优化确实强,代码体积能比Keil小10%-15%。但它的界面...嗯,有点复古。配置步骤:

  1. 安装IAR for ARM 9.40+
  2. 导入Nordic或TI的芯片支持包
  3. 设置Linker文件路径(这个容易忘)

2.2.3 VS Code + GCC

我个人现在最常用的是VS Code。免费、轻量、插件丰富。配置起来稍微麻烦点,但一劳永逸。

// 必要的VS Code插件
1. C/C++ (微软官方)
2. Cortex-Debug
3. Nordic Semiconductor (nRF Connect)
4. CMake Tools

// 编译工具链
arm-none-eabi-gcc (版本10.3以上)
注意: 用VS Code做嵌入式开发,一定要装好JLink驱动。我见过有人编译通过了,但下载程序时提示"no JLink device found",其实就是驱动没装对。

2.3 SDK获取与编译:以Zephyr和Nordic SDK为例

SDK的选择,决定了你后续的开发效率。我两种都深度用过,给你讲讲区别。

2.3.1 Nordic SDK(nRF5 SDK)

这是Nordic官方的SDK,成熟稳定。获取方式:

  • 官网下载:nRF5_SDK_17.1.0(最新稳定版)
  • 或者用nRF Connect桌面版,一键下载

编译一个简单的BLE例子:

// 以Keil为例
1. 打开 examples/ble_peripheral/ble_app_uart/pca10056/s140/arm5_no_packs
2. 双击 .uvprojx 文件
3. 点击 Build (F7)
4. 如果报错,检查SoftDevice路径是否配置正确

我记得第一次编译nRF52的工程,报了一堆"undefined reference"。后来发现是SoftDevice的hex文件没烧进去。嗯,这里要注意:SoftDevice要先烧录,再烧应用固件。

2.3.2 Zephyr RTOS

Zephyr是Linux基金会维护的开源RTOS,对蓝牙协议栈支持很好。它的好处是:一次配置,多平台通用。

安装步骤:

# 1. 安装依赖(Ubuntu 22.04)
sudo apt install --no-install-recommends git cmake ninja-build gperf \
  ccache dfu-util device-tree-compiler wget \
  python3-dev python3-pip python3-setuptools python3-tk python3-wheel xz-utils file \
  make gcc gcc-multilib g++-multilib libsdl2-dev

# 2. 获取Zephyr源码
west init ~/zephyrproject
cd ~/zephyrproject
west update

# 3. 安装Python依赖
pip install -r ~/zephyrproject/zephyr/scripts/requirements.txt

# 4. 编译nRF52840 DK的hello_world
cd ~/zephyrproject/zephyr
west build -b nrf52840dk_nrf52840 samples/basic/blinky
关键点: Zephyr的蓝牙协议栈是原生的,不像Nordic SDK那样需要额外烧录SoftDevice。这意味着你可以直接修改协议栈源码,做深度定制。但代价是——学习曲线陡一些。

2.4 避坑指南:我踩过的那些坑

做开发环境搭建,说难不难,说简单也不简单。我总结几个常见问题:

  • 路径不要有中文和空格——Keil和IAR对中文路径支持很差,我曾经因为桌面文件夹叫"蓝牙项目",编译死活过不去
  • JLink驱动版本要匹配——新版JLink驱动可能不兼容旧版调试器,我遇到过V9调试器用V7.0驱动反而更稳定
  • SDK版本别追新——nRF5 SDK 17.1.0比17.2.0更稳定,Zephyr 3.4 LTS比最新版bug少

最后说一句:环境搭建别急。我刚开始做蓝牙开发时,光搭环境就花了两天。但后面写代码、调试就顺畅多了。磨刀不误砍柴工,对吧?

下一章,我们开始真正动手——从零搭建一个BLE广播工程。