以下问答聚焦 MCX N 系列(以 MCX N947 为代表)闪存交换的核心价值、硬件布局、启动逻辑、固件配置、实操步骤,覆盖开发中高频疑问,答案均源自恩智浦官方应用笔记(AN14145 V1),确保准确性与落地性。
Q1:为什么 MCX N 系列需要 “闪存交换功能”?核心解决什么问题?
A:MCX N 系列的闪存交换功能,本质是双固件启动机制,核心解决嵌入式设备固件升级的 “可靠性风险”:
-
- 传统单固件升级时,若遇断电、通信中断等意外,新固件会写入不完整,导致系统崩溃、设备无法启动;
- 闪存交换功能通过在内部闪存中存储 “主固件(Image 0)” 和 “备份固件(Image 1)”,确保始终有一个完整固件可用 ——BootROM 会自动检测固件完整性与版本,若新固件异常,立即回退到旧固件启动,避免设备 “变砖”。
Q2:MCX N 系列(如 MCX N947)的内部闪存布局是怎样的?关键参数有哪些?
A:以 MCX N947 为例,其内部闪存为2MB 容量,采用 “双块划分” 设计,其他 MCX N 系列芯片布局逻辑类似,具体参数如下:
关键特性 | 具体规格 / 说明 |
总闪存容量 | 2MB(固定划分成 2 个独立块) |
单块容量 | 每块 1MB,分别对应 “Image 0(块 0)” 和 “Image 1(块 1)”,用于存储双固件 |
最小擦除单元 | 8kB 扇区(擦除操作需按扇区执行,不可跨扇区) |
最小写入单元 | 16B “Phrase”(写入数据时需按 16B 整数倍操作,确保数据完整性) |
控制器功能 | 集成闪存控制器(FMC)、预取缓存(Prefetch Cache),支持 AHB 总线地址重映射 |
Q3:MCX N 系列双固件的启动流程是什么?BootROM 如何选择启动哪个固件?
A:BootROM 上电后会按 “检测→判断→重映射→启动” 四步执行双固件逻辑,流程如下:
(1)启动前检测
- 首先读取CMPA 寄存器(0100_4004h 地址的 FLASH_REMAP_SZ 字段),确认是否使能闪存重映射;
- 检测 Image 0 和 Image 1 的 “镜像长度”(偏移 0x20)和 “镜像类型”(偏移 0x24),验证固件完整性(如 CRC 校验)与版本号。
(2)固件选择规则
- 优先启动高版本固件:BootROM 通过 “镜像类型” 字段的 [31:16] 位读取版本号(需确保 bit [10] = 1,否则默认版本为 0);
- 异常回退机制:若高版本固件(如 Image 1)写入不完整、CRC 校验失败,自动切换到低版本的完整固件(如 Image 0)启动。
(3)地址重映射
若启动的是 Image 1(块 1,起始地址 1MB),闪存控制器会将0h 起始的 AHB 访问地址重映射到块 1 的起始偏移—— 对应用层来说,无需修改代码地址,仿佛固件仍在 0h 起始位置运行,实现 “无缝切换”(如图 3 所示)。
Q4:配置双固件时,固件文件的结构有什么要求?关键字段是什么?
A:MCX N 系列的固件以 “中断向量表” 开头,需包含 2 个核心配置字段(存储在固件头部),用于 BootROM 识别,具体结构如下(表 1 简化版):
偏移量(十六进制) | 大小(字节) | 字段名称 | 核心作用与配置说明 |
00 | 4 | 初始SP | 协议栈指针,固件启动时的栈初始化地址 |
04 | 4 | 初始PC | 应用程序第一条执行指令的地址(固件入口) |
20 | 4 | 镜像长度 | 固件总长度(含签名 / CRC),需填写实际大小(若镜像类型为 “带 CRC” 或 “签名”,不可省略) |
24 | 4 | 镜像类型 | 最关键字段,包含 3 类信息:
1. 镜像格式(bit [7:0]):0h = 纯镜像、2h = 带 CRC 纯镜像、4h = 签名镜像; 2. 版本包含标记(bit [10]):1 = 版本存于 [31:16] 位,0 = 默认版本 0; 3. TZM 数据标记(bit [13]):1 = 含可信区域预设数据,0 = 不含 |
注意:仅 “内部闪存 XIP(片上执行)” 场景需设置 bit [10] = 1,让 BootROM 读取 [31:16] 位的版本号。
Q5:CMPA 寄存器中的 “FLASH_REMAP_SZ” 字段有什么用?怎么配置?
A:CMPA(配置模块 A)中的FLASH_REMAP_SZ(地址 0100_4004h) 是控制 “闪存地址重映射” 的核心参数,直接影响 AHB 总线的访问地址映射范围:
(1)功能定义
当 FLASH_REMAP_SZ 设置为非零值时,内部闪存的 AHB 访问地址会根据 “当前工作块(Image 0/1)” 动态调整 —— 简单说,就是告诉 BootROM “需要重映射多大范围的地址到目标块”。
(2)配置规则
重映射大小计算公式:重映射容量 = (FLASH_REMAP_SZ 值 + 1) × 32kB
示例:若 FLASH_REMAP_SZ = 2h(十六进制),则重映射容量 = (2 + 1) × 32kB = 96kB,即 0h~0x17FFF 地址的访问会被映射到目标块的对应偏移。
(3)关键注意
- 若不启用双固件(单固件场景),FLASH_REMAP_SZ 设为 0h 即可;
- 双固件场景需根据固件实际大小配置,确保覆盖完整固件代码区(建议参考《MCX N947 用户手册》的 CMPA Excel 表格确认细节)。
Q6:MCX N 系列其他芯片(如 MCX N547)的闪存交换功能,和 MCX N947 一致吗?
A:一致。恩智浦官方明确说明:所有 MCX N 系列芯片的闪存交换功能(双固件启动、地址重映射、固件配置逻辑)均与 MCX N947 类似,仅需根据具体芯片的 “闪存总容量” 调整 Image 0/1 的划分(如部分 N 系列为 1MB 闪存,可划分为 2 个 512kB 块),实操步骤和工具完全通用。
Q8. 固件配置中的 “镜像类型” 支持哪些选项?不同场景选哪种?
A:“镜像类型”(偏移 0x24)的 bit [7:0] 定义了固件格式,支持 5 种类型,需根据 “安全性、校验需求” 选择:
镜像类型值(bit [7:0]) | 类型名称 | 适用场景 |
0h | 纯镜像 | 调试阶段,无需 CRC 校验或签名,追求配置简单 |
2h | 带 CRC 的纯镜像 | 量产基础场景,需校验固件完整性(避免传输错误),无高强度安全需求 |
4h | 签名镜像 | 高安全场景(如工业控制),需通过签名验证固件合法性,防止篡改 |
5h | 带 CRC 的纯镜像(兼容) | 同 2h,为兼容旧版本工具设计 |
6h | SB3 清单 Load_to_RAM 镜像 | 固件需加载到 RAM 中运行(非 XIP),需在镜像标头指定加载地址和长度 |