在 STM32H7R/S 系列 MCU 开发中,仅 64KB 的内部 Boot Flash 仅能存放启动代码,复杂应用的程序代码、素材资源必须外扩 NOR Flash 存储。而将程序烧录到外部 Flash,离不开外部 Flash Loader。传统开发需手动适配不同厂商 Flash 的指令与时序,调试周期长、移植难度大;如今借助 ST 推出的EMM(外部内存管理器)与EML(外部内存加载器)中间层,可在 STM32CubeMX 中一键配置,快速生成适配多 IDE 的 Loader,大幅降低开发门槛。本文结合 LAT1645 技术文档与实操经验,从原理到落地,详解完整开发流程。
资料获取:经验分享 | LAT1645 使用EMM和EML中间层生成STM32H7RS的外部Flash Loader
1. 为何需要 EMM/EML?先理清开发痛点与核心价值
1.1 传统 Loader 开发的痛点
市面上 NOR Flash 厂商(如旺宏、镁光)众多,不同品牌的指令集、寄存器地址、时序参数差异极大。以往开发外部 Flash Loader,需逐行阅读 Flash 手册、解析时序逻辑、移植底层驱动,不仅要求开发者精通 Flash 硬件原理,且调试过程繁琐,稍有不慎就会出现烧录失败、数据校验错误等问题,项目周期难以把控。
1.2 EMM/EML 中间层的核心价值
从 STM32H7R/S 系列开始,ST 专为 Boot Flash 型 MCU 推出 EMM 与 EML 中间层,核心是屏蔽硬件差异、标准化开发流程:
- EMM(External Memory Manager):作为底层核心,提供统一的内存访问 API,负责外部 Flash 初始化、时钟配置、内存映射,同时支持从外部 Flash 启动应用程序,无需手动适配不同 Flash 的底层驱动。
- EML(External Memory Loader):依赖 EMM 的底层服务,为不同 IDE 提供标准加载器入口,封装了 Flash 初始化、擦除、写入、读取、校验等通用操作,可直接生成适配 STM32CubeIDE、KEIL、IAR 的 Loader 文件。
简单来说,EMM 负责 “打通 MCU 与外部 Flash 的连接”,EML 负责 “生成 IDE 可识别的烧录工具”,两者配合,让开发者无需关注 Flash 硬件细节,专注于应用开发。
2. 工程架构拆解:三合一项目组成
基于 EMM/EML 开发的工程,由Boot 工程、Application 工程、外部 Flash Loader 工程三部分组成,分工明确、协同工作:
- Boot 工程:极简启动程序,仅配置系统时钟、XSPI 外设与 EMM 中间层,负责初始化外部 Flash 并跳转到外部存储的应用程序,无需复杂外设配置。
- Application 工程:用户实际开发的应用程序(如 LED 点灯、GUI 界面),存储在外部 Flash 中,由 Boot 工程启动运行。
- 外部 Flash Loader 工程:核心目标工程,配置 XSPI、EMM、EML 参数,生成不同 IDE 对应的 Loader 文件(STLD R/FLM/OUT),用于将 Application 工程烧录到外部 Flash。
3. 实操步骤:STM32CubeMX 配置全流程
以下基于 STM32H7S78-DK 开发板(板载 MX66UW1G45G NOR Flash),详解 CubeMX 配置步骤,其他型号 Flash 可参考对应手册适配。
3.1 工程创建与基础配置
打开 STM32CubeMX(建议 6.16.0 及以上版本),选择 MCU 型号 STM32H7S7L8H6H,创建空白工程;弹出 MPU 配置提示时,选择 “Yes” 启用默认 MPU 配置,优化内核预读性能。
3.2 MPU 与 Cache 配置
- Boot 工程:开启 ICache、DCache,配置 MPU 为默认模式,保障启动阶段内存访问稳定。
- Application 工程:重新使能 ICache、DCache(Boot 跳转时会关闭),后续可根据应用需求细化 MPU 分区配置。
3.3 XSPI 外设配置(关键)
XSPI 负责 MCU 与外部 Flash 的通信,Boot 与 Loader 工程均需配置,核心参数如下:
- Mode:Octo SPI(八线 SPI,适配高速 NOR Flash)。
- Memory Type:选择 Macronix 模式(适配旺宏 Flash,DDR 模式下数据顺序为 D1D0;镁光 Flash 选 Micron 模式,D0D1)。
- Memory Size:1Gbit(对应 MX66UW1G45G)。
- Chip Select High Time:配置为 2(200MHz 时钟下,CS 至少拉高 3 个周期,满足旺宏 Flash 10ns 时序要求)。
- Clock Prescaler:默认配置,XSPI 时钟最大不超过 200MHz(PCB 布线达标时可设 200MHz,测试阶段可降频调试)。
- 其他参数:Free Running Clock 设为 Disable,Sample Shifting 设为 Disable(DDR 模式),其余保持默认。
3.4 EMM 中间层配置
启用EXTMEM_MANAGER,核心参数配置:
- Memory Driver:选择
EXTMEM_NOR_SFDP(自动读取 Flash 的 SFDP 参数表,识别容量、时序等信息)。 - Memory Instance:选择 XSPI2(与外设配置一致)。
- Boot Use Case:勾选 “Execute in Place(XIP)”,支持直接从外部 Flash 运行代码。
3.5 EML 中间层配置
启用EXTMEM_LOADER,需先完成 XSPI 与 EMM 配置,核心参数如下:
- Target IDE/Tool:选择
Selected Toolchain(生成对应 IDE 格式:KEIL→FLM、IAR→OUT、CubeIDE→STLDR);选STM32CubeProgrammer则统一生成 STLDR 格式。 - Loader Name:自定义(如
EML_MX66UW1G45G_STM32H7S7-DK),IDE 加载时会显示该名称。 - Start Address:0x70000000(XSPI2 映射的外部 Flash 起始地址,自动生成无需修改)。
- Sector Size:0x10000(64KB,适配 MX66UW1G45G 扇区大小)。
- Number of Sectors:2048(1Gbit Flash 对应 2048 个 64KB 扇区)。
- Page Size:0x1000(4KB,按页写入 Flash,提升校验效率)。
- 超时时间:Program Page 设为 10000ms,Erase Sector 设为 6000ms(不低于 Flash 手册规定值)。
3.6 时钟、GPIO 与 SBS 配置
- 时钟:配置 PLL2 为 XSPI2 提供时钟,最大 200MHz,测试阶段可降频至 100MHz 简化调试。
- GPIO:配置 PO1、PO5 为推挽输出(控制板载 LED,用于验证应用运行状态)。
- SBS:XSPI 运行在 1.8V 时,高速模式需开启 HSLV;低速测试阶段可暂不配置。
3.7 生成三合一工程
输入工程名称,选择生成Boot+Appli+ExtMemLoader三合一工程,CubeMX 会自动生成各子工程代码与配置文件。
4. 多 IDE Loader 生成与验证
4.1 STM32CubeIDE(生成 STLDR)
- 用 CubeIDE 打开工程,编译
ExtMemLoader子工程,生成.elf文件。 - 将
.elf后缀改为.stldr,复制到STM32CubeProgrammer\bin\ExternalLoader目录(权限不足时可手动修改文件夹权限)。 - 打开 STM32CubeProgrammer,连接开发板,在 “外部加载器” 中选择生成的 STLDR 文件,可直接擦除、读取外部 Flash,下载 Application 工程的 ELF 文件,校验成功即表示 Loader 可用。
- 调试时,在 CubeIDE 的 Debug 配置中自动加载 STLDR,可直接下载并调试外部 Flash 中的应用程序。
4.2 KEIL MDK-ARM(生成 FLM)
- 在 CubeMX 中切换 Toolchain 为
MDK-ARM,重新生成工程。 - 用 KEIL 打开工程,编译
ExtMemLoader子工程,编译日志会提示.FLM文件生成完成。 - 打开 Application 工程的调试配置,在 “Flash Download” 中自动加载生成的 FLM 文件,点击调试即可自动下载应用到外部 Flash 并运行。
4.3 IAR EWARM(生成 OUT)
- CubeMX 中切换 Toolchain 为
EWARM,生成工程。 - 用 IAR 打开工程,检查 Application 工程的 Debugger 配置,确保 Loader 路径指向
ExtMemLoader生成的.out文件。 - 编译下载后,开发板 LED 按程序逻辑翻转,验证 Loader 与应用运行正常。
5. 开发总结与避坑要点
5.1 核心优势
- 简化开发:无需手动适配 Flash 时序与指令,CubeMX 可视化配置,降低硬件依赖门槛。
- 多 IDE 兼容:一次配置生成 STLDR/FLM/OUT 三种格式,适配主流开发工具,团队协作更便捷。
- 稳定性强:EMM 底层集成 SFDP 自动识别,适配主流 NOR Flash,减少硬件兼容性问题。
5.2 避坑要点
- XSPI 时钟不超过 200MHz,高速模式需严格匹配 PCB 布线阻抗,否则易出现通信异常。
- Flash 参数(扇区大小、数量、超时时间)需严格参考芯片手册,配置错误会导致擦写失败。
- 生成 STLDR 后需重启 STM32CubeProgrammer 才能识别,权限不足时优先手动复制文件。
本文基于意法半导体 LAT1645 技术文档与实测验证,通过 EMM/EML 中间层,开发者可将外部 Flash Loader 开发周期从数周缩短至数天,大幅提升项目落地效率。后续可基于此框架,适配不同容量、品牌的 NOR Flash,快速实现外部存储应用的烧录与运行。
110