
简介STM32H750与W25Q128烧录算法工程面向需要在STM32H7系列上通过外部SPI Flash扩展程序存储的嵌入式开发者。该工程提供了一套完整的Keil MDK烧录算法方案解决将固件烧入W25Q128并实现执行的关键问题。压缩包共80个文件约2.54MB主要包含FLM算法文件、FlashDev.c与FlashPrg.c源码、Keil工程配置文件uvprojx/uvoptx、启动文件及调试配置文件类型涵盖源码、头文件、目标文件、链接脚本与日志等工程结构清晰便于直接参考或二次修改。已有3779人学习适合熟悉STM32CubeMX/HAL库但初次接触外部Flash烧录算法的读者。通过该工程可系统掌握SPI/QSPI接口初始化、擦除命令选择、页编程写入、快速读取及数据校验等完整流程并理解错误处理机制为后续自研Flash Bootloader或程序升级方案打下扎实基础。 如果你买过STM32H750的开发板大概率经历过这个场景网上下载的例程工程编译一跑提示 Image size exceeds ROM size打开 Map 文件一看固件 200 多KB而芯片内部 Flash 总共只有 128KB。我第一反应是编译器出 Bug 了后来翻手册确认——H750 确实只有 128KB 内部 Flash。于是几乎所有 H750 开发板模组星球那类板子就是典型都把 W25Q128 这颗 16MB 的 SPI NOR Flash 焊在板上内存映射到 0x90000000代码直接在里面跑。目标很美但第一步就把很多人拦住了调试器根本不知道外部这颗 Flash 的存在烧录算法Flash Algorithm就是专门解决这个问题的。这篇文章我会从零到一讲清楚为什么 H750 需要外部 Flash烧录算法的原理是什么怎么用 Keil 手搓一个 W25Q128 的 FLM 算法文件以及怎么在 Keil 和 J-Flash 里挂载它完成烧录。适合两种情况的朋友一是想把程序直接放到外部 QSPI Flash 里跑的二是需要在产线上用 J-Flash 独立烧录 H750 外部 Flash 的。1. 128KB的H750代码到底塞哪去1.1 这个神级芯片的Flash闹剧把 H750 和 H743 放在一起看就很有意思两者几乎一模一样都是 Cortex-M7 内核、480MHz 主频、双精度 FPU、一大堆外设唯一明显的区别就是 H743 有 2MB 内部 Flash而 H750 只有 128KB。而且 H750 的价格比 H743 便宜不少很多做低成本高性能产品的工程师就盯着这个差价打算用 H750 外挂一颗 QSPI Flash 来替代 H743。但现实是在不少新手的板子上H750 就是个大号单片机程序稍微大一点就装不下。你可能会想128KB 也够写点简单的点灯程序了吧够是够可一旦上了 RTOS、LVGL 图形界面、或者一些协议栈固件体积立刻冲破 128KB。到了这一步你只有两个选择换 H743贵或者外挂 Flash便宜但折腾。绝大多数人都会选后者。1.2 W25Q128为什么成了外部Flash的标准答案市面上 H750 开发板几乎统一选择 W25Q128不是没有道理的。W25Q128 是华邦Winbond出的一块 128Mbit16MB的 SPI NOR Flash工作电压 3.3V使用标准 SPI、Dual SPI、Quad SPI 接口四线模式下读取带宽可以轻松跑上百 MHz。关键在于 NOR Flash 支持随机读取和片上执行XIPCPU 可以直接在地址总线上看到它把地址映射到 0x90000000 之后取指令、读常量都像访问内部 Flash 一样。NAND Flash 就不行它按块读取XIP 支持很差驱动也复杂所以 W25Q128 这类 NOR Flash 在 MCU 的场景里就是唯一解。1.3 烧录算法在这条链路里扮演什么角色调试器Keil 里的 ULINK/ST-Link或者 J-Flash 里的 J-Link本身只知道怎么操作芯片内部的 Flash它并不认识外部这颗 W25Q128。要让调试器能擦除、写入、校验外部 Flash必须给它提供一段烧录算法——一个极小的、会被下载到 MCU SRAM 中运行的程序。调试器通过标准接口调用这段程序里的函数由 MCU 上的 QUADSPI 外设去控制 W25Q128。打个比方调试器是装修队它手里只有内部房子的图纸烧录算法就是你临时塞给装修队的外部房屋施工图装修队能照章施工但不会凭空造出新图纸。Keil 里算法的载体就是 .FLM 文件J-Flash 加载的也是它。2. 动手前先吃透W25Q128和QUADSPI的基本功2.1 W25Q128的地址、页和扇区写烧录算法之前必须先把 W25Q128 存储结构搞清楚否则程序里的擦除粒度、页大小容易搞错。这颗 Flash 的容量是 16MB地址范围 0x000000 ~ 0xFFFFFF。它的最小可擦除单位是 4KB 的扇区Sector此外还有 64KB 的块Block和全片擦除。写入的最小单位是页Page每页 256 字节页面编程时一次最多写 256 字节。弄清楚这些参数后面 FlashDev.c 里的扇区布局和 ProgramPage 里循环拆页的逻辑就都顺理成章了。存储单位大小说明Page页256 字节页编程最大写入单位写超过会绕回页内偏移Sector扇区4KB最小擦除单位通常算法里 EraseSector 用 4KBBlock块64KB大块擦除批量擦除时用Chip整片16MB全片擦除耗时较长2.2 QUADSPI的两种操作模式STM32H750 的 QUADSPI 外设有两种核心工作模式烧录算法里几乎都会用到。第一种是间接模式Indirect Mode也就是寄存器操作模式。你想要发什么命令、传什么数据都可以通过 QUADSPI 的控制寄存器CCR、地址寄存器AR和数据寄存器DR来拼装完成。烧录算法里擦除扇区、页编程、读状态寄存器都是在这个模式下完成的。第二种是内存映射模式Memory-Mapped Mode。配置好之后QUADSPI 会把外部 Flash 映射到 MCU 的地址空间0x90000000 是 QUADSPI1 Bank1 的映射基地址。CPU 直接读写这个地址范围QUADSPI 控制器会自动翻出对应的 Flash 命令去取数据。程序在外部 Flash 上直接执行靠的就是这个模式。2.3 常用命令和时序不要记错W25Q128 的操作本质上就是发指令几个关键命令必须烂熟于心命令指令码说明Read JEDEC ID0x9F读取芯片 ID验证通信Read Status Register0x05读取状态寄存器检查 BUSYWrite Enable0x06写使能擦除和编程前必须发Sector Erase0x204KB 扇区擦除Page Program0x02页编程单线写入Fast Read Quad I/O0xEB四线快速读内存映射模式常用Quad Input Page Program0x32四线页编程配合 QE 位使用如果你想用四线模式那在初始化阶段还得把 W25Q128 的状态寄存器2 的第1本文还有配套的精品资源点击获取