2. 开发环境搭建:Keil/IAR IDE安装、SDK获取与配置、J-Link/ST-Link驱动安装与验证
说实话,搞嵌入式开发,环境搭建这一步最容易被轻视。很多人觉得不就是装个软件嘛,结果一上手就卡住——编译报错、找不到芯片、下载器连不上……我见过太多项目因为环境问题浪费一整天。
这一章,咱们就把UWB和BLE联调要用到的工具链,从头到尾捋一遍。你跟着我的步骤走,基本不会出岔子。
2.1 IDE选择:Keil还是IAR?
先聊个老生常谈的问题。Keil MDK和IAR Embedded Workbench,到底选哪个?
我个人习惯用Keil,原因很简单:国内用Keil的人多,遇到问题好找答案。但IAR的编译优化确实更狠,代码密度能小10%~15%。
| 对比项 | Keil MDK | IAR EWARM |
|---|---|---|
| 编译器 | ARMCC v6(基于Clang) | IAR C/C++ Compiler |
| 调试器支持 | J-Link、ST-Link、ULINK | J-Link、ST-Link、I-Jet |
| 工程管理 | 分组管理,直观 | 层级目录,更灵活 |
| 代码优化 | 中等 | 优秀(尤其尺寸优化) |
| License价格 | 约¥8000(MDK-Plus) | 约¥12000(标准版) |
| 社区资源 | 中文资料丰富 | 相对较少 |
我的建议是:如果你刚入门,或者团队里都用Keil,那就选Keil。如果你做量产产品、对Flash空间抠得紧,IAR更合适。两个都装也行,反正不冲突。
2.2 Keil MDK安装与破解(正版用户请忽略破解部分)
安装步骤其实不复杂,但有几个坑我得提前说。
- 下载安装包:去Keil官网(www.keil.com)下载MDK-Arm最新版。目前稳定版是5.38,别追太新的版本,有些SDK还没适配。
- 安装路径:默认C盘就行,但路径里不要有中文和空格。我之前有个项目,就因为路径带了个空格,编译死活报错,查了半天。
- 安装器件包:装完主程序后,打开Pack Installer,找到你用的芯片型号。比如STM32F4系列,点Install。这一步很多人漏掉,结果新建工程时找不到芯片。
- License激活:正版用户输入序列号。其他情况……嗯,你懂的。CID码在License Management里看,生成激活码后粘贴进去。
2.3 IAR Embedded Workbench安装
IAR的安装逻辑和Keil不太一样,它把不同芯片系列分成了单独的安装包。
- 下载对应版本:比如你用的是ARM核,就下载EWARM。官网注册后可以申请30天试用版。
- 安装过程:一路Next,但注意勾选“Add IAR to PATH”,后面命令行编译会用到。
- 注册:试用版不需要破解,但每次打开会弹窗提醒。正版用户输入License文件即可。
我记得第一次用IAR时,最不习惯的是它的工程文件结构。Keil是.uvprojx,IAR是.eww和.ewp。别搞混了。
2.4 SDK获取与配置
SDK这块,不同芯片厂商的套路差不多,但细节有差异。咱们以最常用的STM32和Nordic为例。
2.4.1 STM32Cube SDK
ST官方的SDK叫STM32CubeFW,里面包含了HAL库、LL库、中间件和示例工程。
- 下载方式:从ST官网或GitHub直接拉。推荐用STM32CubeMX,它可以在线下载并自动配置工程。
- 目录结构:解压后大概长这样——
STM32Cube_FW_F4_V1.27.0/
├── Drivers/ # HAL/LL库、BSP驱动
├── Middlewares/ # 协议栈、文件系统等
├── Projects/ # 官方示例工程
├── Utilities/ # 工具脚本
└── Release_Notes.html
- 配置要点:用CubeMX生成工程时,记得选对芯片型号和调试接口(SWD或JTAG)。时钟配置别乱改,先跑默认的。
2.4.2 Nordic nRF5 SDK
Nordic的SDK稍微复杂点,因为它集成了BLE协议栈(SoftDevice)。
- 版本选择:nRF5 SDK目前主流是17.1.0,支持nRF52832和nRF52840。如果你用nRF5340,得用nRF Connect SDK(基于Zephyr)。
- 目录结构:
nRF5_SDK_17.1.0_ddde560/
├── components/ # 驱动、库、协议栈
├── examples/ # 示例工程(BLE、UART、DFU等)
├── external/ # 第三方库(FreeRTOS、FatFS等)
├── integration/ # IDE集成文件
├── tools/ # 命令行工具
└── sdk_config.h # 全局配置文件
2.5 J-Link与ST-Link驱动安装
调试器是嵌入式开发的命根子。驱动装不好,代码下不进去,啥都白搭。
2.5.1 J-Link驱动
J-Link是SEGGER家的产品,兼容性最好,几乎支持所有ARM Cortex-M芯片。
- 下载驱动:去SEGGER官网(www.segger.com)下载J-Link Software and Documentation Pack。目前最新是V7.96。
- 安装:双击安装,默认路径即可。安装过程中会提示是否安装USB驱动,选“是”。
- 验证:插上J-Link,打开设备管理器,应该能看到“J-Link”设备。如果没有,手动更新驱动,路径选安装目录下的Driver文件夹。
我曾经遇到过一个诡异的问题:J-Link插上后灯亮,但Keil里就是识别不到。后来发现是USB线的问题——有些线只能充电,不能传数据。换根线就好了。
2.5.2 ST-Link驱动
ST-Link是ST自家调试器,Nucleo和Discovery板上都集成了。
- 驱动来源:装STM32CubeMX或Keil时,驱动会自动装上。如果没装,去ST官网搜“ST-Link driver”。
- 手动安装:设备管理器里看到“ST-Link”带黄色感叹号,就右键更新驱动,选“ST-Link_V2_USBdriver.exe”所在目录。
- 固件升级:ST-Link的固件偶尔需要升级。用STM32CubeProgrammer或ST-Link Utility,点“Firmware Update”就行。
2.6 环境验证:跑通第一个点灯程序
环境搭没搭好,跑个点灯程序就知道了。这是嵌入式界的“Hello World”。
- 新建工程:Keil里选对应芯片,添加main.c。
- 写代码:
#include "stm32f4xx_hal.h"
void SystemClock_Config(void);
static void GPIO_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
GPIO_Init();
while (1)
{
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
HAL_Delay(500);
}
}
void SystemClock_Config(void)
{
// 默认HSE配置,具体看你的板子
}
static void GPIO_Init(void)
{
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
- 编译:按F7,0 Error 0 Warning才算过。
- 下载:接好调试器,点Load。如果弹出“Flash Download failed”,检查一下Flash算法有没有选对。
- 看结果:板子上的LED应该以0.5秒间隔闪烁。
- IDE能正常编译,无报错
- 调试器能被识别(J-Link或ST-Link)
- 程序能下载到芯片并运行
- LED闪烁正常
2.7 本章知识体系
下面这张图,把开发环境搭建的核心流程串起来了。你照着这个思路走,不会乱。
这张图把整个流程分成了五层:从IDE选择开始,到安装、SDK配置、调试器驱动,最后用点灯程序收尾。每一层都依赖上一层,别跳步。
2.8 常见问题与避坑
最后,分享几个我踩过的坑,你遇到了直接照方抓药。
- 编译报错“找不到头文件”:八成是Include路径没配。Keil里点魔术棒→C/C++→Include Paths,把SDK的Drivers文件夹加进去。
- 下载时报“No Cortex-M SW Device Found”:先检查接线——SWDIO、SWCLK、GND三根线必须连。再检查调试器驱动有没有装好。还不行,试试按住板子的复位键再点下载。
- J-Link灯亮但连不上:可能是J-Link固件版本太老。用J-Link Commander(JLink.exe)输入“connect”看看报什么错。我遇到过因为芯片电压是1.8V而J-Link默认3.3V导致连不上的情况,加个电平转换就好了。
- ST-Link升级固件后变砖:别慌。按住板子上的复位键,插上USB,打开STM32CubeProgrammer,在“Firmware Update”模式下强制刷一次。我救回来过三块板子。