如何通过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
相关产品推荐
相关产品推荐

