一、问题背景

最近把一个基于 STM32H743 的 Bootloader 工程迁移到一台新电脑上,开发环境使用 Keil5
迁移完成后,工程可以正常打开,H7 芯片包也能识别,代码编译完全通过,但在下载程序时始终失败。

下载时的报错信息如下:

Load "H743_Bootloader\\H743_Bootloader.axf" 
Erase Failed!
Error: Flash Download failed  -  "Cortex-M7"
Flash Load finished

编译输出没有任何错误:

"H743_Bootloader\H743_Bootloader.axf" - 0 Error(s), 0 Warning(s).

也就是说,当前现象很明确:

  • 工程能编译
  • 器件能识别
  • 但是程序烧录不进去

这个问题刚开始看起来像是调试器、接线或者芯片保护的问题,但最后排查下来,根本原因其实是 Keil 的 Flash 烧录算法没有正确安装

这篇文章把整个踩坑过程完整记录一下,方便后面自己查,也希望能帮到遇到同样问题的人。


二、最开始遇到的第一个坑:STM32H7 的 Pack 包安装不规范

在处理下载问题之前,实际上我先遇到了一个更前置的问题:H7 的 DFP 包安装方式不正确

1. 手里没有标准的 .pack 文件

一开始拿到的是一个压缩包或者已经解压的目录,而不是标准的 .pack 文件。
于是尝试把 .zip 改成 .pack,再双击安装。

结果 Keil 弹出错误:

Cannot install Pack:
STM32H7xx_DFP.pack

Cannot find PDSC file at root directory of Pack archive.

2. 这个报错的原因

这个错误的意思是:

Keil 在这个 .pack 压缩包的根目录下,没有找到 PDSC 描述文件。

后来检查目录结构发现,问题不是包坏了,而是 压缩包内部多套了一层文件夹,导致 Keil.STM32H7xx_DFP.pdsc 不在根目录。

错误结构大致如下:

D:\keil5\Packs\Keil\STM32H7xx_DFP\
    └── STM32H7xx_DFP\
          └── 2.3.0\
                ├── Keil.STM32H7xx_DFP.pdsc
                ├── CMSIS\
                ├── Drivers\
                ├── MDK\
                └── ...

而 Keil 能正确识别的结构应该是这样:

D:\keil5\Packs\Keil\STM32H7xx_DFP\
    └── 2.3.0\
          ├── Keil.STM32H7xx_DFP.pdsc
          ├── CMSIS\
          ├── Drivers\
          ├── MDK\
          └── ...

3. 最终处理方式

把 2.3.0 文件夹移动到正确层级后,Keil 就能正常识别 H7 系列器件包了。

此时在:

Options for Target -> Device

中已经可以看到诸如:

  • STM32H743IITx
  • STM32H743VGTx
  • STM32H743ZITx

等器件型号。

说明 DFP 包识别这一步已经成功


三、第二个坑:芯片能识别,工程能编译,但就是下载失败

包安装好之后,本以为问题已经解决了。
结果新建/打开工程后,STM32H743 芯片已经可以正常选择,工程也可以正常编译,说明:

  • 头文件正常
  • 启动文件正常
  • HAL 库正常
  • 工程配置基本正常

但程序一下载就报错:

Erase Failed!
Flash Download failed  -  "Cortex-M7"

这说明问题出在 烧录阶段,不是编译阶段。


四、第一次直觉排查:是不是调试器、芯片连接、读保护的问题?

遇到下载失败时,第一反应一般都会想到这几个方向:

  1. ST-Link 驱动是否正常
  2. SWD 接线是否有问题
  3. 芯片是否上电
  4. 芯片是否被读保护
  5. Flash Download 配置是否正确

这些方向当然都值得排查,但这次问题有一个很关键的线索:

同一个工程,在旧电脑上是可以正常下载的。

这就说明:

  • 工程本身大概率没问题
  • 芯片和硬件大概率也没问题
  • 更可能是 新电脑上的 Keil 环境配置不完整

于是接下来开始对比新旧两台电脑的 Keil 配置。


五、对比旧电脑和新电脑,发现关键差异

1. 旧电脑的 Flash Download 配置

在旧电脑中,打开:

Options for Target -> Debug -> Settings -> Flash Download

可以看到已经存在一条烧录算法:

