STM32H7 QSPI Flash的MDK下载算法实战指南

STM32H7代码运行在外置flash的部分总结 场景 项目中需要用到STM32H750这款ARM cortex-M7内核的单片机,它作为H743的阉割版,它的内置flash只剩下128K。但是对于我们需要有IAP升级的项目来说,这128K(一个扇区)完全不够用,所以需要外置QSPI Flash。但是使用外置QSPI Flash又引入了新的问题。 问题一:需要自己写分散加载文件 首先介绍一下什么是分散加载文件:我们的代码在编译以后,需要由编译器链接到指定内存地址上,平时我们在STM32内置的flash上可以直接使用keil生成的分散加载文件就可以,但是 阅读详情

1. 初识MDK下载算法:为什么需要它?

如果你正在用STM32H7系列芯片做项目,尤其是需要大容量存储的时候,肯定会遇到内部Flash不够用的情况。这时候外挂QSPI Flash(比如W25Q256)就成了救命稻草,但问题来了:怎么把程序下载到这片外部Flash里呢?这就是MDK下载算法要解决的问题。

我刚开始接触这个的时候也挺头疼的,MDK自带的下载算法只支持内部Flash,对外部QSPI Flash无能为力。后来折腾了好久才明白,其实下载算法就是一段特殊的代码,MDK在下载程序时会先把这段代码加载到芯片的RAM里,然后通过它来操作外部Flash完成擦除、编程等操作。

说白了,下载算法就像是MDK和外部Flash之间的翻译官。没有它,MDK就不知道怎么跟你的W25Q256对话。这个算法最后会打包成一个.flm文件,放在MDK的安装目录里,这样每次下载时MDK就知道该怎么操作你的外部Flash了。

2. 准备工作:打造坚实的开发环境

工欲善其事,必先利其器。在开始制作下载算法之前,得先把环境搭好。我这里用的是STM32H743芯片和W25Q256JV Flash,但方法对其他H7系列芯片和QSPI Flash也是通用的。

首先得准备好MDK开发环境,我用的MDK 5.3以上版本。然后要安装STM32H7的DFP包,这个在MDK的Pack Installer里就能找到。HAL库也得准备好,建议用最新版本,避免一些已知的坑。

硬件连接很重要,QSPI的六根线(CLK、CS、IO0-IO3)一定要接对。我当初就因为IO2和IO3接反了,调试了一整天。建议对照芯片手册和板子原理图, double check一下引脚分配。

还得准备一个简单的测试工程,用来验证QSPI Flash是否能正常读写。这个很关键,如果基础读写都不行,那下载算法肯定也做不成。我一般会写个简单的测试程序,能擦除、写入、读取一个扇区就行。

3. 创建算法工程:从模板开始

MDK很贴心地提供了下载算法的模板工程,不用我们从零开始。模板一般在ARM\Packs\Keil\STM32H7xx_DFP\<version>\CMSIS\Flash目录下找。我建议直接复制一份模板,然后在上面修改。

新建工程的时候要注意几点:工程名最好能体现芯片和Flash型号,比如STM32H743_QSPI_W25Q256。器件类型要选对你用的具体型号,这个会影响一些底层配置。输出文件名也要改一下,默认的太泛了。

工程属性里有个很重要的设置:RO和RW段都要设置为位置无关。这个在Options -> Target里勾选"ROPI"和"RWP"I。位置无关代码意味着算法可以被加载到任意地址运行,这是必须的,因为MDK会把算法加载到RAM的某个空闲区域。

还有一个容易忽略的地方是分散加载文件(scatter file)。模板里一般自带一个,我们不需要大改,但要知道它是干嘛的。这个文件定义了代码和数据在内存中的布局,确保算法正确运行。

4. HAL库适配:瘦身与优化

HAL库功能很强大,但对下载算法来说太臃肿了。我们需要对它进行瘦身,去掉不必要的部分。主要修改三个文件:stm32h7xx_hal.c、stm32h7xx_hal_timebase.c和stm32h7xx_hal_msp.c。

