ST意法半导体
直播中

王斌

8年用户 1395经验值
私信 关注
[问答]

STM32H7双核调试,CM7能成功调试但CM4始终报\"Failed to read ROM table via AP 3\"错误是怎么回事?

我正在使用STM32CubeIDE对STM32H7系列双核微控制器进行开发和调试,但遇到了一个顽固的问题,希望能得到社区的帮助和建议。

### 问题描述
我根据应用手册AN5361,使用内置示例项目GPIO进行测试使用。
我能够成功编译、烧录和调试Cortex-M7核心的程序,但当尝试调试Cortex-M4核心时,总是收到以下错误信息:

```
Error in final launch sequence:
Failed to start GDB server
Failed to start GDB server
ST-Link设备进行初始化时出错。
原因:(255) 未知原因。请检查连接到目标机的电源和电缆。
```

更具体地,调试控制台显示:

```
Failed to read ROM table via AP 3
Error in initializing ST-LINK device.
Reason: Unknown. Please check power and cabling to target.
```

### 我已尝试的解决方案

1. **检查并配置了选项字节** :
   * 通过STM32CubeProgrammer验证了BCM4(CM4启动选项)已被启用
   * NRST_STOP_D2和NRST_STBY_D2也都已正确启用
   * 引导地址也正确配置(CM7: 0x08000000, CM4: 0x08100000)
2. **调试器配置** :
   * CM7配置:Access port设为"0 - Cortex-M7",Reset behavior设为"Connect under reset"
   * CM4配置:Access port设为"3 - Cortex-M4",Reset behavior设为"None"
   * 两个配置都启用了"Enable shared ST-LINK"
   * CM4的端口号比CM7高3(CM7: 61234, CM4: 61237)
   * 在CM4的Startup选项卡中禁用了下载(因为CM7已负责下载)
3. **启动顺序** :
   * 先启动CM7调试会话并让其运行
   * 然后尝试启动CM4调试会话
   * 确保CM7代码中包含释放硬件信号量的代码,以唤醒CM4
4. **连接测试** :
   * 使用STM32CubeProgrammer能够成功连接到设备并读取内存
   * ST-LINK固件已更新到最新版本
   * 尝试了不同的USB电缆和端口

### 系统信息

* 开发板型号:[NUCLEO-H755ZI-Q]
* 芯片:STM32H755
* STM32CubeIDE版本:[1.18.0]
* ST-LINK版本:[STLINK-V3 V3J16M7]
* 操作系统:[Linux 22.04]

### 调试信息

当CM7调试成功启动后,程序陷入等待CM4启动的循环中:
执行GPIO_EXTI_CM7_Debug时,输出信息为:

STMicroelectronics ST-LINK GDB server. Version 7.10.0
Copyright (c) 2025, STMicroelectronics. All rights reserved.

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
        InitWhile                  : Enabled

Info : default port : 7184
Info : Remote address: 127.0.0.1
Info : stlinkserver already running, exit
Waiting for debugger connection...
Debugger connected
Waiting for debugger connection...
Debugger connected
Waiting for debugger connection...
      -------------------------------------------------------------------
                        STM32CubeProgrammer v2.19.0                  
      -------------------------------------------------------------------



Log output file:   /tmp/STM32CubeProgrammer_q3TuDb.log
ST-Link Server is running on port : 7184
Info : default port : 7184
Info : Remote address: 127.0.0.1
Info : stlinkserver already running, exit
ST-LINK SN  : 004400193433510A37363934
ST-LINK FW  : V3J16M7
Board       : NUCLEO-H755ZI-Q
Voltage     : 3,29V
Info : default port : 7184
Info : Remote address: 127.0.0.1
Info : stlinkserver already running, exit
SWD freq    : 8000 KHz
Connect mode: Under Reset
Reset mode  : Hardware reset
Device ID   : 0x450
Revision ID : Rev V
Device name : STM32H7xx
Flash size  : 2 MBytes
Device type : MCU
Device CPU  : Cortex-M7/M4
BL Version  : 0x91

Opening and parsing file: ST-LINK_GDB_server_dxfKHW.srec


Memory Programming ...
  File          : ST-LINK_GDB_server_dxfKHW.srec
  Size          : 4.59 KB
  Address       : 0x08100000

Erasing memory corresponding to sector 0:
Erasing internal memory sector 8
Download in Progress:

File download complete
Time elapsed during download operation: 00:00:03.647

Verifying ...

Download verified successfully

Info : default port : 7184
Info : Remote address: 127.0.0.1
Info : stlinkserver already running, exit
      -------------------------------------------------------------------
                        STM32CubeProgrammer v2.19.0                  
      -------------------------------------------------------------------

Log output file:   /tmp/STM32CubeProgrammer_FY9gId.log
ST-Link Server is running on port : 7184
Info : default port : 7184
Info : Remote address: 127.0.0.1
Info : stlinkserver already running, exit
Info : default port : 7184
Info : Remote address: 127.0.0.1
Info : stlinkserver already running, exit
ST-LINK SN  : 004400193433510A37363934
ST-LINK FW  : V3J16M7
Board       : NUCLEO-H755ZI-Q
Voltage     : 3,29V
SWD freq    : 8000 KHz
Connect mode: Under Reset
Reset mode  : Hardware reset
Device ID   : 0x450
Revision ID : Rev V
Device name : STM32H7xx
Flash size  : 2 MBytes
Device type : MCU
Device CPU  : Cortex-M7/M4
BL Version  : 0x91