STM32H7x_2048
Device Size: 2M
Device Type: On-chip Flash
Address Range: 08000000H - 081FFFFFH

也就是说,旧电脑上的 Keil 已经知道:

  • 这是一个 STM32H7 内部 Flash
  • 容量是 2MB
  • 地址范围是 0x08000000 ~ 0x081FFFFF
  • 应该使用 STM32H7x_2048 这个算法进行擦除和写入

这也是旧电脑能够正常下载的关键。


2. 新电脑的 Flash Download 配置

再看新电脑,同样进入:

Options for Target -> Debug -> Settings -> Flash Download

结果发现:

  • Programming Algorithm 列表是空的
  • 点击 Add 后,也找不到 STM32H7x_2048
  • 列表里只有一堆别的器件或者外部 Flash 算法
  • 根本没有 H7 的内部 Flash 算法

这就是问题的核心所在。


六、问题本质:DFP 包装上了,但 Flash 算法没有正确安装

这个问题很容易让人误判,因为表面上看:

  • Keil 已经能识别 STM32H743
  • 工程也能编译通过
  • Device 页面里也能看到 H7 系列芯片

很多人会觉得既然芯片都能选了,那环境应该已经完整了。
但实际上,Keil 识别器件 和 Keil 会不会烧录这个器件 是两回事。

1. DFP 包的作用

DFP(Device Family Pack)主要负责:

  • 器件型号描述
  • 启动文件
  • CMSIS 头文件
  • HAL/驱动支持
  • SVD、系统文件等

所以装好 DFP 后,Keil 能识别芯片,工程也能编译。

2. Flash 算法的作用

真正下载程序到芯片时,Keil 还需要依赖 Flash Programming Algorithm,也就是 .FLM 文件。

以 STM32H743 为例,常见文件是:

STM32H7x_2048.FLM

如果这个文件没有被正确安装到 Keil 的 Flash 算法目录中,那么即使:

  • 芯片识别正常
  • 工程编译正常

也依然会在下载时失败,报出:

Erase Failed!
Flash Download failed - "Cortex-M7"

七、为什么旧电脑可以,新电脑不行?

这个问题最容易让人疑惑。

因为从表面上看,两台电脑的情况都差不多:

  • 都装了 Keil
  • 都装了 H7 的包
  • 都能打开同一个工程
  • 都能识别 STM32H743
  • 编译也都没问题

但实际上,旧电脑的环境比新电脑完整。

旧电脑之所以能用,是因为它具备:

  • 正确的 H7 设备包
  • 正确的 Flash 下载算法
  • STM32H7x_2048.FLM 已经存在于 Keil 可搜索的位置
  • Flash Download 页面已经自动关联了该算法

新电脑之所以不行,是因为:

  • 虽然装上了 H7 的 DFP 包
  • 但 没有把对应的 .FLM 烧录算法文件正确放到 Keil 的 Flash 目录
  • 所以点击 Add 的时候看不到 STM32H7x_2048
  • 结果就是可以编译,但不能擦除/下载

一句话总结:

“能看到芯片”不等于“能下载程序”。


八、最终解决方法

方法:手动补齐 H7 的 Flash Algorithm 文件

这次问题最终的解决思路就是:

把 H7 对应的 .FLM 文件放到 Keil 的 ARM\Flash 目录下,让 Keil 能识别到 STM32H7x_2048 算法。


第一步:找到 H7 的 .FLM 文件

先到 STM32H7 的 Pack 目录里查找 .FLM 文件。
通常可能在如下目录中:

D:\keil5\Packs\Keil\STM32H7xx_DFP\2.3.0\Flash\

或者:

D:\keil5\Packs\Keil\STM32H7xx_DFP\2.3.0\MDK\Flash\

需要找的目标文件通常类似:

STM32H7x_2048.FLM

如果在新电脑上找不到,也可以直接从旧电脑的 Keil 安装目录中拷贝。


第二步:复制到 Keil 的 Flash 目录

将找到的 .FLM 文件复制到:

D:\keil5\ARM\Flash\

这个目录是 Keil 默认存放和检索 Flash Programming Algorithm 的位置。


第三步:重启 Keil

复制完成后,要 完全关闭并重新打开 Keil,否则它不一定会重新加载这些算法文件。