最关键是处理时间相关的函数。下载算法里不能用中断,所以要把HAL库中基于systick的延时函数都替换成简单的循环等待。我在HAL_InitTick()函数里直接返回HAL_OK,避免systick初始化。

HAL库里的超时检测机制也得去掉。因为即使超时了,也意味着操作失败,跟死等没区别。我直接把超时检测注释掉,改成while循环等待操作完成。

内存分配相关的函数也要处理。下载算法里不应该用动态内存,所以要把malloc、free这些函数替换成静态分配。我一般定义一个大数组作为内存池,需要内存时从池里分配。

5. 时钟配置:让QSPI飞起来

时钟配置对QSPI性能影响很大。STM32H7的时钟树比较复杂,但咱们不需要用到所有功能,只要把QSPI需要的时钟配好就行。

我先配置PLL,让系统时钟跑到400MHz。H7的QSPI时钟来自PLL,最高可以到133MHz。但实际使用时要注意Flash的支持频率,W25Q256在QSPI模式下最高支持80MHz,所以我一般设置到80MHz。

VOS电压缩放也要配置。H7有三个电压范围:VOS1、VOS2、VOS3。VOS1性能最高,但功耗也最大。下载算法运行时不需要考虑功耗,所以直接用VOS1。

IO补偿单元一定要使能,特别是在高速运行时。这个很多人会忘记,导致信号完整性问题。使能方法很简单,调用HAL_EnableCompensationCell()就行。

6. FlashDev.c配置:告诉MDK你的Flash长什么样

FlashDev.c是下载算法的身份证,它告诉MDK你的Flash的各种参数。这个文件里就一个重要的结构体FlashDevice,我来详细说说每个字段的含义。

FLASH_DRV_VERS是驱动版本号,不要修改,MDK靠这个识别算法格式。设备名可以自己取,但建议包含芯片和Flash型号,这样在MDK的下拉菜单里容易找到。

起始地址很关键,QSPI Flash的内存映射地址是0x90000000,这个不能错。大小也要设对,W25Q256是32MB,即3210241024。

编程页大小设为4096字节,虽然W25Q256的物理页是256字节,但MDK是按页编程的,设大一点可以提高下载速度。擦除后的数值一般是0xFF,因为Flash擦除后就是全1。

等待时间要根据实际操作时间设置。页编程约需1ms,扇区擦除约需60ms,但建议设长一点,避免因工艺偏差导致超时。

7. FlashPrg.c实现:核心功能的编写

FlashPrg.c是下载算法的心脏,实现了初始化、擦除、编程等核心功能。每个函数都有特定的参数和返回值要求,不能随意改动。

Init函数是入口,负责初始化系统和QSPI外设。这里要注意的是,MDK会传入三个参数:基地址、时钟频率和功能代码。基地址通常是0x90000000,但我们实际操作时要减去这个地址,得到Flash内部的偏移地址。

UnInit函数在每次操作结束后调用,负责清理现场。我在这里会把QSPI重新设置为内存映射模式,这样MDK就可以直接读取验证数据了。

EraseSector函数实现扇区擦除。W25Q256的扇区是64KB,擦除前要检查地址是否在有效范围内。擦除完成后最好再读回来验证一下,确保擦除成功。

ProgramPage函数负责页编程。这里有个技巧:虽然Flash的物理页是256字节,但我们可以一次编程4KB,减少操作次数。编程时要分多次写入,每次256字节,直到写完一页。

8. QSPI驱动优化:让数据传输更高效

QSPI驱动是下载算法的底层支撑,它的性能直接影响到下载速度。STM32H7的QSPI支持多种工作模式,我们要根据Flash的特性选择最合适的。

我一般用Quad SPI模式,四线同时传输,速度比传统的SPI快很多。但要注意,W25Q256上电默认是SPI模式,需要先使能QE位,然后发送0x38命令切换到QPI模式。

