[nrf52][SDK17] 如何使用官方BootLoader
2026/9/14 11:09:40 网站建设 项目流程

前言

本文记录 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 文件

nrfjprog --eraseall 擦除芯片

烧录 BootLoader 固件

烧录 MBR 引导文件

nrfjprog --reset 复位芯片

烧录完成

整个流程按「擦除 → 烧录 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擦除后处于空白状态,但连接时序异常

解决步骤:

  1. 检查 J-Link 与目标板的 SWD 接线(SWDIO、SWCLK、GND、VTref),确认目标板已上电
  2. 重新安装或升级 J-Link 驱动,确保 nRF Command Line Tools 与 J-Link 版本兼容
  3. 按住目标板复位键,执行以下命令强制连接:
nrfjprog --recover
  1. 恢复成功后重新执行擦除与烧录:
nrfjprog --eraseall nrfjprog --program .\out\nrf52_boot_usb_dfu.hex --verify nrfjprog --reset

4.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 页地址不一致

解决步骤:

  1. 使用mergehex --info查看各 hex 文件的地址分布:
mergehex --info .\out\nrf52_boot_usb_dfu.hex mergehex --info .\out\settings.hex mergehex --info .\out\nrf52_app.hex
  1. 确认 APP 工程的 Flash 起始地址正确。以 nRF52832 为例,BootLoader 通常占用末尾 0x10000 字节,APP 起始地址应设为0x1F000
APP_START_ADDRESS = 0x1F000
  1. 若地址冲突,修改 APP 工程链接脚本后重新编译,再执行合并:
mergehex --merge .\out\nrf52_boot_usb_dfu.hex .\out\settings.hex .\out\nrf52_app.hex --output .\out\app_merged.hex

4.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 页版本不匹配

解决步骤:

  1. 查看 BootLoader 工程源码中的版本宏定义,例如nrf_dfu_types.hnrf_dfu_settings.h
#defineBOOTLOADER_VERSION1#defineAPP_VERSION1#defineDFU_SETTINGS_VERSION1
  1. 使用与工程配置一致的版本号重新生成 settings 文件:
nrfutil settings generate --family NRF52 --application .\out\nrf52_app.hex --application-version 1 --bootloader-version 1 --bl-settings-version 1 .\out\settings.hex
  1. 重新合并并烧录:
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 加密库说明

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询