第四步:重新添加 Flash Algorithm

打开工程,进入:

Options for Target -> Debug -> Settings -> Flash Download

点击 Add,此时就应该能看到:

STM32H7x_2048

将它添加进去。

添加成功后,Programming Algorithm 区域应显示类似信息:

STM32H7x_2048    2M    On-chip Flash    08000000H - 081FFFFFH

九、最终正确配置参考

当问题解决后,Flash Download 页面的配置可以参考如下。

1. Download Function

一般选择:

Erase Sectors
Program
Verify
Reset and Run

也可以根据实际情况选择 Erase Full Chip,但大部分情况下 Erase Sectors 就够用了。


2. RAM for Algorithm

我这边最终参考旧电脑的配置:

Start: 0x20000000
Size:  0x00001000

这个参数在旧环境下可正常工作,因此新环境保持一致即可。


3. Programming Algorithm

必须存在:

STM32H7x_2048
Address Range: 08000000H - 081FFFFFH

这项如果没有,下载大概率就会失败。


十、问题定位过程中的一个关键经验

这次排查过程中,有一个经验非常值得记录:

当“旧电脑能下,新电脑不能下”时,优先怀疑环境,而不是代码

因为如果是代码问题,一般会表现为:

  • 编译报错
  • 链接报错
  • 启动异常
  • 运行逻辑错误

而不会表现为:

  • 同一份代码在 A 电脑能下载
  • 在 B 电脑不能下载
  • 而且还是卡在 Flash 擦除阶段

这种情况,优先考虑:

  • Keil 环境是否完整
  • DFP 包是否正确安装
  • 调试驱动是否一致
  • Flash Algorithm 是否存在
  • 工程是否正确关联下载算法

这个思路能省很多时间。


十一、这次踩坑的完整结论

现象

  • STM32H743 工程可以正常编译
  • Keil 中已能识别 H7 芯片
  • 下载时报错:
Erase Failed!
Flash Download failed - "Cortex-M7"

根本原因

新电脑上的 Keil 缺少 STM32H7 内部 Flash 对应的烧录算法,即:

STM32H7x_2048.FLM

没有被正确安装到 Keil 的 Flash 目录中,导致:

  • Flash Download 页面中 Programming Algorithm 为空
  • 点击 Add 后也找不到 STM32H7x_2048
  • 最终造成擦除 Flash 失败

解决方法

  1. 在 Pack 目录或旧电脑中找到:
    STM32H7x_2048.FLM
  2. 复制到:
    D:\keil5\ARM\Flash\
  3. 重启 Keil
  4. 在:
    Options for Target -> Debug -> Settings -> Flash Download
    中点击 Add
  5. 添加:
    STM32H7x_2048
  6. 重新下载,问题解决

十二、给后面排查类似问题的人几点建议

如果你也遇到:

Erase Failed!
Flash Download failed - "Cortex-M7"

建议按下面顺序检查:

第一步:确认芯片能否被识别

看 Keil 中是否已经正确选择了目标芯片,例如 STM32H743IITx


第二步:确认 Flash Download 页面是否有算法

进入:

Options for Target -> Debug -> Settings -> Flash Download

检查:

  • Programming Algorithm 是否为空
  • 是否存在 STM32H7x_2048

第三步:检查 ARM\Flash 目录

确认 Keil 安装目录下是否存在:

STM32H7x_2048.FLM

第四步:对比旧电脑环境

如果手头有一台以前能正常下载的电脑,最省时间的方法就是直接对比:

  • Flash Download 配置
  • ARM\Flash 目录内容
  • Keil Pack 目录
  • 调试器设置

很多问题其实一对比就能看出来。


十三、总结

这次问题表面上是:

STM32H743 工程在 Keil 中下载失败,提示 Erase Failed

但真正的本质是:

H7 的器件包虽然识别了,但对应的 Flash 烧录算法没有装完整。

这类问题非常容易误导人去查:

  • 接线
  • 芯片保护
  • 工程设置
  • 启动文件
  • 代码逻辑

实际上,很多时候根源只是 开发环境缺少 .FLM 文件

所以以后再遇到:

  • 编译正常
  • 器件正常
  • 下载失败
  • 而且旧电脑能下,新电脑不能下

优先检查 Flash Download 里的算法配置,往往能很快找到问题。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