指令配置很重要。不同的操作需要不同的指令格式:单线指令、双线指令、四线指令。快速读操作用0xEB指令,四线传输,带8个dummy cycle。

DMA传输能大幅提升性能。H7的QSPI支持MDMA,在大量数据传输时特别有用。我一般在编程和读取时启用DMA,减少CPU占用。

内存映射模式是最终目标。配置好之后,CPU可以直接通过0x90000000地址访问Flash内容,就像访问内部Flash一样。这对调试和验证特别有用。

9. 调试与验证:解决那些坑爹的问题

下载算法开发过程中会遇到各种问题,我总结了一些常见坑和解决方法。

最常见的是算法加载失败,提示"Could not load flash programming algorithm"。这通常是因为RAM空间不足,MDK没地方加载算法文件。解决方法是在Options -> Debug -> Settings -> Flash Download里增大RAM for Algorithm的值。

校验失败也是常见问题。有时候程序明明下载成功了,但校验时总是报错。这可能是时钟配置不对,或者信号完整性问题。建议用示波器看看QSPI的波形,确保信号质量。

性能优化很重要。一个好的下载算法应该尽可能快,我通过以下方法优化:使用四线模式、启用DMA、增大编程页大小、合理设置时钟频率。

最后一定要全面测试:擦除测试、编程测试、校验测试、边界测试(擦除最后一个扇区、编程最后一页)。只有全部通过,才能说算法是可靠的。

10. 实际使用:集成到开发 workflow

算法开发完成后,要把它集成到MDK中。把生成的.flm文件复制到MDK安装目录的ARM\Flash文件夹里,这样所有工程都能用了。

在项目的Options -> Debug -> Settings -> Flash Download里添加算法,设置好起始地址和大小。RAM for Algorithm要设足够大,一般至少0x2000。

下载配置也很重要。我习惯把算法加载到DTCM RAM(0x20000000),因为这块RAM速度最快。如果空间不够,也可以用AXI SRAM(0x24000000)。

调试时如果遇到问题,可以启用MDK的调试信息输出,在Debug -> Settings -> Trace里勾选"Enable"和"Trace Output",这样可以看到详细的下载过程信息。

还有一个技巧:如果项目里同时用了内部Flash和外部Flash,可以在Linker里配置分散加载文件,把不同的代码段放到不同的Flash中。比如把启动代码和核心算法放在内部Flash,把资源文件和大数据放在外部Flash。

经过这样一套流程,你的STM32H7就能愉快地使用QSPI Flash了。我在实际项目中用这个方案很久了,稳定性很好,下载速度也很快。虽然第一次配置有点麻烦,但一旦搞定,后续开发就轻松多了。

如何将STM32CubeMX + TouchGFX 工程中生成的图片,字库等超大数组保存到QSPI FLASH (W25Q256) (本人业余时间接相关外包,欢迎联系!) 软件环境:STM32CubeMX5.3 、TouchGFX 4.10.0Designer、uVision5.28.0.0 硬件环境:正点原子阿波罗STM32F767开发板、4.3寸LCD接口屏(480×272)、W25Q256 本博客源码链接(GitHub):https://github.com/ningjw/stm32f7_os/tree/016... 阅读详情

相关推荐

STM32H7 QSPI Flash下载算法制作指南

QSPI(Quad SPI)是一种高速串行通信接口,广泛应用于外部Flash存储器的扩展。在嵌入式开发中,通过QSPI接口可以显著提升外部存储器的访问速度。下载算法是嵌入式编程中的关键技术,它实现了在RAM中运行的特殊代码,用于完成Flash存储器的擦除、编程等操作。针对STM32H7系列微控制器,当使用W25Q256等QSPI Flash时,需要定制专用的MDK下载算法。本文详细解析了如何构建位置无关代码、配置QSPI接口时序,并实现完整的Flash编程功能,帮助开发者解决外部存储器编程难题。

