nRF54固件烧录:zephyr.hex 与 zephyr.signed.hex差异

一、问题背景

在 nRF Connect SDK 项目开发中,烧录 zephyr.hex 后设备没有日志输出,而烧录 zephyr.signed.hex 则正常。
本文对比两个文件的差异,并分析日志缺失的可能原因。


二、文件差异说明

根据 nRF Connect SDK 文档,两个 HEX 文件的定位如下:

文件 说明
zephyr.hex 默认的完整镜像,未签名。适用于直接烧录到无 MCUboot 的单镜像场景,或烧录到 NSPE(非安全处理环境)。
zephyr.signed.hex zephyr.hex 经过 MCUboot 签名 生成的镜像,符合 MCUboot 的引导要求。烧录此文件会覆盖应用区,不会触发 DFU 流程。

参考:nRF Connect SDK 文档 - Output build files


三、为什么烧录 zephyr.hex 没有日志?

日志输出与文件是否签名没有直接关系,根本原因在于启动流程Kconfig 配置。常见原因如下:

1. 项目使用了 MCUboot,导致地址不匹配

  • 如果项目启用了 MCUboot,zephyr.hex 的链接地址(通常为 0x0000_0000 或应用槽起始地址)可能与 MCUboot 期望的应用槽地址(例如 0x0000_8000)不一致。
  • 此时设备可能无法正常引导应用,从而卡在 MCUboot 或直接跑飞,看不到任何日志。
  • 解决方案:应使用 zephyr.signed.hex(已签名,且链接地址正确)或合并后的 merged_<board_target>.hex

2. 日志功能未启用

  • 需要确认 prj.conf 或 Kconfig 中已开启日志全局开关:
    CONFIG_LOG=y
    
  • 同时检查日志级别和模式:
    CONFIG_LOG_DEFAULT_LEVEL=3    # 或 1/2/3/4
    CONFIG_LOG_MODE_IMMEDIATE=y   # 或 MINIMAL
    
  • 参考:nRF Connect SDK 日志系统

四、建议排查步骤

  1. 确认 MCUboot 是否启用

    • 查看项目配置:CONFIG_BOOTLOADER_MCUBOOT=y 或检查 child_image/mcuboot 是否存在。
  2. 检查烧录方式

    • 若使用 MCUboot,请烧录 zephyr.signed.hex(或 merged.hex),不要烧录 zephyr.hex
    • 若不使用 MCUboot(单镜像),可烧录 zephyr.hex,但需确保链接地址从 0x0000_0000 开始。
  3. 验证日志配置

    • prj.conf 中添加或确认 CONFIG_LOG=y,并设置合适的日志级别。
  4. 尝试调试启动顺序

    • 可通过 J-Link RTT Viewer 或串口打印 MCUboot 自身的日志(若已启用)来确认引导是否成功。

五、参考资料

新手必知

海量第三方学习资源.

超全常用工具与文档.

本站常用资源下载.

常见问题搜索.

QQ群: 542294007.

文章引用自:元仓库 OLIB.cn.