[STM32H7] 在 STM32CubeIDE 中烧录 ELF 文件至内部 + 外部存储器

[复制链接]
70|0
柴库柴库 发表于 2025-11-6 16:04 | 显示全部楼层 |阅读模式

我用 NOR 闪存的 STM32H7A3ZIT6Q 芯片创建了自定义闪存加载器。在 STM32CubeProgrammer 中,我可以使用一个文件对外部存储器执行擦除、编程和读取操作,但烧录包含外部闪存数据的 ELF 文件时会失败。
我的 STM32CubeIDE 项目中,存储器映射配置也已生效:项目在外部闪存段中包含了一些测试数据,这些数据能在构建分析器中正常显示;我还可以将外部存储器段导出为 bin 文件,并通过 STM32CubeProgrammer 手动烧录。调试应用程序时,也能看到测试变量已正确初始化且位于预期的存储地址。
我使用以下命令导出 bin 文件:arm-none-eabi-objcopy.exe -O binary --only-section=.textqspi "${BuildArtifactFileBaseName}.elf" textqspi.bin
已将自定义闪存加载器添加到新的启动配置文件中,得到的输出如下:

STMicroelectronics ST-LINK GDB server. Version 7.1.0

Starting server with the following options:
        Persistent Mode            : Disabled
        Logging Level              : 1
        Listen Port Number         : 61234
        Status Refresh Delay       : 15s
        Verbose Mode               : Disabled
        SWD Debug                  : Enabled

Waiting for debugger connection...
Debugger connected
Waiting for debugger connection...
Debugger connected
Waiting for debugger connection...
Failed to initialize external memory
若在 STM32CubeProgrammer 中先选中右侧的 “外部闪存” 列,再点击 “开始编程”,会出现以下错误:
16:52:39:365 : r ap 0 @0x1FF13FFE 0x00000004 bytes Data 0xFFFF0091
  16:52:39:844 : Memory Programming ...
  16:52:39:844 : Opening and parsing file: IDE-Prothese-base.elf
  16:52:39:854 :   File          : IDE-Prothese-base.elf
  16:52:39:854 :   Size          : 1.81 MB
  16:52:39:854 :   Address       : 0x08000000
  16:52:39:854 : Erasing Segment <0> Address <0x08000000> Size <1901070>Bytes
  16:52:39:854 : Erasing memory corresponding to segment 0:
  16:52:39:854 : Memory erase...
  16:52:39:856 : halt ap 0
  16:52:39:856 : w ap 0 reg 15 PC   (0x24000000)  
  16:52:39:856 : w ap 0 reg 17 MSP  (0x24000500)  
  16:52:39:856 : w ap 0 reg 16 xPSR (0x01000000)  
  16:52:39:859 : w ap 0 @0x24001140 0x00000200 bytes Data 0x00000000
  16:52:39:859 : w ap 0 @0x24000000 0x00000004 bytes Data 0x0000BE00
  16:52:39:861 : w ap 0 @0x24000004 0x00000D10 bytes Data 0x8F4FF3BF
  16:52:39:861 : Erasing internal memory sectors [0 232]
  16:52:39:861 : Init flashloader...
  16:52:39:861 : halt ap 0
  16:52:39:862 : w ap 0 reg 0 R0   0x00000001
  16:52:39:863 : w ap 0 reg 1 R1   0x00000000
  16:52:39:863 : w ap 0 reg 2 R2   0x00000000
  16:52:39:864 : w ap 0 reg 3 R3   0x00000000
  16:52:39:864 : w ap 0 reg 4 R4   0x00000000
  16:52:39:864 : w ap 0 reg 5 R5   0x00000000
  16:52:39:864 : w ap 0 reg 6 R6   0x00000000
  16:52:39:864 : w ap 0 reg 7 R7   0x00000000
  16:52:39:864 : w ap 0 reg 8 R8   0x00000000
  16:52:39:864 : w ap 0 reg 9 R9   0x00000000
  16:52:39:864 : w ap 0 reg 10 R10  0x00000000
  16:52:39:864 : w ap 0 reg 11 R11  0x00000000
  16:52:39:865 : w ap 0 reg 12 R12  0x00000000
  16:52:39:865 : w ap 0 reg 13 SP   0x00000000
  16:52:39:865 : w ap 0 reg 14 LR   0x24000001
  16:52:39:866 : w ap 0 reg 15 PC   0x2400000B
  16:52:39:866 : w ap 0 reg 16 xPSR 0x01000000
  16:52:39:866 : w ap 0 reg 17 MSP  0x24001110
  16:52:39:866 : w ap 0 reg 18 PSP  0x00000000
  16:52:39:866 : run ap 0
  16:52:39:866 : halt ap 0
  16:52:39:866 : r ap 0 reg 0 R0   0x00000001
  16:52:39:866 : Loader sector erase...
  16:52:39:867 : w ap 0 reg 0 R0   0x08000000
  16:52:39:867 : w ap 0 reg 1 R1   0x081D0000
  16:52:39:867 : w ap 0 reg 2 R2   0x00000002
  16:52:39:868 : w ap 0 reg 3 R3   0x00000000
  16:52:39:868 : w ap 0 reg 4 R4   0x00000000
  16:52:39:868 : w ap 0 reg 5 R5   0x00000000
  16:52:39:868 : w ap 0 reg 6 R6   0x00000000
  16:52:39:869 : w ap 0 reg 7 R7   0x00000000
  16:52:39:869 : w ap 0 reg 8 R8   0x00000000
  16:52:39:869 : w ap 0 reg 9 R9   0x00000000
  16:52:39:869 : w ap 0 reg 10 R10  0x00000000
  16:52:39:869 : w ap 0 reg 11 R11  0x00000000
  16:52:39:869 : w ap 0 reg 12 R12  0x00000000
  16:52:39:869 : w ap 0 reg 13 SP   0x00000000
  16:52:39:870 : w ap 0 reg 14 LR   0x24000001
  16:52:39:870 : w ap 0 reg 15 PC   0x2400086B
  16:52:39:870 : w ap 0 reg 16 xPSR 0x01000000
  16:52:39:870 : w ap 0 reg 17 MSP  0x24001110
  16:52:39:870 : w ap 0 reg 18 PSP  0x00000000
  16:52:39:870 : run ap 0
  16:52:40:417 : halt ap 0
  16:52:40:417 : r ap 0 reg 0 R0   0x00000000
  16:52:40:418 : r ap 0 reg 16 xPSR 0x80000003
  16:52:40:418 : Error: failed to erase memory
  16:52:40:441 : Error: failed to erase memory
  16:52:40:441 : r ap 0 @0x1FF13FFE 0x00000004 bytes Data 0xFFFF0091
  16:52:41:411 : r ap 0 @0x1FF13FFE 0x00000004 bytes Data 0xFFFF0091
  16:52:42:417 : r ap 0 @0x1FF13FFE 0x00000004 bytes Data 0xFFFF0091
  16:52:43:421 : r ap 0 @0x1FF13FFE 0x00000004 bytes Data 0xFFFF0091

我已试过多个版本的 STM32CubeIDE,均无法将 ELF 文件烧录至外部存储器。
如何才能将 ELF 文件同时烧录到内部存储器和外部存储器中?


您需要登录后才可以回帖 登录 | 注册

本版积分规则

71

主题

91

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部