1. 搭建ARM Cortex-M调试环境
任务目标
本案例将使用OpenOCD和GDB,通过ST-Link调试器连接STM32F103开发板,完成以下操作:复位目标板、暂停程序执行、读取核心寄存器(如PC、SP)。最终验证方式是:在GDB会话中成功读取到与启动代码预期一致的寄存器值。
环境与依赖
- 硬件:STM32F103C8T6开发板(蓝色药丸板)、ST-Link V2调试器
- 软件:OpenOCD(≥0.11)、GDB(arm-none-eabi-gdb,≥10)、已编译的测试ELF文件(含调试信息)
- 接线:ST-Link的SWDIO→PA13,SWCLK→PA14,GND→GND,3.3V→3V3
关键完整代码
以下为最小可复现的测试程序(test.c),用于验证调试连接。程序仅包含一个全局变量和一个死循环,便于观察复位和暂停行为。
// test.c — 最小调试验证程序
volatile int counter = 0;
int main(void) {
while (1) {
counter++;
for (volatile int i = 0; i < 1000; i++);
}
}
编译命令(生成带调试信息的ELF文件):
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -g -nostdlib -Ttext=0x08000000 \
-Wl,-e,main test.c -o test.elf
OpenOCD配置与启动
创建文件 stm32f103.cfg,内容如下:
source [find interface/stlink.cfg]
source [find target/stm32f1x.cfg]
启动OpenOCD(终端1):
openocd -f stm32f103.cfg
看到 Info : stm32f1x.cpu: hardware has 6 breakpoints 表示连接成功。
GDB连接与调试操作
打开终端2,启动GDB并连接:
arm-none-eabi-gdb test.elf
(gdb) target remote localhost:3333
连接后依次执行以下操作验证功能:
(gdb) monitor reset halt # 复位并暂停
(gdb) info registers pc sp # 读取PC和SP
(gdb) load # 将程序加载到目标板
(gdb) continue # 运行程序
(gdb) interrupt # 暂停执行
(gdb) info registers pc sp # 再次读取寄存器
验证方法与判定标准
按以下步骤确认调试环境工作正常:
- 复位验证:执行
monitor reset halt后,info registers pc应显示0x08000000(或复位向量指向的地址),SP应为0x20005000(根据链接脚本可能略有差异,但必须是RAM地址)。 - 加载验证:
load命令应输出Loading section .text且无错误。 - 运行/暂停验证:
continue后等待1秒,执行interrupt,GDB应返回提示符且pc值位于main函数地址范围内(可通过bt命令查看调用栈确认)。 - 寄存器读取验证:暂停后
info registers能列出r0-r15、xPSR等核心寄存器,且数值为合理的32位地址/数据。
若上述操作均成功且寄存器值符合预期,则判定调试环境搭建完成。若 monitor reset halt 报错或GDB无法连接,请检查ST-Link驱动、接线和OpenOCD配置中的接口类型。
常见问题
- 连接失败:确认ST-Link已插入USB,且设备管理器中识别为STM32 STLink。尝试更换USB端口或使用
st-info --desktop验证驱动。 - SWD无法识别:检查SWDIO/SWCLK是否接反,目标板是否供电(3.3V必须连接)。
- GDB无法远程连接:确认OpenOCD仍在运行且端口为3333,无防火墙拦截。