You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32H743VITx调试时pyOCD错误擦除固件地址问题求助

问题描述

在STM32H743VITx设备加载调试目标时,出现以下警告:

:WARNING:builder:Chip erase used when flash address 0x8020000 is not the same as flash start 0x8000000

该警告对应的芯片擦除操作会覆盖bootloader,导致固件在调试会话中崩溃。

已在custom_target.json中设置了正确的mbed_rom_start为0x8020000,Release版本编译烧录正常,但烧录后固件运行崩溃;尝试在线调试时发现,pyocd擦除闪存仍使用默认起始地址0x8000000,而非配置的0x8020000。

相关配置

custom_target.json 配置

"bootloader_supported": true,
"mbed_rom_start": "0x8020000",
"mbed_ram_size":  "0x100000",
"mbed_size":      "0x200000",
"mbed_ram_start": "0x20000000",

调试启动参数

尝试添加base-address参数但服务器启动失败,当前调试标志:

--target STM32H743VITx   --erase=chip --frequency 1800000 --pack '/Library/Application Support/Mbed Studio/mbed-studio-tools/cmsis-packs/Keil.STM32H7xx_DFP.2.7.0-small.pack' -O connect_mode=under-reset

修改过的ARM Pack配置

在./mbed-os/tools/arm_pack_manager/index.json中更新了STM32H743VITx的算法配置:

