历史上的今天
返回首页

历史上的今天

今天是:2026年01月12日(星期一)

正在发生

2023年01月12日 | 通过 STM32CubeMX制作外部Flash的烧写驱动

2023-01-12 来源:zhihu

前言

目前,越来越多的应用需要扩展外部的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仓库中获取,同时也欢迎大家将自己调试好的器件驱动提交到该仓库。

地址:

github.com/WellinZHANG/

使用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 x和USER CODE END x标签,否则添加的代码会在Cube MX重新生成代码时被覆盖掉。

第二步

将External-LoadersQSPI DriversIS25LP128F目录下的QSPI的HAL驱动文件替换工程中对应的文件。

第三步

打开CubeMX,重新生成工程。因为为了适配所有系列的QSPI接口,GitHub所提供QSPI的HAL驱动中,没有提供相应的QSPI外设配置函数,需要通过CubeMX来生成。


第四步

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

修改配置生成QSPI Loader

完成QSPI的驱动调试之后,我们需要添加生成external Loader所需要的代码并修改对应的配置。

第一步

添加对应的代码,存放在External-LoadersLoader_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”处添加如下指令:

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

总结

通过该方法可以快速的生成一个外部烧写脚本对外部的QSPI FLASH进行烧录。


推荐阅读

史海拾趣

昆泰芯微电子(CONNTEK)公司的发展小趣事

昆泰芯微电子实行立体作战的研发模式,整合了芯片设计、电子应用设计、工业设计等多家专业设计公司。这种研发模式不仅为公司带来了更多的创新机会,也为工程师们提供了更多的挑战和成长机遇。公司注重员工的培训和发展,有专员负责新人的岗前培训,进行岗位知识的输送以及疑难问题的解答。同时,公司也鼓励员工参与实际项目,由专业领域的前辈进行引领,让员工在实践中快速成长。

Fastron公司的发展小趣事

Fastron公司非常重视与客户的合作关系。公司始终坚持以客户为中心的服务理念,为客户提供优质的产品和服务。Fastron不仅关注客户的需求和反馈,还积极与客户沟通合作,共同推动产品的升级和优化。这种紧密的合作关系使得Fastron与客户之间建立了长期稳定的信任关系,为公司的持续发展提供了有力保障。

Cambridge Electronic Industries Ltd公司的发展小趣事

CEI的发展历程中,技术创新一直是其核心竞争力。公司不断投入研发资源,探索新的电子技术和应用领域。在某一时期,CEI成功研发出了一款具有革命性的电子产品,该产品在性能、稳定性和成本方面均达到了行业领先水平。这一产品的推出,不仅为CEI带来了可观的经济效益,更重要的是,它为公司树立了技术创新和产品质量的标杆,进一步巩固了CEI在电子行业中的地位。

富芯森美(FUXINSEMI)公司的发展小趣事

随着技术实力的不断提升,富芯森美开始积极拓展市场。公司凭借优质的产品和专业的服务,成功打入消费类电子、安防、工控、汽车电子等多个领域。同时,富芯森美还注重品牌建设,通过参加国内外知名展会、举办技术研讨会等方式,不断提升品牌知名度和影响力。这些努力使得富芯森美在电子行业中逐渐崭露头角,成为行业内的佼佼者。

飞翼科技(FEIYI)公司的发展小趣事

随着技术实力的不断提升,富芯森美开始积极拓展市场。公司凭借优质的产品和专业的服务,成功打入消费类电子、安防、工控、汽车电子等多个领域。同时,富芯森美还注重品牌建设,通过参加国内外知名展会、举办技术研讨会等方式,不断提升品牌知名度和影响力。这些努力使得富芯森美在电子行业中逐渐崭露头角,成为行业内的佼佼者。

GHI Electronics公司的发展小趣事

随着业务的不断拓展,GHI Electronics开始实施全球化战略。公司积极寻求与全球合作伙伴的合作机会,共同开拓新市场。同时,GHI Electronics还在多个国家和地区设立了分支机构或研发中心,以便更好地服务当地客户并快速响应市场需求。这种全球化战略布局不仅增强了GHI Electronics的市场竞争力,也为其带来了更多的商业机会和发展空间。

问答坊 | AI 解惑

51系列单片机的UCOS-II

51系列单片机的UCOS-II…

查看全部问答>

医用诊断X射线机的各项标准规范

YY/T 0106-2004 医用诊断X射线机通用技术条件 YY/T 0347-2002 微型医用诊断X射线机通用技术条件 YY/T 0479-2004 医用诊断旋转阳极X射线管最大对称辐射野的测定 YY/T 0481-2004 医用诊断X射线设备-测定特性用辐射条件 YY 0198-1995 10mA医用诊断 ...…

查看全部问答>

quartusII中 如何设置rom大小?

本身集成了一个51的软核,现已有4k rom大小,现因为程序大于4k了我想换成8k,改了地址线和相关配置,但是程序(5k左右)下进去运行不正常,请问怎么才能正确设置rom大小呢?fpga芯片是EP2C5T144C8…

查看全部问答>

正式入驻电子工程世界

浏览各个论坛三年了,每个论坛都去,学习到了不少,最近经常关注电子工程世界论坛,发现办的比以前好多了,今天正式发帖从EDN转战eeworld. 这里不错,经常搞些活动,有空了我也参加。 本人51,430,NXP,M0,M3都会一点,精通模拟电子,希望以后 ...…

查看全部问答>

STM32F102X有什么特点?

                                 STM32F102X有什么特点?…

查看全部问答>

求闲置不用的TI eZ430-RF2500 开发套件

求闲置不用的TI eZ430-RF2500 开发套件 因为学习需要,哪位大哥有闲置不用的TI eZ430-RF2500 开发套件,请转给小弟。 qq:417248409…

查看全部问答>

如何将一个数组定义在flash的特定地址

我想将只读数组定义在flash的特定地址怎么办? 比如const float tp[100]={}; 定义在0xd000开始 不知道怎么搞 请指导一下…

查看全部问答>

【MSP430共享】基于光电耦合器隔离的工业现场无线数据采集与控制系统设计

在工业测控系统中 , 由于现场环境的复杂性 , 使得测控信 号在强弱 电之间转换及传 输时极易受 到干扰 。设计 了一种基于光电耦合 器隔离 的无线数据采集与控制系统 。系统 以 MS P 4 3 0 F 5 4 3 8单片机为核心 , 现场测量信 号通过线性光 电耦 ...…

查看全部问答>