我用 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 文件同时烧录到内部存储器和外部存储器中?
|
|