通过 STM32CubeMX 制作外部 Flash 的烧 写驱动(.stdlr)
前言目前,越来越多的应用需要扩展外部的 Flash 来满足存储需求。那么,在调试及批量生产的过程中,需要对外扩的 Flash 进行
烧录操作。由于 STM32 ST-LINK Utility 以及 STM32CubeProgrammer 中,对 Flash 支持的型号有限,只能覆盖一部分 MCU
和 Flash 的型号,无法完全满足客户的需求。 而且, 它提供的 external loader 的制作模板存在覆盖的芯片型号较少,且无法
前期 QSPI Flash 调试的问题。本文旨在提供一种通过 stm32CubeMX 制作 external Flash loader 的方法。客户可以根据自己
的型号,进行定制化的生成。本文中,以某客户实际使用的 MCU(STM32H750) 和 Flash(S25LP128F) 为例进行讲解。
准备工作
⚫ 安装 STM32CubeIDE
⚫ 安装 MCU 对应型号的 HAL 库
External loader 开发
External Loader 的开发分成三个部分, 第一部分是使用 STM32CubeMX 进行工程的配置及生成。第二部分是外部 Flash 的驱
动调试,主要包含初始化,擦除,写入以及读出等操作。第三部分调用驱动函数进行 external loader 的生成,包括外部 Flash
信息的定义, 包括 Flash 容量的大小, page 的大小, 以及 Sector 相关的信息; 第三步中 external loader 所需要的代码及对应
器件的驱动,可以在下面的 GitHub 仓库中获取,同时也欢迎大家将自己调试好的器件驱动提交到该仓库。
地址: https://github.com/WellinZHANG/External_Loader 使用 STM32CubeMX 生成工程
此处, 我们使用 STM32CubeIDE 集成的 STM32CubeMX 进行工程的配置和生成。新建工程
选择对应的器件,填入工程名称,并选择存放位置:
管脚配置
按照硬件原理图选择好对应的 Flash 管脚,此处选择为 Bank2,配置如下图。注意调整管脚的速度为 High,同时使能 QSPI
的中断。 FlashSize 值设置为 N, Flash 的大小配置 2N+1。
时钟配置
根据板子上的时钟源,进行对应的时钟配置,此处采用内部作为系统 PLL 的时钟源。
生成工程
切换到 Code Generator 选项卡,勾选“ Generate perioheral initialization as pair of ‘.c/.h’files per peripheral”选项。
调试 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;
uint32_t var = 0;
CSP_QUADSPI_Init();
for (var = 0; var < MEMORY_SECTOR_SIZE; var++) {
buffer_test = (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 读写不正常,那么在下图中标注的位置添加断点,就可以
排查是哪一个环节出错,进一步对驱动进行调整。
修改配置生成 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 文件
夹下,便可使用。
要是有这样的板子,亲手实验一把就好了 这个意思是不是把程序放到外部FLASH里,从这个flssh启动并运行 flash烧录需要注意什么呢? STM32CubeMX 怎么配置 QSPI Flash 从flash里面启动并运行? 这个是外部更新系统的吗? 这个是远程升级的吗? QSPI Flash 的速度可以多少? 是从外部flash启动运行吗? STM32CubeMX 配置代码简单多了。 如何远程升级stm32呢?
页:
[1]