"algorithms": [
    {
        "default": true,
        "file_name": "CMSIS/Flash/STM32H7x_2048.FLM",
        "ram_size": 1048576,
        "ram_start": 536870912,
        "size": 2097152,
        "start": 134348800
    }
调试日志
Selected port 50000 for debugging
0000452:INFO:board:Target type is stm32h743vitx
0000527:INFO:coresight_target:Asserting reset prior to connect
0000585:INFO:dap:DP IDR = 0x6ba02477 (v2 rev6)
0000639:INFO:ap:AHB-AP#0 IDR = 0x84770001 (AHB-AP var0 rev8)
0000641:INFO:ap:AHB-AP#1 IDR = 0x84770001 (AHB-AP var0 rev8)
0000643:INFO:ap:APB-AP#2 IDR = 0x54770002 (APB-AP var0 rev5)
0000648:INFO:rom_table:AHB-AP#0 Class 0x1 ROM table #0 @ 0xe00fe000 (designer=020 part=483)
0000650:INFO:rom_table:[0]
0000650:INFO:rom_table:  AHB-AP#0 Class 0x1 ROM table #1 @ 0xe00ff000 (designer=43b part=4c7)
0000652:INFO:rom_table:  [0]
0000653:INFO:rom_table:  [1]
0000654:INFO:rom_table:  [2]
0000655:INFO:rom_table:  [3]
0000656:INFO:rom_table:[1]
0000657:INFO:rom_table:[2]
0000658:INFO:rom_table:APB-AP#2 Class 0x1 ROM table #0 @ 0xe00e0000 (designer=020 part=483)
0000660:INFO:rom_table:[0]
0000661:WARNING:rom_table:Invalid coresight component, cidr=0x0
0000661:INFO:rom_table:[2]
0000662:ERROR:rom_table:Error attempting to probe CoreSight component referenced by ROM table entry #5: Memory transfer fault (read) @ 0xe00f0fbc-0xe00f1043
Traceback (most recent call last):
  File "/Library/Application Support/Mbed Studio/mbed-studio-tools/python/lib/python3.7/site-packages/pyocd/coresight/rom_table.py", line 358, in _read_table
    self._handle_table_entry(entry, entryNumber)
  File "/Library/Application Support/Mbed Studio/mbed-studio-tools/python/lib/python3.7/site-packages/pyocd/coresight/rom_table.py", line 408, in _handle_table_entry
    cmpid.read_id_registers()
  File "/Library/Application Support/Mbed Studio/mbed-studio-tools/python/lib/python3.7/site-packages/pyocd/coresight/rom_table.py", line 113, in read_id_registers
    regs = self.ap.read_memory_block32(self.top_address + self.IDR_READ_START, self.IDR_READ_COUNT)
  File "/Library/Application Support/Mbed Studio/mbed-studio-tools/python/lib/python3.7/site-packages/pyocd/probe/stlink_probe.py", line 271, in read_memory_block32
    return self._read_mem(addr, size, Commands.JTAG_READMEM_32BIT, self.MAXIMUM_TRANSFER_SIZE, apsel)
  File "/Library/Application Support/Mbed Studio/mbed-studio-tools/python/lib/python3.7/site-packages/pyocd/probe/stlink/stlink.py", line 343, in _read_mem
    raise exc
pyocd.core.exceptions.TransferFaultError: Memory transfer fault (read) @ 0xe00f0fbc-0xe00f1043
0000664:INFO:cortex_m:CPU core #0 is Cortex-M7 r1p2
0000666:INFO:cortex_m:FPU present: FPv5-D16-M
0000668:INFO:dwt:4 hardware watchpoints
0000671:INFO:fpb:8 hardware breakpoints, 1 literal comparators
0000678:INFO:coresight_target:Deasserting reset post connect
0000683:INFO:server:Semihost server started on port 4444 (core 0)
0000693:INFO:gdbserver:GDB server started on port 50000 (core 0)
Reading symbols from /Users/seanmccully/Sources/CNC/Remora/Firmware/FirmwareSource/Remora-OS6/BUILD/SKRV3/ARMC6/firmware_application.elf...
warning: 
Loadable section "RW_IRAM1" outside of ELF segments
(no debugging symbols found)...done.
0000803:INFO:gdbserver:Client connected to port 50000!
warning: Loadable section "RW_IRAM1" outside of ELF segments
0x080002c2 in ?? ()
0000896:INFO:gdbserver:Attempting to load argon
0000896:INFO:gdbserver:Attempting to load freertos
0000896:INFO:gdbserver:Attempting to load rtx5
0000896:INFO:gdbserver:Attempting to load threadx
0000896:INFO:gdbserver:Attempting to load zephyr
Resetting target with halt
Successfully halted device on reset
Attached to debugger on port 50000
0001539:WARNING:builder:Chip erase used when flash address 0x8020000 is not the same as flash start 0x8000000
0018000:INFO:loader:Erased chip, programmed 201728 bytes (197 pages), skipped 60416 bytes (59 pages) at 15.00 kB/s
Resetting target with halt
Successfully halted device on reset
Image loaded: /Users/seanmccully/Sources/CNC/Remora/Firmware/FirmwareSource/Remora-OS6/BUILD/SKRV3/ARMC6/firmware_application.elf
Note: automatically using hardware breakpoints for read-only addresses.
Program
 received signal SIGSEGV, Segmentation fault.
0xfffffffe in ?? ()
0036510:INFO:gdbserver:Client detached
0036510:INFO:gdbserver:Client disconnected from port 50000!
解决方案

1. 调整调试参数,避免芯片擦除

当前调试命令用了--erase=chip,这是bootloader被覆盖的直接原因。改成只擦除固件占用的扇区:

--target STM32H743VITx --erase=sector --frequency 1800000 --pack '/Library/Application Support/Mbed Studio/mbed-studio-tools/cmsis-packs/Keil.STM32H7xx_DFP.2.7.0-small.pack' -O connect_mode=under-reset

--erase=sector会让pyocd自动识别固件起始地址0x8020000,只擦除对应扇区,不会覆盖bootloader。

2. 修复ELF文件内存布局问题

调试日志中Loadable section "RW_IRAM1" outside of ELF segments警告说明内存段配置异常,这可能是固件崩溃的原因:

  • 检查项目链接脚本(*.ld文件),确保RW_IRAM1段的地址在0x20000000到0x20100000(mbed_ram_start + mbed_ram_size)范围内。
  • 确认链接脚本使用的RAM区域与custom_target.json配置一致。

3. 用pyocd.yaml指定自定义闪存算法

修改arm_pack_manager配置容易被Mbed Studio覆盖,推荐在项目根目录创建pyocd.yaml:

targets:
  STM32H743VITx:
    flash_algorithms:
      - name: STM32H7x_2048
        start: 0x8020000
        size: 0x200000
        ram_start: 0x20000000
        ram_size: 0x100000
        file: "/Library/Application Support/Mbed Studio/mbed-studio-tools/cmsis-packs/Keil.STM32H7xx_DFP.2.7.0-small.pack/CMSIS/Flash/STM32H7x_2048.FLM"

该配置会强制pyocd使用指定的闪存起始地址和大小。

4. 验证bootloader与应用的兼容性

Release版本烧录后崩溃,可能是bootloader跳转或中断向量表问题:

  • 检查bootloader跳转代码,确保跳转到0x8020004(应用复位向量地址,即起始地址+4)。
  • 在应用代码开头添加中断向量表重定位:
SCB->VTOR = 0x8020000;

确保中断向量指向应用起始地址。

5. 调整Mbed Studio调试配置

进入Run > Debug Configurations,选择对应调试配置:

  • 确认目标选择自定义的SKRV3。
  • 取消勾选Erase entire chip,改为Erase sectors used by application。
  • 在Extra arguments中添加-O flash.start=0x8020000,强制指定闪存起始地址。

内容的提问来源于stack exchange,提问作者Sean McCully

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 15:03:10