2. TRAVEO存储架构与升级映射

TRAVEO系列MCU(以CYT4BF等典型型号为例)内部采用嵌入式Flash(eFlash)作为非易失程序存储器,并配合SRAM、eFuse/OTP区域共同构成完整的存储体系。理解这套存储架构,是设计固件升级方案、规划升级地址、实现双Bank切换的前提。本节从物理分区出发,逐步过渡到升级映射与地址规划,帮助读者建立"存储—分区—升级"的完整认知链条。

一、TRAVEO Flash的物理组织

TRAVEO的eFlash通常按"Bank—Sector—Page"三级组织。以CYT4BF为例,其代码Flash容量可达4MB以上,划分为多个物理Bank(如Bank0、Bank1、Bank2等),每个Bank内部再细分为若干Sector(扇区),Sector是擦除操作的最小单位,而Page(页)是编程写入的最小单位。典型参数为:Sector大小32KB或64KB,Page大小512字节。这意味着任何一次固件更新,都必须以Sector为单位擦除、以Page为单位写入,不能像RAM那样任意字节改写。

除主Flash外,TRAVEO还包含Work Flash(工作Flash)区域,用于存放需频繁更新的数据(如标定参数、故障码、里程信息等),其擦写寿命通常高于主Flash,适合作为数据区使用。此外,SFlash(Supervisory Flash)存放出厂校准、保护设置等关键信息,一般不允许应用层随意擦写。

二、逻辑分区:Bootloader区、Application区、数据区

在工程实践中,我们不会直接把整个Flash当作一块连续空间使用,而是按功能划分为若干逻辑分区:

  • Bootloader区:位于Flash起始地址(如0x80000000),存放启动代码、升级协议解析、Flash驱动、跳转逻辑。该区域在量产时烧录,升级过程中通常不被擦除,保证"永远有一个可运行的引导程序"。
  • Application区:存放用户应用固件,是升级的主要目标。其起始地址、大小必须与链接脚本(Linker Script)和升级地址规划严格一致。
  • 数据区:存放配置参数、标定数据、升级标志位、版本信息等。可位于Work Flash,也可在主Flash中单独划出一个Sector。
  • 元数据/标志区:记录当前有效Bank、升级状态、CRC校验值、版本号等,是双Bank切换的"决策依据"。

分区规划的核心原则是:Bootloader区不可被自身升级流程擦除;Application区与升级缓存区必须物理隔离;数据区与代码区分离,避免升级时误擦数据。

三、双Bank机制与升级映射

双Bank(Dual-Bank)机制是TRAVEO支持"不停机升级"和"回滚"的关键。其基本思想是:将Application区划分为两个等大的Bank——Bank A和Bank B,同一时刻只有一个Bank被标记为"有效"并由Bootloader跳转执行,另一个Bank作为升级目标。

升级流程可概括为:Bootloader接收新固件 → 写入非活动Bank → 校验CRC/签名 → 更新元数据标志 → 复位 → Bootloader读取标志 → 跳转到新Bank。若新固件校验失败或启动异常,元数据仍指向旧Bank,实现自动回滚。

地址映射上,两个Bank的起始地址不同,但应用固件在编译时通常按"相对偏移"链接,由Bootloader在跳转前完成地址重定位(或使用MMU/MPU映射)。对于不支持地址重映射的型号,则需在链接脚本中为两个Bank分别生成两份镜像,或使用位置无关代码(PIC)。

TRAVEO Flash 分区与双Bank升级映射 主 Flash 地址空间 Bootloader 区 0x80000000 ~ 0x8001FFFF (128KB) Bank A(活动) Application 镜像 A 0x80020000 ~ 0x8011FFFF (1MB) ● 当前有效 Bank B(升级目标) Application 镜像 B 0x80120000 ~ 0x8021FFFF (1MB) ○ 待写入/待校验 数据区 / 元数据区 版本号、CRC、有效Bank标志 0x80220000 ~ 0x8022FFFF (64KB) 双Bank升级与切换流程 ① Bootloader 接收新固件数据流 (CAN / UART / OTA 通道) ② 擦除并写入非活动 Bank(Bank B) 按 Sector 擦除 → 按 Page 编程 ③ 校验 CRC / 数字签名 比对元数据中的期望值 ④ 更新元数据:有效 Bank 指向 B 写入版本号、CRC、标志位 ⑤ 复位 → Bootloader 读取标志 跳转到新 Bank 执行 ⑥ 启动失败 → 回滚到原 Bank A 元数据仍指向 A,保证可用性

四、升级地址规划的关键约束

地址规划不是"随便划几块",而是受多个硬约束共同决定:

  1. 对齐约束:每个分区的起始地址必须按Sector大小对齐(如32KB对齐),否则擦除操作会波及相邻分区。
  2. 容量约束:Bank A与Bank B必须等大,且能容纳最大可能的Application镜像。若镜像接近Bank容量上限,需预留元数据区空间。
  3. 中断向量约束:Cortex-M内核的中断向量表默认位于Flash起始处。若Application不在0x80000000起始,需在Bootloader中重映射向量表偏移(VTOR),或在链接脚本中将向量表放到Application起始地址。
  4. 链接脚本一致性:Bootloader、Application A、Application B三者的链接脚本必须严格对应各自分区地址,任何一处偏移错误都会导致跳转后HardFault。
  5. 元数据原子性:有效Bank标志的写入必须具备原子性(如使用双字写入+CRC保护),防止掉电导致标志损坏、系统无法启动。

五、一个可参考的地址规划示例

以下给出一个基于CYT4BF、4MB主Flash的示例规划(仅作教学参考,实际项目需根据芯片手册和镜像大小调整):

分区起始地址结束地址大小用途
Bootloader0x800000000x8001FFFF128KB启动、升级协议、Flash驱动
Bank A0x800200000x8011FFFF1MBApplication 镜像 A
Bank B0x801200000x8021FFFF1MBApplication 镜像 B
元数据区0x802200000x8022FFFF64KB版本、CRC、有效Bank标志
数据区0x802300000x8023FFFF64KB标定参数、故障码

该规划中,Bootloader区固定不动,Bank A/B等大且对齐,元数据区独立于两个Bank之外,避免升级时被误擦。实际项目中,若Application镜像超过1MB,需相应扩大Bank容量或压缩固件;若使用Work Flash存放数据,则数据区可移至Work Flash地址空间,进一步降低主Flash擦写压力。

提示:在规划阶段,建议先用芯片手册确认Sector大小和Bank边界,再结合链接脚本、升级协议和回滚策略统一设计。地址规划一旦确定,后续所有固件版本、升级工具、诊断脚本都必须以此为准,不可随意变更。
注意:双Bank机制虽然提供了回滚能力,但并不意味着可以无限次升级。Flash擦写寿命有限(典型10万次),频繁升级会加速Sector磨损。工程上应结合磨损均衡策略,或使用Work Flash承载高频数据,延长主Flash寿命。

总结来说,TRAVEO存储架构与升级映射的核心在于:物理上按Bank/Sector/Page组织,逻辑上按Bootloader/Application/Data分区,升级上按双Bank切换与元数据决策。只有把这三层关系理清,才能在后续的升级协议设计、Flash驱动实现和版本治理中做到地址不冲突、跳转不跑飞、回滚有依据。