一、问题背景
在 nRF Connect SDK 项目开发中,烧录 zephyr.hex 后设备没有日志输出,而烧录 zephyr.signed.hex 则正常。
本文对比两个文件的差异,并分析日志缺失的可能原因。
二、文件差异说明
根据 nRF Connect SDK 文档,两个 HEX 文件的定位如下:
| 文件 | 说明 |
|---|---|
zephyr.hex |
默认的完整镜像,未签名。适用于直接烧录到无 MCUboot 的单镜像场景,或烧录到 NSPE(非安全处理环境)。 |
zephyr.signed.hex |
由 zephyr.hex 经过 MCUboot 签名 生成的镜像,符合 MCUboot 的引导要求。烧录此文件会覆盖应用区,不会触发 DFU 流程。 |
三、为什么烧录 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 日志系统
四、建议排查步骤
-
确认 MCUboot 是否启用
- 查看项目配置:
CONFIG_BOOTLOADER_MCUBOOT=y或检查child_image/mcuboot是否存在。
- 查看项目配置:
-
检查烧录方式
- 若使用 MCUboot,请烧录
zephyr.signed.hex(或merged.hex),不要烧录zephyr.hex。 - 若不使用 MCUboot(单镜像),可烧录
zephyr.hex,但需确保链接地址从 0x0000_0000 开始。
- 若使用 MCUboot,请烧录
-
验证日志配置
- 在
prj.conf中添加或确认CONFIG_LOG=y,并设置合适的日志级别。
- 在
-
尝试调试启动顺序
- 可通过 J-Link RTT Viewer 或串口打印 MCUboot 自身的日志(若已启用)来确认引导是否成功。
粤公网安备 44030702004589号
新手必知
海量第三方学习资源.
超全常用工具与文档.
本站常用资源下载.
常见问题搜索.
QQ群: 542294007.
文章引用自:元仓库 OLIB.cn.