Opening and parsing file: ST-LINK_GDB_server_4APDtX.srec

Memory Programming ...
  File          : ST-LINK_GDB_server_4APDtX.srec
  Size          : 8.66 KB
  Address       : 0x08000000

Erasing memory corresponding to sector 0:
Erasing internal memory sector 0
Download in Progress:

File download complete
Time elapsed during download operation: 00:00:03.837
Verifying ...
Download verified successfully

Info : default port : 7184
Info : Remote address: 127.0.0.1
Info : stlinkserver already running, exit



执行GPIO_EXTI_CM4_Debug时,输出信息如下:

STMicroelectronics ST-LINK GDB server. Version 7.10.0
Copyright (c) 2025, STMicroelectronics. All rights reserved.

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

Info : default port : 7184
Info : Remote address: 127.0.0.1
Info : stlinkserver already running, exit
Failed to read ROM table via AP 3

Error in initializing ST-LINK device.
Reason: Unknown. Please check power and cabling to target.






### 我的疑问

1. 为什么尽管BCM4选项已启用,仍然无法通过AP 3访问CM4?
2. 是否有其他可能影响双核调试的配置或设置?
3. 有没有特定的调试命令或方法可以获取更详细的错误信息?
4. 这个问题是否与特定的STM32H7型号或开发板有关?

回帖(1)

丁冬芹

2025-5-6 16:53:21

针对STM32H7双核调试中CM4报错“Failed to read ROM table via AP 3”的问题,以下是逐步解决方案:


1. 确认CM4核心已正确启动



  • 关键点:CM7需在初始化后释放CM4的复位信号,并确保其时钟和电源已开启。

  • 操作步骤

    1. 在CM7的主函数中,调用双核启动API(如HAL_CM4_EnableHAL_CortexM4Enable)。

    2. 检查RCC寄存器(如RCC->MP_GR6)是否已配置CM4的启动地址(例如CM4的向量表地址)。

    3. 使用调试器暂停CM7,手动检查RCC->MP_CIFR确认CM4是否已启动。





2. 配置CubeIDE的双核调试环境



  • 关键点:需为CM4创建独立的调试配置,并确保调试会话参数正确。

  • 操作步骤

    1. 在CubeIDE中,复制CM7的调试配置并重命名为“CM4_Debug”。

    2. 在配置的Debugger选项卡中:

      • 勾选 Connect under reset(强制复位后连接)。

      • Cortex-M4 Settings 中,设置正确的AP端口号(通常为AP1或AP3)。

      • 调整 Reset ModeHardware Reset


    3. Startup选项卡中,添加以下GDB命令暂停CM7,避免总线冲突:
      monitor reset halt
      monitor cortex_m disable core 0  # 暂停CM7





3. 检查内存分配与链接脚本



  • 关键点:CM4需使用独立的内存区域(如SRAM3),避免与CM7冲突。

  • 操作步骤

    1. 在CubeMX的System Core > MPU中,确认CM4的内存区域(如0x10000000开始的SRAM3)已正确配置为Non-Cacheable。

    2. 检查CM4的链接脚本(如STM32H745ZITx_FLASH.ld),确保.isr_vector.data段指向CM4的专属内存。

    3. 在CM4的代码中,验证向量表偏移寄存器(SCB->VTOR)是否正确指向其内存起始地址。





4. 更新工具链与固件



  • 关键点:旧版本工具可能存在双核调试兼容性问题。

  • 操作步骤

    1. 升级STM32CubeIDE至最新版本(当前为1.12.0)。

    2. 使用STM32CubeProgrammer更新ST-LINK固件。

    3. 重新生成代码并清理工程(Project > Clean)。





5. 使用硬件复位与连接顺序



  • 关键点:错误的复位时序可能导致AP端口无法访问。

  • 操作步骤

    1. 在调试CM4前,先通过ST-LINK Utility执行全局芯片复位。

    2. 在CubeIDE的调试配置中,启用 Reset and Delay 选项,设置复位后延迟500ms。

    3. 若问题仍存在,尝试在CM7初始化代码中插入延时(如HAL_Delay(100)),再启动CM4。





6. 验证示例项目的配置



  • 关键点:AN5361的GPIO示例可能需要特定配置。

  • 操作步骤

    1. 确认项目中的freertos.c文件已正确调用MX_CORE_CM4_Init()

    2. 检查Core/CM4目录下的main.c是否包含空循环(避免CM4无代码导致优化错误)。

    3. 在CM4的main()中,手动点亮LED或发送调试信号,确认其实际运行。





7. 高级排查:使用OpenOCD脚本



  • 关键点:手动控制调试流程,定位AP访问失败原因。

  • 操作步骤

    1. 创建自定义OpenOCD脚本(如stm32h7_dual.cfg),添加以下命令:
      adapter speed 4000
      reset_config srst_only
      cortex_m disable_cache 0
      cortex_m disable_core 0
      cortex_m enable_core 1

    2. 在CubeIDE的调试配置中,指定该脚本为Custom Configuration File





最终验证


完成上述步骤后,重新编译并调试CM4核心。若仍报错,可尝试以下命令检查AP状态:


$ openocd -f interface/stlink.cfg -f target/stm32h7x_dual.cfg
> init
> dap apreg 3 0x00  # 读取AP3的IDR寄存器

若返回全零或无效值,可能硬件存在故障,需检查PCB或更换芯片。


通过以上系统性排查,应能解决CM4调试时AP访问失败的问题。若问题依旧,建议在ST社区提交复现步骤和工程文件以获取官方支持。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分