weixin_42561143的博客 665

手把手系列--编写Keil MDK 外部FLASH下载算法

手把手系列--编写Keil MDK 外部FLASH下载算法

coderma的博客 1万+

STM32H753 STM32H743 STM32H750 QSPI W25Q256 下载算法

W25Q256 SPI Nor FLash 挂载在BK1,使用的六个脚为PB2 PB6 PF6 PF7 PF8 PF9。下载算法,适用于LQFP176封装的。映射的地址为0x9000 0000。

c101028的专栏 1172

MDK下载外部SPI FLASH算法制作

在做显示屏的UI界面时,需要用到一些字库文件/UI图转的C数组。但是这些内容大小一般超过单片机的内部flash,所以这些资料一般存在外部介质。本文讲的是如何直接用MDK就将片内单片机程序和片外flash的资料一起通过SWD接口写入。任何支持SWD接口的单片机都可以方便移植的SPI Flash烧写。

weixin_43413437的博客 2087

STM32 QSPI QPI SPI FLASH W25Q256 MDK下载算法FLM文件下载

想要使用正点原子阿波罗的W25Q256 这个32MB的SPI flash作为代码存储和运行闪存,需要BootLoader +APP +下载算法三部分。 先把下载算法复制到D:\MDK\ARM\Flash 打开你的APP,把MDK工程0x8000 0000改成0x9000 0000编译,添加FLM算法到该APP工程。 本算法内给W25Q256设定的映射地址是固定的0x9000 0000 把APP下载到0x9000 0000,这时MDK会根据地址自动下载到地址对应的存储器W25Q256里面了。 BootLoader 工程设置跳转到0x9000 0000,编译下载到0x8000 0000的stm32内部flash,复位。就可以从BootLoader跳转到APP所在的W25Q256即0x9000 0000运行了。 BootLoader在另一个链接里面哦。测试APP在第三个链接里面哦。

MDK KEIL5 i.MX RT1021下载算法

用于MKD5 Keil5 NXP i.MX RT1021芯片Flash下载的算法。

STM32H743 驱动 W25Q256

STM32H743 驱动 W25Q256

烟波随笔 4791

如何编写keil的flash下载算法

如何编写keil的flash下载算法如何编写keil的flash下载算法如何编写keil的flash下载算法如何编写keil的flash下载算法

【STM32H7教程】第80章 STM32H7的QSPI 总线应用之QSPI Flash的MDK下载算法制作

完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第80章 STM32H7的QSPI 总线应用之QSPI Flash的MDK下载算法制作 本章节为大家讲解MDK下载算法制作方法。 80.1 初学者重要提示 80.2 MDK下载算法基础知识 80.3 创建MDK下载算法通用流程 80.4 QSPI Flash的MDK下载算法制作 80.5 QSPI Flash的MDK下载算法使用方法 80.6 ...

Simon223的博客 4404

在MDK中添加自己的FLASH编程算法

在MDK中添加自己的FLASH编程算法,如果MDK编译下载有问题,可以看看,如果想自己写FLASH变成算法,推荐给你。

11 CO配置-控制-成本中心会计-定义分割结构(OKES-Define Splitting Structure)

业务背景:定义分割结构 事务码: OKES SPRO路径:SPRO->控制->成本中心会计->实际过账->期末结算->作业分配->划分->定义分割结构 第1步,SPRO路径进入 第2步,选择“新的条目”创建 分割结构 第3步,选择分割结构代码 点击“分割规则”进行下一个界面,点击“新条目”创建 分割结构规则 第4步,点击“为规则选择” 为分割结构规则创建版本并保存 第5步,选择“分配”,点击“新的条目” 输入分割结构分配

4372

MDK KEIL 下载算法程序 外部存储QSPI FLASH

