[应用相关] 通过 STM32CubeMX 制作外部 Flash 的烧 写驱动(.stdlr)

[复制链接]
1072|17
 楼主| micoccd 发表于 2022-1-26 09:45 | 显示全部楼层 |阅读模式
前言
目前,越来越多的应用需要扩展外部的 Flash 来满足存储需求。那么,在调试及批量生产的过程中,需要对外扩的 Flash 进行
烧录操作。由于 STM32 ST-LINK Utility 以及 STM32CubeProgrammer 中,对 Flash 支持的型号有限,只能覆盖一部分 MCU
和 Flash 的型号,无法完全满足客户的需求。 而且, 它提供的 external loader 的制作模板存在覆盖的芯片型号较少,且无法
前期 QSPI Flash 调试的问题。本文旨在提供一种通过 stm32CubeMX 制作 external Flash loader 的方法。客户可以根据自己
的型号,进行定制化的生成。本文中,以某客户实际使用的 MCU(STM32H750) 和 Flash(S25LP128F) 为例进行讲解。  

 楼主| micoccd 发表于 2022-1-26 09:46 | 显示全部楼层
准备工作
⚫ 安装 STM32CubeIDE
⚫ 安装 MCU 对应型号的 HAL 库
External loader 开发
External Loader 的开发分成三个部分, 第一部分是使用 STM32CubeMX 进行工程的配置及生成。第二部分是外部 Flash 的驱
动调试,主要包含初始化,擦除,写入以及读出等操作。第三部分调用驱动函数进行 external loader 的生成,包括外部 Flash
信息的定义, 包括 Flash 容量的大小, page 的大小, 以及 Sector 相关的信息; 第三步中 external loader 所需要的代码及对应
器件的驱动,可以在下面的 GitHub 仓库中获取,同时也欢迎大家将自己调试好的器件驱动提交到该仓库。
地址: https://github.com/WellinZHANG/External_Loader
 楼主| micoccd 发表于 2022-1-26 09:48 | 显示全部楼层
使用 STM32CubeMX 生成工程
此处, 我们使用 STM32CubeIDE 集成的 STM32CubeMX 进行工程的配置和生成。新建工程
选择对应的器件,填入工程名称,并选择存放位置:
  


8995961f0a845de6d6.png
9686461f0a849b70c5.png
 楼主| micoccd 发表于 2022-1-26 09:49 | 显示全部楼层
管脚配置
按照硬件原理图选择好对应的 Flash 管脚,此处选择为 Bank2,配置如下图。注意调整管脚的速度为 High,同时使能 QSPI
的中断。 FlashSize 值设置为 N, Flash 的大小配置 2N+1
8163561f0a8a034425.png 8948361f0a8a3e435e.png
8416861f0a8a925e3e.png 2145961f0a8acbd7df.png
 楼主| micoccd 发表于 2022-1-26 09:53 | 显示全部楼层
时钟配置
根据板子上的时钟源,进行对应的时钟配置,此处采用内部作为系统 PLL 的时钟源。  

3691561f0a98baed3b.png
生成工程
切换到 Code Generator 选项卡,勾选“ Generate perioheral initialization as pair of ‘.c/.h’files per peripheral”选项。
6672061f0a99faa411.png
 楼主| micoccd 发表于 2022-1-26 09:56 | 显示全部楼层
调试 QSPI 驱动
从开篇提到的 GitHub 仓库中获取相关的驱动代码。  

1192161f0a9edb78e6.png
第一步, 将 External-Loaders\ QSPI testing 目录 mian_test.c 中的代码添加到工程中对应的 main.c 文件中。
5249861f0a9f7e3f13.png
  1. /* USER CODE BEGIN 0 */
  2. #include <string.h>
  3. #define SECTORS_COUNT 100
  4. /* USER CODE END 0 */
  1. /* USER CODE BEGIN 2 */
  2. uint8_t buffer_test[MEMORY_SECTOR_SIZE];
  3. uint32_t var = 0;
  4. CSP_QUADSPI_Init();
  5. for (var = 0; var < MEMORY_SECTOR_SIZE; var++) {
  6. buffer_test[var] = (var & 0xff);
  7. }
  8. for (var = 0; var < SECTORS_COUNT; var++) {
  9. if (CSP_QSPI_EraseSector(var * MEMORY_SECTOR_SIZE,
  10. (var + 1) * MEMORY_SECTOR_SIZE - 1) != HAL_OK) {
  11. while (1)
  12. ; //breakpoint - error detected
  13. }
  14. if (CSP_QSPI_WriteMemory(buffer_test, var * MEMORY_SECTOR_SIZE,
  15. sizeof(buffer_test)) != HAL_OK) {
  16. while (1)
  17. ; //breakpoint - error detected
  18. }
  19. }
  20. if (CSP_QSPI_EnableMemoryMappedMode() != HAL_OK) {
  21. while (1)
  22. ; //breakpoint - error detected
  23. }
  24. for (var = 0; var < SECTORS_COUNT; var++) {
  25. if (memcmp(buffer_test,
  26. (uint8_t*) (0x90000000 + var * MEMORY_SECTOR_SIZE),
  27. MEMORY_SECTOR_SIZE) != HAL_OK) {
  28. while (1)
  29. ; //breakpoint - error detected - otherwise QSPI works properly
  30. }
  31. }
  32. /* USER CODE END 2 */
