1. 开发板开箱与基础认知
第一次拿到nRF52840 DK开发板时,我对着这个火柴盒大小的板子研究了半天。板子左上角那个显眼的4颗LED灯就是待会要征服的对象,右下角自带J-Link OB调试器意味着我们不需要额外购买烧录工具——这点对新手特别友好。板载的nRF52840芯片支持蓝牙5.2/Thread/Zigbee三协议,不过今天我们暂时不碰无线功能,先专注搞定最基础的"点灯仪式"。
板子背面印着关键接口说明:SWD调试接口、USB供电口、复位按钮的位置都需要记清楚。特别提醒注意板子左下角那个不起眼的电源开关,我第一次使用时因为没打开它,盯着毫无反应的板子怀疑了半小时人生。随板附带的20pin排针需要自己焊接,不过对于基础实验暂时用不上,可以先放着吃灰。
2. 开发环境搭建实战
2.1 SDK安装那些坑
Nordic的nRF5 SDK是个大礼包,最新版本在官网下载时需要填问卷,建议直接使用v17.1.0这个稳定版本(约650MB)。下载完成后解压路径要特别注意——绝对不要放在中文或带空格的目录下!我曾在"D:\学习资料\物联网"路径下栽过跟头,SES编译时各种报错,最后发现是路径惹的祸。
SDK目录结构需要重点了解:
components/:蓝牙协议栈等核心组件examples/:示例代码(待会要用的blinky就在这)external/:第三方工具链modules/:硬件驱动层
2.2 开发工具三选一
虽然文档里推荐了Keil/IAR/SES三种IDE,但实测下来**Segger Embedded Studio(SES)**确实最省心。安装时记得勾选"Add nRF5 SDK support"选项,这样后续创建项目时会自动关联SDK路径。有个细节容易被忽略:安装完成后要先去[Segger官网]申请免费License,用设备管理器里查到的J-Link序列号注册,激活邮件可能会被扔进垃圾箱。
对于Linux用户,可以用gcc-arm-none-eabi工具链配合VS Code开发,不过需要手动配置Makefile,新手建议先用SES走通流程。Windows用户注意安装时关闭杀毒软件,我有次被某安全软件拦截了J-Link驱动安装,导致后续烧录失败。
2.3 驱动安装检查清单
连接开发板USB口,设备管理器应该出现两个设备:
- J-Link OB(在"通用串行总线设备"下)
- CMSIS-DAP(在"人机接口设备"下)
如果出现黄色感叹号,需要手动指定驱动路径:
- 指向
C:\Program Files\SEGGER\JLink_Vxxx目录 - 或者使用Zadig工具强制安装WinUSB驱动
- 指向
验证安装成功:
# 打开J-Link Commander检查连接 J-Link>showemulist J-Link>exec device = nRF52840_xxAA3. 第一个LED工程实战
3.1 项目创建避坑指南
在SES中新建项目时,务必选择"nRF5 SDK Project"模板而不是普通的ARM项目。关键配置参数:
- Device: nRF52840_xxAA
- SDK版本: 与下载的SDK一致
- SoftDevice: 先选None(蓝牙项目才需要)
从examples/peripheral/blinky复制项目时,建议整个pca10056文件夹一起复制(对应nRF52840 DK的板型)。我试过只复制main.c文件,结果漏了关键的sdk_config.h配置,编译时报错NRF_GPIO_PIN_MAP not defined。
3.2 代码魔改小课堂
打开main.c会发现核心逻辑简单到哭:
while (true) { for (int i = 0; i < LEDS_NUMBER; i++) { bsp_board_led_invert(i); nrf_delay_ms(500); } }想玩点花样?试试这些修改:
- 改闪烁频率:调整
nrf_delay_ms()参数 - 跑马灯效果:单独控制每个LED的亮灭顺序
- 按键控制:加上
bsp_board_button_state_get()检测
注意开发板LED对应的GPIO引脚定义在bsp_board.h里:
#define LED_START 13 #define LED_0 13 #define LED_1 14 #define LED_2 15 #define LED_3 16 #define LED_STOP 163.3 烧录的十八般武艺
方法一:SES一键烧录
- 点击工具栏的"Build and Run"(小锤子+绿三角图标)
- 观察Output窗口的进度提示
- 看到"Verified OK"表示成功
方法二:J-Flash手动操作
# 常用命令序列 device = nRF52840_xxAA speed = 4000 erase loadfile blinky.hex verify start遇到"Could not reset target"错误时,先按开发板复位键,再检查SWD接口是否被占用。有时杀毒软件会阻止J-Link访问USB设备,临时关闭即可。
4. 调试与问题排查
4.1 常见错误代码表
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| No J-Link found | 驱动未正确安装 | 重装驱动或换USB口 |
| Flash download failed | 目标板未供电 | 检查电源开关 |
| Invalid ROM Table | 芯片锁死 | 执行unlock命令 |
| SIGTERM received | 调试接口冲突 | 关闭其他占用SWD的软件 |
4.2 调试技巧三连
printf大法:在
SEGGER_RTT_printf()输出调试信息,需要先在sdk_config.h开启RTT_ENABLED宏定义断点观察:在SES中右键设置断点,查看外设寄存器状态:
- GPIO寄存器:
NRF_P0->OUT - 时钟状态:
NRF_CLOCK->EVENTS_HFCLKSTARTED
- GPIO寄存器:
电流检测:正常运行时开发板电流约15mA,如果异常升高可能是程序跑飞
4.3 进阶准备
成功点亮LED后,可以尝试这些升级玩法:
- 用PWM实现呼吸灯效果
- 通过UART连接电脑控制LED
- 移植FreeRTOS实现多任务控制
记得每次修改代码前备份工程,我有次手滑删除了main.c,不得不从头重建项目。Nordic官方论坛和GitHub的nRF5-SDK仓库是解决问题的宝库,遇到奇怪错误时先去搜搜看。