ZIP下载:LAT1645 使用EMM和EML中间层生成STM32H7RS的外部Flash Loader

关键字: External memory Manager, External memory loader, Flash Loader 


1. 引言 


STM32H7R/S系列是一款基于bootflash的MCU,拥有64 KB用户Flash。这64KB 
Flash一般仅用于存放启动代码,在很多应用中都需要外扩NOR Flash来存放应用代码和素
材,代码和素材烧录到外部Flash还需要通过外部Flash Loader实现。 


由于可选的NOR Flash厂家型号众多,不同厂家的指令,寄存器地址可能不同,以前开
发一个外部Flash Loader需要熟练阅读Flash 手册,了解命令,然后根据同系列的参考代码
进行移植测试,往往需要较长时间进行调试。从STM32H7R/S系列开始,ST 推出了
External memory Manager(EMM)和External Memory Loader(EML)这两个中间层,借助
这两个中间件可以快速开发不同IDE的Flash Loader。 


本文档会从STM32CubeMX开始,基于STM32H7S78-DK开发板,使用EMM和EML
中间层生成外部Flash Loader,方便大家参考该文档制作自己的外部Flash Loader。

 
2. Boot Flash应用组成 


Boot Flash应用由三个子项目组成:Boot工程,Application工程,外部Flash Loader
工程。 


Boot工程:用作启动使用,不需要配置太多外设,尽量简单,一般仅设置系统时钟、存
储器的外设接口,EMM中间件。 


Application 工程:存储在外部存储器中,并由Boot启动,更新系统时钟,
ICACHE/DCACHE管理,更新MPU配置,配置APP用到的外设。  


外部Flash Loader:配置和外部Flash相关的XSPI,配置External Memory Loader中
间件,EML有开发不同目标的加载器入口函数(IAR、MDK-ARM、 
STM32CubeIDE/STM32Programmer)。 


 
2.1. 不同IDE中Loader应用机制概述 


不同IDE中Loader的应用机制是类似的,都是首先将外部Flash Loader加载到MCU
的内部SRAM中,然后通过自动调用一些Flash操作的接口API(初始化/擦除/写/读)等操
作,将目标Bin文件烧录到外部的Flash中。 
 
                          
不同IDE的Flash Loader格式是不同的,STM32CubeIDE,
STM32CubeProgrammer 的Loader格式是stldr,IAR的Loader格式是out,KEIL的
Loader 格式是FLM。格式虽然不同,但功能是一样的。

 
图1. 不同IDE中Loader应用机制 


2.2.   EMM和EML中间层介绍 


在STM32CubeMX中进行外设配置时,新增了EXTMEM_MANAGER和
EXTMEM_LOADER两个中间层。 


EXTMEM_MANAGER 中间层用于协助开发Boot Flash应用程序,提供2种服务,一
个是访问所有类型内存的独特API,另外一个是启动系统,用于启动存储在外部存储器上
的应用程序。 EXTMEM_LOADER 中间层为3种IDE提供不同的加载器入口点,依靠
ExtMem_Manager服务与内存进行交互,使用IDE入口执行标准操作,如(初始化/读取
/写入/擦除/批量擦除/内存映射)。 


图2. EMM和EML中间层 


3. 工程创建 


下面会从STM32CubeMX开始,一步一步配置,最终完成一个包含Boot,
Application,ExtMemLoader 的 LED 点灯程序。打开STM32CubeMX软件,按照图中的
次序,首先创建一个空白工程。 


图3. 选择ACCESS TO MCU SELECTOR 

 
图4. 输入MCU型号开始工程 


图5. 选择Yes 


工程创建好后,会是一个空白工程,配置包括Boot,Application, ExtMemLoader
三部分。

 
3.1. 配置Boot和Appli的MPU

 
这里把ICache和DCache都使能了,在Boot中跳转到App会有关闭ICache和
DCache 的操作,因此需要在Appli再把它Enable。 


图6. 在Boot中配置MPU 

                      图7. 在Application 中配置MPU 


