ST意法半导体
直播中

哼小曲

14年用户 1277经验值
私信 关注
[问答]

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-6-16 17:44:48

这个错误在调试STM32H7双核设备的Cortex-M4核时相当常见。核心问题在于调试器无法通过内部的“访问端口”(AP 3)读取M4核的调试信息(ROM Table)。请按照以下步骤系统性地排查解决:




? 核心原因及解决步骤


1. ? 验证并更新工具链



  • ST-LINK固件升级: 这是最常见的解决方式!

    • 打开STM32CubeIDE -> Help -> ST-LINK Upgrade

    • 将ST-LINK/V2/V3固件升级到最新版本。过时固件是"AP 3"错误的主因之一。


  • 检查STM32CubeIDE版本: 确保使用的是较新版本的IDE(如1.14.0+)。检查Help -> About中的版本信息。

  • 更新STM32H7固件包: 在CubeIDE的Help -> Manage embedded software packages中,为STM32H7系列安装最新支持包。


2. ? 配置调试启动选项 (Debug Configuration) - 最关键!



  • 右键点击你的M4项目 -> Debug As -> Debug Configurations...

  • GDB ST-LINK Debugging下找到对应M4的配置。

  • 切换到Debugger标签页:

    • Reset Type:Default/HW system reset改为 Hardware resetCore reset (尤其重要尝试后者)。

    • Mode settings -> Connect under reset:务必勾选此项! 这会强制在系统/核心复位状态下连接调试器,清除处理器和调试单元的混乱状态。

    • Debug probe options -> Serial wire frequency: 如果设得很高(如24 MHz),尝试降至4 MHz8 MHz以确保信号完整性。稳定后再提高。



3. ⚙️ 确保M4核已正确启动 (Boot Address)



  • M7核通常负责启动系统并加载M4核的固件(从特定内存地址)。


  • 在M7核心的代码中(通常在main.c初始化后),必须调用HAL库函数启动M4核:


     #include "stm32h7xx_hal.h"
    #include "stm32h7xx_hal_cortex.h" // 包含相关头文件

    // 在系统时钟配置完成后调用,通常在MX_Init之后
    HAL_StatusTypeDef ret = HAL_CortexEx_EnableCM4(0x08100000); // 关键地址参数
    if (ret != HAL_OK) {
         // 错误处理:M4核无法启动!
    }


    • 0x08100000 是ST的AN5361示例中M4固件在内部Flash的标准起始地址。绝对确保你项目中M4固件的链接地址与此一致 (检查M4项目的.ld链接脚本中FLASH区域的ORIGIN值)。

    • 启动后,稍作延迟再尝试调试M4核(例如等待几秒或在代码中加延时、标志位)。




4. ? 物理连接检查



  • 连接器: 确保ST-LINK/V2/V3与目标板上的SWD接口连接正确且牢固(SWCLK, SWDIO, GND, VCC/TVCC/VREF)。

  • 线缆: 尽量使用短而优质的杜邦线/排线。损坏的长线缆可能导致通信不稳定。

  • 目标板供电:

    • 确保开发板或目标板由稳定、足够功率的电源供电(强烈推荐使用官方开发板的ST-LINK为其供电时,也使用板载USB端口或额外电源供电)。

    • 测量调试接口的VCC/TVCC/VREF电压是否在有效范围内(通常2.7V-3.6V)。电压过低会导致通信失败。



5. ? 硬件复位操作



  • 在尝试启动M4调试会话前,手动按压开发板上的硬件复位按钮 (NRST)。在复位信号保持低电平时点击IDE中的"Debug"按钮,然后在释放复位键瞬间连接。


6. ⚡ 工程配置检查



  • M4核心时钟和复位配置: 确保M4核的时钟(RCC配置)在MX设置中已正确使能。检查Project Manager -> Advanced Settings下是否已启用M4核心。

  • Boot引脚 (BOOT0): 确保BOOT0引脚接地(从内部Flash启动)。错误的上拉可能导致启动异常。

  • Memory Protection: 检查System Core -> MPU设置,尤其是Cortex-M4内存区域的配置是否允许调试器访问。


7. ? STM32CubeProgrammer 独立测试



  • 尝试绕过IDE:

    • 使用STM32CubeProgrammer连接目标板。

    • 选择正确的接口(ST-LINK/SW)。

    • 尝试读取0x08100000(或你的M4固件地址)内容。

    • 尝试对M4核进行Attach操作。

      • 如果CubeProgrammer也连接失败或读不到内容,则问题很可能在硬件、连接、供电或核心启动层面。如果CubeProgrammer能成功连接,则IDE配置可能性大。






? 重点排查顺序建议



  1. ✅ 立即执行:

    • 升级ST-LINK固件

    • 勾选Connect under reset

    • 更改复位模式


  2. 确认M4启动:

    • 确保M7正确调用了HAL_CortexEx_EnableCM4(0x08100000) (地址务必匹配)

    • 等待启动后再调试(可加指示灯/串口打印验证M4已运行)


  3. 电源和连接:

    • 检查供电和连线可靠性


  4. 降频与复位操作:

    • 尝试降低SWD频率,手动硬复位配合调试启动


  5. 调试工具:

    • 用CubeProgrammer独立测试



?️ 额外提示



  • 双核同步启动问题: 若M7启动任务未完成就尝试调试M4,会导致通信异常。务必在EnableCM4后加延迟逻辑。

  • 项目配置路径: 如果多个工程相互引用(如M7引用M4生成的elf),确保路径设置正确。

  • 工作区问题: 尝试新建一个干净的工作空间,重新导入项目编译调试(可排除缓存问题)。

  • J-Link用户: J-Link同样会遇到此问题,需在J-Link Commander/配置中勾选"Connect under reset"或-reset选项。


? 调试沟通建议


下次提问时建议附上:



  1. M7项目中的M4启动代码位置截图;

  2. M4项目的.ld链接脚本关键地址配置;

  3. ST-LINK驱动详细信息;

  4. M4调试配置的Debugger选项卡完整截图。


完成这些步骤后,特别是ST-Link升级、Connect under reset及复位类型修改,基本能解决90%的"AP 3"错误。若仍有问题请补充项目配置细节,我会继续帮你深入诊断!??

举报

更多回帖

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