随言: 在外地出差,闲着也是闲着,写写笔记。 STM32CubeIDE QSPI间接模式和内存映射模式 读写W25Q64: https://blog.youkuaiyun.com/sudaroot/article/details/109097135https://blog.youkuaiyun.com/sudaroot/article/details/109097135 结束: 不想看正文的,下面是已经编辑好的源码,拿好~ 工程有HAL库版本的,寄存器版本的(移植某点原子)。 可以根据自己的硬...

sudaroot的博客 8843

Converting Phase Noise to Random Jitter(Period)

推导了Phase Noise to Random Jitter(Period)的转换过程,解释了分频对Phase Noise & Spur(每2分频改善6dB)的影响,每N分频,TIE RJ(1𝜎)不变(之前已推导),而Period RJ(1𝜎)增加√N倍。

u010486560的博客 2040

【STM32H750】玩转ART-Pi(二)——制作MDK的外部QSPI-FLASH烧录算法

目录 在ART-Pi H750上移植TouchGFX(一)——使用STM32CUBMX生成TouchGFX工程 在ART-Pi H750上移植TouchGFX(二)——制作MDK的外部QSPI-FLASH烧录算法 在ART-Pi H750上移植TouchGFX(三)——移植TouchGFX到RT-Thread系统 在ART-Pi H750上移植TouchGFX(四)——使用RT-Thread Studio移植TouchGFX 在ART-Pi H750上移植TouchGFX(五)——制作ST-LINK的外部Q

sinat_31039061的博客 1万+

Fluent温度超限调试:从能量方程到网格优化的实战指南

本文深入解析Fluent中温度超限问题的诊断与解决方法,从能量方程机制到网格优化策略,提供实战指南。通过分析温度与焓的换算关系,探讨典型场景如能量方程发散、局部网格质量差等,并给出五步调试法及高级命令应用,帮助工程师有效解决温度计算异常问题。

weixin_29045585的博客 531

100kHz手持LCR表设计:高频阻抗测量与校准实战解析

阻抗测量是电子元件测试的基础,LCR表通过施加正弦激励并分析电压电流的幅值与相位,即可获取电容、电感、电阻的等效参数。在开关电源、无线充电等高频应用场景中,元件在100kHz下的ESR和阻抗特性尤为关键,传统10kHz手持仪表难以满足需求。本文从自动平衡桥原理出发,探讨如何将台式电桥的核心能力浓缩至手持设备,重点剖析高频寄生参数抑制、模拟链路设计、数字相敏检波算法及开路短路校准方法。通过实测数据验证,在100kHz频率下基本精度可达0.5%以内,为维修现场、产线抽检及硬件调试提供了可携带的精密测量方案。全文

weixin_33910191的博客 398

【STM32H7教程】第81章 STM32H7的QSPI 总线应用之QSPI Flash的STM32CubeProg下载算法制作

完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第81章 STM32H7的QSPI 总线应用之QSPI Flash的STM32CubeProg下载算法制作 本章节为大家讲解STM32CubeProg下载算法制作方法。 81.1 初学者重要提示 81.2 STM32CubeProg简介 80.3 STM32CubeProg下载算法基础知识 80.4 创建STM32CubeProg下载算法通用流程 ...

Simon223的博客 4044

Keil5编译报错:ARM Compiler Version 5缺失的完整解决方案

本文提供了Keil5编译报错“ARM Compiler Version 5缺失”的完整解决方案。详细介绍了手动安装ARM Compiler Version 5的步骤,包括下载安装包、配置编译器路径及常见问题排查,帮助开发者快速恢复老项目的编译环境。

bb456的博客 946

STM32H750片外QSPI启动配置简要

STM32H750片外QSPI启动配置简要

perseverance51博客 1万+

使用mid360运行lio-livox对比fast-lio2