这里是制作Flash Loader测试程序,没有对APP的MPU进行详细配置,具体应用时需
要进行配置。 


3.2. XSPI2 


在Boot和ExtMemLoader中都要勾选。XSPI2可以实现与外部Flash的通讯,在Boot
中需要配置为内存映射模式,在ExtMemLoader中需要用它与外部Flash通讯烧录代码。

 
图8. XSPI 配置界面1 


图9. XSPI 配置界面2 

          
Memory Type 选择:对于NOR Flash,Memory Type一般选择Micron模式或者
Macronix 模式,两者的区别主要在于DDR模式下数据顺序是D1D0还是D0D1,Maronix 
mode(D1D0),Micron(D0D1)。如果是其他品牌的NOR Flash, 如果该Flash只支持STR模
式,那么选Micron或者Macronix模式都可以。如果支持DDR模式,那么可以查看对应的
datasheet,与下图的时序进行对照选择。

 
图10.  Macronix模式和Micron模式DTR时序 


图11. MXIC CSH 时间要求 


关于XSPI配置的参数比较多,以下列表进行了汇总介绍。 


                                                                   表1. XSPI 参数说明 
 

3.3. EXTMEM_MANAGER配置

 
配置EXTMEM_MANAGER ,生成代码时会生成中间件STM32_ExtMem_Manager,里边
会有NOR FLASH的初始化和指令跳转相关函数,并且选择Execute in Place模式,也就是
XIP。 


图12. EXTMEM_MANAGER配置界面1 


图13. EXTMEM_MANAGER配置界面2 


3.4. EXTMEM_LOADER配置 


配置完XSPI和EXTMEM_MANAGER后,才能配置EXTMEM_LOADER。

 
图14. EXTMEM_LOADER配置 




表2. EML参数列表 


图15. Flash MX66UW1G45G Memory块和数量 


                    
3.5. Clock 配置 


根据应用配置时钟参数,XSPI的时钟输入最大是200MHz,由于200MHz对PCB布
线有一定要求,在测试阶段可以先把XSPI时钟配置的低一些,先验证代码功能。功能正
常后再把XSPI配置为200MHz进行高速测试。

 
图16. 时钟配置

 
3.6. GPIO 配置 


查看STM32H7S78-DK原理图,PO1和PO5是LED1和LED2控制引脚,这里在
Application 工程中将PO1和PO5配置为推挽输出模式,然后在App工程里添加LED
翻转代码,可以验证App程序烧录到外部Flash后,能否正常运行。

 

        图17. GPIO配置


3.7. SBS 配置 


XSPI 要在1.8V达到200MHz,XSPI IO需要开启HSLV,这里XSPI速度较低,可以
暂时不用配置。


图18. SBS配置 


3.8. GENERATE CODE生成工程 


输入工程名字,生成Boot, Appli和ExtMemLoader的三合一工程。 


图19. 生成工程

                         
4. 外部Flash Loader 验证 


我们刚刚创建的是一个XIP工程,在Appli中添加一个LED灯翻转的代码,下面通过
STM32CubeIDE,KEIL,IAR 分别验证Flash Loader。 

while (1) 
{ 
HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin); 
HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin); 
HAL_Delay(200); 
/* USER CODE END WHILE */ 
/* USER CODE BEGIN 3 */ 

图20. Application 中LED 翻转代码 



4.1. STM32CubeIDE生成外部Flash Loader 


4.1.1. STM32CubeIDE编译ExtMemLoader生成stldr 


生成代码后,使用STM32CubeIDE打开工程,可以看到Boot,Appli和
ExtMemLoader 三个子工程都生成了。 


图21. STM32H7S78-DK_XIP工程 


首先编译ExtMemLoader子工程。编译之后,在Console会有编译log输出,IDE
的后处理命令会自动把Loader复制到STM32CubeProgrammer下的ExternalLoader
目录,但有可能由于权限问题而复制失败。可以通过修改该文件夹访问权限解决,让stldr
成功复制到C:\Program 
Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin\ExternalLoader 
目录下。 

  • 图22. 修改文件访问权限的方法 


                 
