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

如何通过OpenOCD和GDB无中断连接STM32读取RAM变量?

实现STM32G4通过SWD无暂停读取RAM内容的方法

问题分析

当前核心问题是STM32G4的Cortex-M4内核调试模块默认带有halt-on-connect逻辑,仅配置基础非侵入式参数无法阻止连接时的内核暂停,需要明确启用非侵入式访问模式并调整更多调试相关配置。

解决方案步骤

1. 调整OpenOCD目标配置

可以选择修改默认配置文件或启动时注入参数(推荐后者,避免改动系统默认配置):

方式一:修改stm32g4x.cfg文件

在文件末尾添加以下配置:

# GDB连接时不暂停目标
$_TARGETNAME configure -event gdb-attach {
    $_TARGETNAME configure -gdb-flush-cache off
    $_TARGETNAME configure -halt-on-connect off
    # 启用非侵入式内存访问模式
    arm cortex_m noninvasive on
}

# 禁用GDB内存映射,避免触发受限区域访问
gdb_memory_map disable

# 禁用复位时自动暂停目标
$_TARGETNAME configure -halt-on-reset off

方式二:启动OpenOCD时注入配置(无需修改原文件)

执行以下命令启动OpenOCD:

openocd -f interface/stlink.cfg -c "transport select hla_swd" -f target/stm32g4x.cfg \
  -c "$_TARGETNAME configure -event gdb-attach {$_TARGETNAME configure -gdb-flush-cache off; $_TARGETNAME configure -halt-on-connect off; arm cortex_m noninvasive on}" \
  -c "gdb_memory_map disable" \
  -c "$_TARGETNAME configure -halt-on-reset off"

2. 配置GDB连接参数

启动gdb-multiarch后,先执行以下配置再连接:

set remote interrupt-on-connect off
set mem inaccessible-by-default off
set remote hardware-watchpoint-limit 0  # 禁用硬件断点,防止意外暂停内核

接着执行连接命令:

target extended-remote localhost:3333

3. 验证无暂停读取

连接成功后,执行RAM地址读取命令:

p/x *0x20003C48

此时查看OpenOCD输出,不会出现target halted日志,目标程序持续运行的同时,可正常读取指定RAM地址内容。

关键说明

  • 非侵入式模式限制:该模式下仅支持访问RAM和部分外设寄存器,无法操作Flash或设置断点,完全满足数据记录仪读取RAM的需求。
  • 硬件断点禁用:禁用硬件断点是为了避免GDB默认初始化断点资源时触发内核暂停。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 06:52:55