2. nRF54硬件与存储布局

nRF54系列(如nRF54H20、nRF54L15)与早期nRF52最大的差异,不只是主频和功耗,而是存储介质与安全架构的整体重构。nRF52上DFU工程师熟悉的“一块Flash + 一个Bootloader + 一个App”的线性模型,在nRF54上不再成立。nRF54H20采用多核(Application核 + 多个Radio/PPR核)与多域存储,nRF54L15则引入RRAM作为非易失存储,并配合TrustZone实现安全隔离。理解这些布局,是判断“DFU能不能原地升级、升级后谁校验、失败后回滚到哪”的前提。

一、Flash与RRAM:介质差异决定擦写与分区策略

nRF54L15使用RRAM(阻变存储器)替代传统NOR Flash。RRAM的擦除粒度更小、写入前不要求整块擦除,且擦写寿命与功耗表现优于Flash。这对DFU的直接意义是:分区不必再按Flash的大扇区对齐,镜像可以更紧凑地排布,双区(Dual-Bank)方案所需的额外空间显著减少。但要注意,RRAM并非“可随意覆盖写”,MCUboot的swap逻辑仍以“擦除—写入—校验”为基本单元,只是擦除单位从Flash的4 KB级降到更细粒度。

nRF54H20则保留Flash体系,但存储被划分为多个域,分别服务于Application核、Radio核与安全服务。因此分区表不再是单一线性数组,而是按域划分的多张分区表。DFU镜像必须明确“写入哪个域、由哪个核校验、由谁跳转”,否则会出现镜像写成功但目标核不启动的情况。

二、Secure Boot与TrustZone:谁在DFU链上拥有最终裁决权

nRF54的启动链是:ROM Boot → Secure Boot(BL2/BL3)→ 应用镜像。TrustZone将执行环境分为Secure与Non-secure两个世界,Secure侧持有密钥、校验逻辑与回滚策略,Non-secure侧运行普通应用。DFU升级包在写入后,必须由Secure侧完成签名校验,校验通过才允许跳转;校验失败则保持旧镜像或进入恢复模式。

这意味着DFU的“成功”不再等于“数据写完”,而是“Secure Boot校验通过并完成跳转”。工程上常见的坑是:升级包签名算法与Secure Boot配置不匹配、镜像头部(TLV)缺少必要的依赖描述、或Non-secure应用试图直接擦写Secure分区而被TrustZone拦截。排查时应先确认Secure Boot的校验结果,再检查分区访问权限。

nRF54 存储域与 DFU 校验链 存储域(按核/安全划分) Secure 分区 密钥 / BL2 / 校验逻辑 TrustZone Secure 侧 Non-secure 应用区 App Slot 0 / Slot 1 MCUboot 管理 RRAM / Flash 数据区 配置 / 日志 / 用户数据 擦除粒度更细 Radio / PPR 域 协议栈镜像 独立分区表 恢复 / 回滚区 启动与 DFU 校验链 ROM Boot 不可修改,建立信任根 Secure Boot (BL2) 验签 / 版本 / 回滚策略 MCUboot 跳转 选择 Slot 0 / Slot 1 Non-secure App 正常运行 / 触发 DFU DFU 接收新镜像 写入备用 Slot 结果判断与回滚 校验通过 标记新镜像有效,跳转 校验失败 保持旧镜像 / 进入恢复 回滚触发条件 看门狗 / 启动计数超限 分区访问越权 TrustZone 拦截写入 排查顺序 签名 → 分区 → 权限 → 跳转

三、MCUboot在nRF54上的适配要点

MCUboot本身是通用Bootloader,但移植到nRF54需要处理三件事。第一是分区表描述:nRF54的分区不再由单一DTS节点定义,而是需要按域分别声明,MCUboot的flash_area必须映射到正确的域地址。第二是镜像头部与TLV:nRF54的Secure Boot要求镜像携带依赖描述(如协议栈版本、安全域标识),MCUboot在打包时需通过imgtool写入对应TLV,否则Secure侧会拒绝跳转。第三是swap算法与RRAM特性:RRAM擦除粒度小,swap时可以按更细粒度搬运,但MCUboot默认的swap-scratch或swap-move策略仍需根据实际擦除单位调整,避免出现“逻辑上可交换、物理上擦除失败”的情况。

一个常见的适配错误是直接复用nRF52的partition配置。nRF52的Bootloader区通常从0x00000000开始,而nRF54的Secure Boot位于ROM或独立Secure分区,MCUboot的起始地址必须避开Secure区域,否则会触发TrustZone保护异常。

四、内存映射对DFU的实际影响

内存映射决定了DFU的“可升级边界”。在nRF54上,需要重点关注三类地址:Slot地址(主备镜像存放位置)、交换区地址(swap scratch或move区域)、共享数据地址(配置、日志、密钥)。如果Slot 1与Secure分区地址重叠,DFU写入会被硬件拦截;如果交换区落在RRAM的保留块内,swap会失败;如果共享数据区没有在升级时保留,升级后设备可能丢失校准参数。

工程上建议在DFU前先读取分区表并做一次地址合法性检查,确认目标Slot与当前运行Slot不重叠、交换区可擦写、共享数据区有备份策略。升级完成后,不要只看“写入成功”的日志,而应读取Secure Boot的校验结果和启动计数,确认新镜像真正被跳转执行。

在nRF54L15上做双区DFU时,由于RRAM擦除粒度更细,Slot 1可以比Flash方案更紧凑,但MCUboot的swap仍需预留交换空间。建议先用nrfutil或imgtool生成镜像并检查TLV,再通过mcumgr上传,最后读取启动日志确认校验链完整。
不要假设“DFU写入完成”等于“升级成功”。在nRF54上,Secure Boot拥有最终否决权。若签名算法、TLV依赖或分区权限任一不匹配,镜像会被拒绝,设备可能停留在旧版本或恢复模式。排查时应按“签名 → 分区 → 权限 → 跳转”的顺序逐层确认。

总结来看,nRF54的DFU不再是单纯的“搬数据”,而是存储域、安全域与启动链三者协同的结果。Flash/RRAM决定分区粒度与交换策略,Secure Boot与TrustZone决定谁校验、谁放行,MCUboot负责在两者之间完成镜像搬运与跳转。内存映射则是这三者能否对齐的底层约束。把这四层关系理清,后续的DFU配置、排障与回滚设计才有可靠依据。