打印
[应用相关]

通过 STM32CubeMX 制作外部 Flash 的烧 写驱动(.stdlr)

[复制链接]
712|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 进行工程的配置和生成。新建工程
选择对应的器件,填入工程名称,并选择存放位置:
  




使用特权

评论回复
地板
micoccd|  楼主 | 2022-1-26 09:49 | 只看该作者
管脚配置
按照硬件原理图选择好对应的 Flash 管脚,此处选择为 Bank2,配置如下图。注意调整管脚的速度为 High,同时使能 QSPI
的中断。 FlashSize 值设置为 N, Flash 的大小配置 2N+1


使用特权

评论回复
5
micoccd|  楼主 | 2022-1-26 09:53 | 只看该作者
时钟配置
根据板子上的时钟源,进行对应的时钟配置,此处采用内部作为系统 PLL 的时钟源。  


生成工程
切换到 Code Generator 选项卡,勾选“ Generate perioheral initialization as pair of ‘.c/.h’files per peripheral”选项。

使用特权

评论回复
6
micoccd|  楼主 | 2022-1-26 09:56 | 只看该作者
调试 QSPI 驱动
从开篇提到的 GitHub 仓库中获取相关的驱动代码。  


第一步, 将 External-Loaders\ QSPI testing 目录 mian_test.c 中的代码添加到工程中对应的 main.c 文件中。

/* USER CODE BEGIN 0 */
#include <string.h>
#define SECTORS_COUNT 100
/* USER CODE END 0 */
/* USER CODE BEGIN 2 */
uint8_t buffer_test[MEMORY_SECTOR_SIZE];
uint32_t var = 0;
CSP_QUADSPI_Init();
for (var = 0; var < MEMORY_SECTOR_SIZE; var++) {
buffer_test[var] = (var & 0xff);
}
for (var = 0; var < SECTORS_COUNT; var++) {
if (CSP_QSPI_EraseSector(var * MEMORY_SECTOR_SIZE,
(var + 1) * MEMORY_SECTOR_SIZE - 1) != HAL_OK) {
while (1)
; //breakpoint - error detected
}
if (CSP_QSPI_WriteMemory(buffer_test, var * MEMORY_SECTOR_SIZE,
sizeof(buffer_test)) != HAL_OK) {
while (1)
; //breakpoint - error detected
}
}
if (CSP_QSPI_EnableMemoryMappedMode() != HAL_OK) {
while (1)
; //breakpoint - error detected
}
for (var = 0; var < SECTORS_COUNT; var++) {
if (memcmp(buffer_test,
(uint8_t*) (0x90000000 + var * MEMORY_SECTOR_SIZE),
MEMORY_SECTOR_SIZE) != HAL_OK) {
while (1)
; //breakpoint - error detected - otherwise QSPI works properly
}
}
/* USER CODE END 2 */
注意添加代码时保留 USER CODE BEGIN x 和 USER CODE END x 标签,否则添加的代码会在 Cube MX 重新生成代码时被
覆盖掉。
第二步, 将\External-Loaders\QSPI Drivers\IS25LP128F 目录下的 QSPI 的 HAL 驱动文件替换工程中对应的文件。
  
第三步, 打开 CubeMX,重新生成工程。因为为了适配所有系列的 QSPI 接口, GitHub 所提供 QSPI 的 HAL 驱动中,没有提
供相应的 QSPI 外设配置函数,需要通过 CubeMX 来生成。

第四步, 如上图所示由于每个型号的 FLASH 的控制指令略有差别,所以在此步需要根据自己选用的 QPSI FLASH 器件进行
调整。同时需要进行调试 QSPI 的读写是否正常。如果 QSPIF lash 读写不正常,那么在下图中标注的位置添加断点,就可以
排查是哪一个环节出错,进一步对驱动进行调整。

使用特权

评论回复
7
micoccd|  楼主 | 2022-1-26 09:58 | 只看该作者
修改配置生成 QSPI Loader
完成 QSPI 的驱动调试之后,我们需要添加生成 external Loader 所需要的代码并修改对应的配置。
第一步,添加对应的代码,存放在\External-Loaders\Loader_Files 目录下,由于 H7 和其他的系列的 linker file 有所区别,所
以此处分为 H7 和 others 两个文件夹进行存放。我们此处选用 H7 目录下的问题件。 将所有的文件添加到工程中。  



第二步,修改 Dev_Inf.c 中的 name 为你想设置的名称,一般设置为 MCU+Flash 名称

第三步, 修改 Linker 的配置,通过“ project” -> “Properties ”打开设置页。将红框内的 ld 文件修改为 linker.ld.(已经在第一
步中添加到工程)。
  
第四步,修改配置,编译后生成 stdlr 文件。通过“project” -> “Properties ”打开设置页,在 “post build steps”处添加如
下指令:
cmd.exe /C copy/Y "${BuildArtifactFileBaseName}.elf" "..\STM32H750_IS25LP128F.stldr"

最后,编译便可在工程目录下生成对应的 stdlr 文件。将其复制到 STM32CubeProgrammer 安装目录下的 extral loader 文件
夹下,便可使用。

使用特权

评论回复
8
yljon| | 2022-1-26 09:58 | 只看该作者
要是有这样的板子,亲手实验一把就好了

使用特权

评论回复
9
match007| | 2022-1-26 15:57 | 只看该作者
这个意思是不是把程序放到外部FLASH里,从这个flssh启动并运行

使用特权

评论回复
10
kmzuaz| | 2022-12-5 23:19 | 只看该作者
flash烧录需要注意什么呢?              

使用特权

评论回复
11
iyoum| | 2022-12-10 14:42 | 只看该作者
STM32CubeMX 怎么配置 QSPI Flash

使用特权

评论回复
12
Henryko| | 2022-12-10 15:17 | 只看该作者
从flash里面启动并运行?

使用特权

评论回复
13
adolphcocker| | 2022-12-15 19:21 | 只看该作者
这个是外部更新系统的吗?              

使用特权

评论回复
14
ccook11| | 2022-12-15 21:43 | 只看该作者
这个是远程升级的吗?              

使用特权

评论回复
15
vivilyly| | 2022-12-16 19:59 | 只看该作者
QSPI Flash 的速度可以多少?

使用特权

评论回复
16
Undshing| | 2022-12-17 17:18 | 只看该作者
是从外部flash启动运行吗?

使用特权

评论回复
17
abotomson| | 2022-12-18 11:56 | 只看该作者
STM32CubeMX 配置代码简单多了。

使用特权

评论回复
18
eefas| | 2022-12-18 22:18 | 只看该作者
如何远程升级stm32呢?              

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

104

主题

722

帖子

1

粉丝