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