注意添加代码时保留 USER CODE BEGIN x 和 USER CODE END x 标签,否则添加的代码会在 Cube MX 重新生成代码时被
覆盖掉。
第二步, 将\External-Loaders\QSPI Drivers\IS25LP128F 目录下的 QSPI 的 HAL 驱动文件替换工程中对应的文件。
   4366761f0aa2a3c384.png
第三步, 打开 CubeMX,重新生成工程。因为为了适配所有系列的 QSPI 接口, GitHub 所提供 QSPI 的 HAL 驱动中,没有提
供相应的 QSPI 外设配置函数,需要通过 CubeMX 来生成。
6368361f0aa348f8d9.png
第四步, 如上图所示由于每个型号的 FLASH 的控制指令略有差别,所以在此步需要根据自己选用的 QPSI FLASH 器件进行
调整。同时需要进行调试 QSPI 的读写是否正常。如果 QSPIF lash 读写不正常,那么在下图中标注的位置添加断点,就可以
排查是哪一个环节出错,进一步对驱动进行调整。
9626861f0aa41aacc1.png
 楼主| micoccd 发表于 2022-1-26 09:58 | 显示全部楼层
修改配置生成 QSPI Loader
完成 QSPI 的驱动调试之后,我们需要添加生成 external Loader 所需要的代码并修改对应的配置。
第一步,添加对应的代码,存放在\External-Loaders\Loader_Files 目录下,由于 H7 和其他的系列的 linker file 有所区别,所
以此处分为 H7 和 others 两个文件夹进行存放。我们此处选用 H7 目录下的问题件。 将所有的文件添加到工程中。  

8675661f0aa6c55b5b.png
312061f0aa7712d8b.png
第二步,修改 Dev_Inf.c 中的 name 为你想设置的名称,一般设置为 MCU+Flash 名称
7086361f0aa7f3f941.png
第三步, 修改 Linker 的配置,通过“ project” -> “Properties ”打开设置页。将红框内的 ld 文件修改为 linker.ld.(已经在第一
步中添加到工程)。
9529961f0aa89b789f.png   
第四步,修改配置,编译后生成 stdlr 文件。通过“project” -> “Properties ”打开设置页,在 “post build steps”处添加如
下指令:
  1. cmd.exe /C copy/Y "${BuildArtifactFileBaseName}.elf" "..\STM32H750_IS25LP128F.stldr"
2668161f0aaa45c858.png
最后,编译便可在工程目录下生成对应的 stdlr 文件。将其复制到 STM32CubeProgrammer 安装目录下的 extral loader 文件
夹下,便可使用。
5475961f0aaae797e2.png
yljon 发表于 2022-1-26 09:58 | 显示全部楼层
要是有这样的板子,亲手实验一把就好了
match007 发表于 2022-1-26 15:57 | 显示全部楼层
这个意思是不是把程序放到外部FLASH里,从这个flssh启动并运行
kmzuaz 发表于 2022-12-5 23:19 | 显示全部楼层
flash烧录需要注意什么呢?              
iyoum 发表于 2022-12-10 14:42 | 显示全部楼层
STM32CubeMX 怎么配置 QSPI Flash
Henryko 发表于 2022-12-10 15:17 | 显示全部楼层
从flash里面启动并运行?
adolphcocker 发表于 2022-12-15 19:21 | 显示全部楼层
这个是外部更新系统的吗?              
ccook11 发表于 2022-12-15 21:43 | 显示全部楼层
这个是远程升级的吗?              
vivilyly 发表于 2022-12-16 19:59 | 显示全部楼层
QSPI Flash 的速度可以多少?
Undshing 发表于 2022-12-17 17:18 | 显示全部楼层
是从外部flash启动运行吗?
abotomson 发表于 2022-12-18 11:56 | 显示全部楼层
STM32CubeMX 配置代码简单多了。
eefas 发表于 2022-12-18 22:18 | 显示全部楼层
如何远程升级stm32呢?              
您需要登录后才可以回帖 登录 | 注册

本版积分规则

109

主题

727

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部