也可手动复制,在STM32CubeIDE\ExtMemLoader\Debug目录下找到后缀为elf的
文件,将其后缀改为stldr(stldr是STM32CubeProgrammer识别的loader格式),
也可以自定义这个stldr的名字,然后将stldr文件复制到ExternalLoader目录。 
复制完后,重新打开STM32CubeProgrammer进行验证。 


图23. STM32CubeProgrammer找到stldr 


STM32CubeProgrammer,在EL一栏,找到对应的stldr,点击Connect。(重新复
制stldr 文件后,需要重新打开STM32CubeProgrammer才能检索到) 
为了XSPI正常的运行在1.8V 200MHz,还需要检查XSPI2_HSLV选项字节。 


图24. OTP124 HSLV_VDDIO3状态 


                        
4.1.2. stldr 的验证 


可以输入0x70000000地址,查看外部Flash的数据。 


图25. 查看外部Flash地址的数据。 


在擦除外部存储器界面,可以选择一个扇区,点击擦除查看结果。  

图26. 扇区擦除测试 


在下载界面选择要下载的Application工程的elf,如果下载检验成功,说明Loader
制作成功了。 


图27. 下载测试 

                      
也可使用STM32CubeIDE下载调试App工程,调试步骤如下所示。 


图28. Debug配置界面1 


图29. Debug配置界面2 


图30. STM32H7S7 XIP调试界面 


4.2. 生成KEIL工程的外部Flash Loader 


要生成KEIL工程的FLM,首先切换Toolchain/IDE为MDK-ARM。

 
图31. 切换IDE为MDK-ARM 

                     
生成代码后,用KEIL打开工程,首先编译下ExtMemLoader子工程,编译结束后,会
有Log,提示FLM已经生成。 


图32. FLM生成Log 


在Appli 工程的属性配置里可以看到FLM已经自动加载了,然后点击调试按钮就可以
下载调试了。 


图33. KEIL Appli工程属性配置 


图34. KEIL 工程调试界面 


                    
4.3. 生成IAR工程的Flash Loader 


图35. 切换IDE为EWARM 


检查Appli工程的Debugger属性,所选的Flash loader如果不是该工程生成的,需
要修改下,例如下图所选路径修改为:
$PROJ_DIR$/../../ExtMemLoader/config/EXTMEM_BOARD.board 


图36. IAR 工程Appli工程Debugger属性检查 


图37. Appli工程的调试界面 


                          
5. 小结 


本文档以STM32H7S78-DK板载的NOR Flash为例,介绍了利用STM32CubeMX的
EMM和EML中间件生成Flash Loader的方法,其他型号的Flash也可也参照此方法创建
Flash Loader。


意法半导体公司及其子公司 (“ST”)保留随时对 ST 产品和 / 或本文档进行变更的权利,恕不另行通知。买方在订货之前应获取关于 ST 产 品的最新信息。 ST 产品的销售依照订单确认时的相关 ST 销售条款。 买方自行负责对 ST 产品的选择和使用, ST 概不承担与应用协助或买方产品设计相关的任何责任。 ST 不对任何知识产权进行任何明示或默示的授权或许可。 转售的 ST 产品如有不同于此处提供的信息的规定,将导致 ST 针对该产品授予的任何保证失效。 ST 和 ST 徽标是 ST 的商标。若需 ST 商标的更多信息,请参考 www.st.com/trademarks。所有其他产品或服务名称均为其 各自所有者的财 产。 本文档是ST中国本地团队的技术性文章,旨在交流与分享,并期望借此给予客户产品应用上足够的帮助或提醒。若文中内容存有局限或与ST 官网资料不一致,请以实际应用验证结果和ST官网最新发布的内容为准。您拥有完全自主权是否采纳本文档(包括代码,电路图等)信息, 我们也不承担因使用或采纳本文档内容而导致的任何风险。 本文档中的信息取代本文档所有早期版本中提供的信息。 © 2020 STMicroelectronics - 保留所有权利

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