前言
本文记录 nRF52 系列芯片在开发过程中,BootLoader 与 APP 固件的烧录方法。内容包括 BootLoader 单独烧录、以及将 BootLoader、MBR、Settings 与 APP 合并后一次性烧录的完整流程,并附上可直接使用的批处理脚本,方便后续开发与量产。
1. 环境准备
- 安装 nRF Command Line Tools(包含 nrfjprog、mergehex 等工具)
- 准备 nRF5 SDK 17.0.2,路径示例:
nRF5_SDK_17.0.2_d674dde - 准备 micro-ecc 加密库,放入
external\micro-ecc目录 - 使用 Keil 编译 BootLoader 工程与 APP 工程
2. BootLoader 单独烧录
下面是 BootLoader 单独烧录的完整流程:
整个流程按「擦除 → 烧录 BootLoader → 烧录 MBR → 复位」的顺序执行,其中 MBR 必须单独烧录,否则 BootLoader 无法正常启动。
- 编译 BootLoader 工程,生成
nrf52_boot_usb_dfu.hex - 将
mbr_nrf52_2.4.1_mbr.hex复制到工程根目录 - 编写
program.bat脚本,依次执行擦除、烧录 BootLoader、烧录 MBR、复位芯片
完整的program.bat脚本如下:
@echo off @echo eraseall nrfjprog --eraseall @echo program boot.hex nrfjprog --program .\out\nrf52_boot_usb_dfu.hex --verify @echo program mbr_nrf52_2.4.1_mbr.hex nrfjprog --program .\mbr_nrf52_2.4.1_mbr.hex --verify @echo reset chip nrfjprog --reset脚本关键步骤说明:
nrfjprog --eraseall:擦除芯片全部 Flash,确保烧录前芯片处于干净状态nrfjprog --program .\out\nrf52_boot_usb_dfu.hex --verify:烧录 BootLoader 固件,--verify会在烧录后自动校验数据一致性nrfjprog --program .\mbr_nrf52_2.4.1_mbr.hex --verify:烧录 MBR 引导文件,MBR 必须单独烧录,否则 BootLoader 无法正常启动nrfjprog --reset:复位芯片,使新烧录的固件生效
3. APP 一次性烧录(Boot + MBR + Settings + APP)
- 使用 nrfutil 生成 settings 文件
- 使用 mergehex 合并 BootLoader、Settings、APP 三个 hex 文件
- 擦除芯片后烧录合并文件
- 再烧录 MBR 文件并复位芯片
完整的program_app.bat脚本如下:
@echo off @echo generate settings file nrfutil settings generate --family NRF52 --application .\out\nrf52_app.hex --application-version 1 --bootloader-version 1 --bl-settings-version 1 .\out\settings.hex @echo merge boot + settings + app mergehex --merge .\out\nrf52_boot_usb_dfu.hex .\out\settings.hex .\out\nrf52_app.hex --output .\out\app_merged.hex @echo eraseall nrfjprog --eraseall @echo program merged hex nrfjprog --program .\out\app_merged.hex --verify @echo program mbr_nrf52_2.4.1_mbr.hex nrfjprog --program .\mbr_nrf52_2.4.1_mbr.hex --verify @echo reset chip nrfjprog --reset脚本关键步骤说明:
nrfutil settings generate:根据 APP 固件生成 settings 文件,其中--application-version与--bootloader-version需与工程配置一致,--bl-settings-version为 BootLoader 的 settings 版本号mergehex --merge:将 BootLoader、Settings、APP 三个 hex 文件合并为一个app_merged.hex,实现一次烧录nrfjprog --eraseall:擦除芯片全部 Flash,确保烧录前芯片处于干净状态nrfjprog --program .\out\app_merged.hex --verify:烧录合并后的固件文件,--verify会在烧录后自动校验数据一致性nrfjprog --program .\mbr_nrf52_2.4.1_mbr.hex --verify:烧录 MBR 引导文件,MBR 必须单独烧录,否则 BootLoader 无法正常启动nrfjprog --reset:复位芯片,使新烧录的固件生效
4. 常见错误与排查
4.1 nrfjprog 烧录失败
错误提示:
ERROR: Unable to connect to the target device. ERROR: Could not connect to the debug probe.原因分析:
- 芯片处于低功耗模式或已进入 DFU 模式,调试接口被关闭
- J-Link 驱动未安装或版本过旧
- 接线松动、供电不足,或目标板未上电
- 芯片被
--eraseall擦除后处于空白状态,但连接时序异常
解决步骤:
- 检查 J-Link 与目标板的 SWD 接线(SWDIO、SWCLK、GND、VTref),确认目标板已上电
- 重新安装或升级 J-Link 驱动,确保 nRF Command Line Tools 与 J-Link 版本兼容
- 按住目标板复位键,执行以下命令强制连接:
nrfjprog --recover- 恢复成功后重新执行擦除与烧录:
nrfjprog --eraseall nrfjprog --program .\out\nrf52_boot_usb_dfu.hex --verify nrfjprog --reset4.2 mergehex 合并报错
错误提示:
ERROR: The input files overlap in memory. ERROR: Failed to merge files: address range conflict.原因分析:
- BootLoader、Settings、APP 三个 hex 文件的地址区间存在重叠
- APP 工程的链接脚本(
.icf或.ld)起始地址设置错误,与 BootLoader 占用的 Flash 区间冲突 - Settings 文件生成时使用的起始地址与 BootLoader 的 settings 页地址不一致
解决步骤:
- 使用
mergehex --info查看各 hex 文件的地址分布:
mergehex --info .\out\nrf52_boot_usb_dfu.hex mergehex --info .\out\settings.hex mergehex --info .\out\nrf52_app.hex- 确认 APP 工程的 Flash 起始地址正确。以 nRF52832 为例,BootLoader 通常占用末尾 0x10000 字节,APP 起始地址应设为
0x1F000:
APP_START_ADDRESS = 0x1F000- 若地址冲突,修改 APP 工程链接脚本后重新编译,再执行合并:
mergehex --merge .\out\nrf52_boot_usb_dfu.hex .\out\settings.hex .\out\nrf52_app.hex --output .\out\app_merged.hex4.3 settings 版本不匹配
错误提示:
ERROR: Bootloader version mismatch. Expected: 1, Actual: 2. ERROR: Settings page is invalid or corrupted.原因分析:
nrfutil settings generate中的--bootloader-version与 BootLoader 工程中配置的版本号不一致--application-version与 APP 工程中定义的版本号不一致--bl-settings-version与 BootLoader 期望的 settings 页版本不匹配
解决步骤:
- 查看 BootLoader 工程源码中的版本宏定义,例如
nrf_dfu_types.h或nrf_dfu_settings.h:
#defineBOOTLOADER_VERSION1#defineAPP_VERSION1#defineDFU_SETTINGS_VERSION1- 使用与工程配置一致的版本号重新生成 settings 文件:
nrfutil settings generate --family NRF52 --application .\out\nrf52_app.hex --application-version 1 --bootloader-version 1 --bl-settings-version 1 .\out\settings.hex- 重新合并并烧录:
mergehex --merge .\out\nrf52_boot_usb_dfu.hex .\out\settings.hex .\out\nrf52_app.hex --output .\out\app_merged.hex nrfjprog --eraseall nrfjprog --program .\out\app_merged.hex --verify nrfjprog --reset总结
本文提供了 BootLoader 单独烧录与 Boot + MBR + Settings + APP 合并烧录两种方案,并给出了可直接复用的批处理脚本。实际开发中可根据需求选择对应流程,注意烧录顺序与文件路径配置。
参考资料
- nRF5 SDK 17.0.2 官方文档
- nRF Command Line Tools 用户手册
- micro-ecc 加密库说明