
工程师笔记 | 通过 STM32CubeMX制作外部Flash的烧写驱动 (.stdlr) 通过 STM32CubeMX 制作外部Flash的烧写驱动 (.stdlr) 4 A9 c: S# k: M" Q6 z v {) Z 前言 目前,越来越多的应用需要扩展外部的Flash来满足存储需求。那么,在调试及批量生产的过程中,需要对外扩的Flash进行烧录操作。由于STM32 ST-LINK Utility以及STM32CubeProgrammer中,对Flash支持的型号有限,只能覆盖一部分MCU和Flash的型号,无法完全满足客户的需求。而且,它提供的external loader的制作模板存在覆盖的芯片型号较少,且无法前期QSPIFlash调试的问题。本文旨在提供一种通过stm32CubeMX制作external Flash loader的方法。客户可以根据自己的型号,进行定制化的生成。本文中,以某客户实际使用的MCU(STM32H750) 和Flash(S25LP128F) 为例进行讲解。 准备工作 l 安装STM32CubeIDE l 安装MCU对应型号的HAL库 / Z- `: D& \- j y0 D& FExternal loader开发 4 {, B3 J1 Q8 jExternal Loader的开发分成三个部分,第一部分是使用STM32CubeMX进行工程的配置及生成。第二部分是外部Flash的驱动调试,主要包含初始化,擦除,写入以及读出等操作。第三部分调用驱动函数进行external loader的生成,包括外部Flash信息的定义,包括Flash容量的大小,page的大小,以及Sector相关的信息;第三步中external loader所需要的代码及对应器件的驱动,可以在下面的GitHub仓库中获取,同时也欢迎大家将自己调试好的器件驱动提交到该仓库。 ' p% s9 ^' o9 |: Y4 ^) d使用STM32CubeMX生成工程 0 q f d" a( H; Q. W* o/ L此处,我们使用STM32CubeIDE集成的STM32CubeMX进行工程的配置和生成。 3 d! {: T( T, E; I/ B2 M新建工程 选择对应的器件,填入工程名称,并选择存放位置: ![]() ![]() 管脚配置 + m8 d/ G, K9 ~1 [: F按照硬件原理图选择好对应的Flash管脚,此处选择为Bank2,配置如下图。注意调整管脚的速度为High,同时使能QSPI的中断。FlashSize值设置为N,Flash的大小配置2N+1。 # I3 }- ]2 G, _- v7 P% K4 h/ k" T' B![]() ![]() 时钟配置 & ?" f* |1 w" Y {2 V1 |$ Q根据板子上的时钟源,进行对应的时钟配置,此处采用内部作为系统PLL的时钟源。 ![]() 生成工程 切换到Code Generator选项卡,勾选“Generate perioheral initialization as pair of ‘.c/.h’files perperipheral”选项。 8 n( v; x# g) W) M& e![]() 调试QSPI驱动 从开篇提到的GitHub仓库中获取相关的驱动代码。 ![]() 第一步 2 D# { r2 ^5 x将External-Loaders\ QSPI testing目录mian_test.c中的代码添加到工程中对应的main.c文件中。 ![]() ![]() ![]() ![]() 注意添加代码时保留USER CODE BEGIN x和USER CODE END x标签,否则添加的代码会在Cube MX重新生成代码时被覆盖掉。 T' W: H! G r/ b% `/ P$ c. g第二步 将\External-Loaders\QSPI Drivers\IS25LP128F目录下的QSPI的HAL驱动文件替换工程中对应的文件。 $ Y" t; e7 e# k* m3 L9 b) G![]() 第三步 5 Y1 Z9 i$ g3 E打开CubeMX,重新生成工程。因为为了适配所有系列的QSPI接口,GitHub所提供QSPI的HAL驱动中,没有提供相应的QSPI外设配置函数,需要通过CubeMX来生成。 * p6 H5 V% Z1 N3 M' z, F4 h& @![]() 第四步 ! V- F/ W4 M) _! P8 c V/ c v( w0 \- l如上图所示由于每个型号的FLASH的控制指令略有差别,所以在此步需要根据自己选用的QPSI FLASH器件进行调整。同时需要进行调试QSPI的读写是否正常。如果QSPIF lash读写不正常,那么在下图中标注的位置添加断点,就可以排查是哪一个环节出错,进一步对驱动进行调整。 . V7 s% E% i8 o8 y; x: _' R: O![]() 修改配置生成QSPI Loader 6 T" f4 A5 \, j. D+ e完成QSPI的驱动调试之后,我们需要添加生成external Loader所需要的代码并修改对应的配置。 第一步 2 e9 M1 L* J( L+ F e, X添加对应的代码,存放在\External-Loaders\Loader_Files目录下,由于H7和其他的系列的linker file有所区别,所以此处分为H7和others两个文件夹进行存放。我们此处选用H7目录下的问题件。将所有的文件添加到工程中。 ![]() ![]() 第二步 修改Dev_Inf.c中的name为你想设置的名称,一般设置为MCU+Flash名称。 ![]() 第三步 2 F. _2 L; L n# c( z/ O7 {修改Linker的配置,通过“project”->“Properties ”打开设置页。将红框内的ld文件修改为linker.ld.(已经在第一步中添加到工程)。 ![]() 第四步 修改配置,编译后生成stdlr文件。通过“project”-> “Properties ”打开设置页,在 “postbuild steps”处添加如下指令: ) U ]* z; w. x5 j6 n! p![]() 最后,编译便可在工程目录下生成对应的stdlr文件。将其复制到STM32CubeProgrammer安装目录下的extral loader文件夹下,便可使用。 1 l& \% R5 Q- K$ h; ]" Q/ ?![]() 总结 . C9 C3 n4 q' I; D% |通过该方法可以快速的生成一个外部烧写脚本对外部的QSPI FLASH进行烧录。 , {2 S+ Q: q/ l! R& ~ T, p# @ {2 n; L |