芯驰 E3 国产 Flash 替换指南
支持的型号
目前芯驰官方支持的 Flash 类型如下:

启动与存储
MCU 的在启动时分为内置 Flash 和外置 Flash。一般内置 Flash 的初始化都固定在 MCU 的 BootROM 部分,用户无需关心。外置 Flash 则需要用户考虑完整的初始化过程。芯驰 E3 则是属于外置 Flash 的类型。
如何替换配置
首先需要考虑与 Flash 配置相关的 SFS 文件本身,芯驰 E3 的 Flash 配置主要是在 SFS 镜像中进行配置的,具体参数可以参考 芯驰 E3 启动及升级机制详解 的 SFS 部分。关于 SFS 如何选择可以参考 Flash 类型对应的 SFS 文件表:
| 序号 | 文件名称 | 使用说明 | 备注 | 
|---|---|---|---|
| 1 | sfs_is25-1-1-4.img | 适用于所有 spi flash、is25 系列、gd25 系列 | 4 线模式 | 
| 2 | sfs_mt35_ospi_fast_read.img | 适用于 e3_gateway mt35 系列 ospi flash | 8 线模式,速率较快 | 
| 3 | sfs_mt35-1-1-1.img | 适用于所有 nor flash | 1 线模式,速率较慢 | 
| 4 | sfs_s26h-hyperflash.img | 适用于所有 hyperflash | 默认选项 | 
其次,因为 Hyper Flash 和 Nor Flash 在 Sector 大小上的差异,所以各个部分的内存中的分布是不同的,这就需要考虑跟内存相关部分的配置了。我们下面来分析一下哪些配置涉及到内存:

- icf:这里面定义了程序的运行地址,与 Flash 本身无关
 
define region TCM = mem:[from 0x40 to 0xffff];
define region FLASH = mem:[from 0x100c1000 to 0x107fffff];
define region IRAM = mem:[from 0x404000 to 0x5fffff];
- flashloader:这个配置定义了如何将编译后的代码烧录到 Flash 存储器中,和 Flash 有很大的关系。以下深入讲解这部分的配置:
 
<?xml version="1.0" encoding="UTF-8"?>
<flash_board>
    <pass>
        <loader>sfs.flash</loader>
        <range>CODE 0x10000000 0x10000080</range>
        <abs_offset>0x10000000</abs_offset>
        <args>
            255
            0
        </args>
    </pass>
    <pass>
        <loader>sf.flash</loader>
        <range>CODE 0x404000 0x7fffff</range>
        <abs_offset>0x100c1000</abs_offset>
        <args>
            0
            1
            0x404000
        </args>
    </pass>
</flash_board>
这个 board 文件定义了 Flash 烧录过程,包含两个 pass,分别指定了 sfs 和 sf 地址相关信息以及一些 flash 配置项参数。下面我们再来看一下 sfs 和 sf 文件的内容:
<?xml version="1.0" encoding="UTF-8"?>
<flash_device>
  <exe>../../flashloader_hyperflash.out</exe>
  <macro>../../iar_flashmacro.mac</macro>
  <page>512</page>
  <block>1 0x40000</block>
  <flash_base>0x10000000</flash_base>
  <aggregate>1</aggregate>
</flash_device>
- exe(flashloader):这是一个 Flash 烧录程序,负责将数据写入 Flash
 - macro:定义了 Flash 操作的宏定义,擦除、写入、校验等
 - page:表示 Flash 以 512 字节为单位进行操作
 - block:表示 Flash 以 0x40000 (256 KB)为单位分块
 - flash_base:表明 sfs.flash 存储在 Flash 的 0x10000000 位置
 - aggregate:表明多个 Flash 设备可以聚合操作
 
系统上电后,ROM 代码会读取 SFS 结构,以便初始化 Flash 并找到 Boot Package。
<?xml version="1.0" encoding="UTF-8"?>
<flash_device>
  <exe>../../flashloader_hyperflash.out</exe>
  <macro>../../iar_flashmacro.mac</macro>
  <page>512</page>
  <block>9 0x40000</block>
  <flash_base>0x100C1000</flash_base>
  <aggregate>1</aggregate>
</flash_device>
这个文件 sfs.flash 结构类似但有以下不同:
- block:表明主程序存储区域包含 9 个 Flash 块
 - flash_base:表明 sf.flash 存放在外部 Flash 的 0x100c1000 位置
 - page:表明 Flash 以 512 字节为单位进行操作
 
实际操作步骤
- 在 IAR 的 Options->Linker->Extra Options 中的 sfs.img 替换成对应类型的镜像
 
--manual_dynamic_initialization
--image_input $PROJ_DIR$\..\sfs\sfs_mt35-1-1-1.img,SFS_BIN,SFS_BIN,8
--keep SFS_BIN
- 在 IAR 的 Options->Debugger->Download 中的 board 部分替换为对应类型的配置
 
$PROJ_DIR$\Config\ddf\3420\flashloader\iram\norflash\iar_flashboardcfg_sf_iram.board