msg_type为激光雷达发出的数据格式,有livox自定义数据类型格式CustomMsg和ros标准的PointCloud2格式,因此首先需要确定激光雷达端配置的是哪种格式。可以从激光雷达的ros驱动中看到驱动端有三种格式可以选,驱动端的数字2对应lio-livox中的1,驱动端的0对应lio-livox的格式0。如果使用的是Ubuntu18.04编译完成后运行直接成功,如果使用20.04运行会报错,需要修改以下源代码。针对livox-mid360 运行lio-livox的一些问题。

z1872385的博客 1231

推荐系统中召回率Recall计算方式附代码

Recall(召回率)是指在所有实际有交互的用户 - 物品对中,推荐系统成功预测出的比例。具体来说,设所有有交互的用户 - 物品对为S,推荐系统预测出的用户 - 物品对为T,则Recall的计算公式为:

优快云 精品推荐 1843

【STM32H7教程】第82章 STM32H7的QSPI总线应用之QSPI Flash执行程序(BOOT+APP方式)

完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第82章 STM32H7的QSPI总线应用之QSPI Flash执行程序(BOOT+APP方式) 本章节为大家讲解QSPI Flash执行程序。 目录 第82章 STM32H7的QSPI总线应用之QSPI Flash执行程序(BOOT+APP方式) 82.1 初学者重要提示 82.2 下载算法存放位置 82.3 QSPI Flash的...

Simon223的博客 5833

西门子SMART PLC增量式PID(完整梯形图FC)

西门子PLC自带的PID指令是基于位置型的PID,位置型PID的算法公式和详细介绍,大家可以参看《PID专栏》的其它文章,这里不再赘述。本篇博文直接给出代码部分的讲解,不设计太多公式和理论的推导。限于本人能力,文中难免出现错误和不足之处,诚恳欢迎大家的批评和指正。同时感谢大家的订阅和关注。SMART200 PLC系统自带的PID指令解析,可以参看下面这篇文章:SMART PLC PID算法基本解析(附公式)_RXXW_Dor的博客-优快云博客_plc的pid算法在态运行中,控制器调节输出值,使偏差 (e

RXXW_Dor的博客 8149

【STM32H7教程】第83章 STM32H7的内部Flash和QSPI Flash都运行程序的混合方式(强烈推荐)

完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第83章 STM32H7的内部Flash和QSPI Flash都运行程序的混合方式(强烈推荐) 本章节为大家讲解内部Flash和外部QSPI Flash都运行程序的混合方式。 83.1 初学者重要提示 83.2 内部Fkash和QSPI Flash混合执行程序的优势 83.3 下载算法存储存放位置 83.4 内部Flash和QSPI Flash混合...

Simon223的博客 4881

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

stm32之外部flash下载算法

通过MDK创建一批与地址信息无关的函数,实现的功能主要有初始化,擦除,编程,读取,校验等,然后MDK调试下载阶段,会将算法文件加载到芯片的内部RAM里面(加载地址可以通过MDK设置),然后MDK通过与这个算法文件的交互,实现程序下载,调试阶段数据读取等操作。(1) 程序里面的操作adr -= QSPI_FLASH_MEM_ADDR,实际传递进来的地址是带了首地址的,即0x90000000。这个名字是方便用户查看的,比如设置为daiver_h7,那么输出的算法文件就是daiver_h7.flm。

c1063891514的博客 2906

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【STM32H7教程】第85章 STM32H7的SPI 总线应用之SPI Flash的STM32CubeProg下载算法制作

完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第85章 STM32H7的SPI 总线应用之SPI Flash的STM32CubeProg下载算法制作 本章节为大家讲解STM32CubeProg下载算法制作方法。 85.1 初学者重要提示 85.2 STM32CubeProg简介 85.3 STM32CubeProg下载算法基础知识 85.4 创建STM32CubeProg下载算法通用流程 8...

Simon223的博客 3090

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

上一篇: 从L298N到BTS7960:电机驱动模块的功耗进化史与未来趋势
下一篇: 基于STC15W408AS与NRF24L01的2.4G无线音频传输系统设计与实现
devops8pract
博客等级 码龄4年 533粉丝 849原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值