1. 搭建ARM Cortex-M调试环境

搭建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   # 再次读取寄存器

验证方法与判定标准

按以下步骤确认调试环境工作正常:

  1. 复位验证:执行 monitor reset halt 后,info registers pc 应显示 0x08000000(或复位向量指向的地址),SP应为 0x20005000(根据链接脚本可能略有差异,但必须是RAM地址)。
  2. 加载验证:load 命令应输出 Loading section .text 且无错误。
  3. 运行/暂停验证:continue 后等待1秒,执行 interrupt,GDB应返回提示符且 pc 值位于 main 函数地址范围内(可通过 bt 命令查看调用栈确认)。
  4. 寄存器读取验证:暂停后 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,无防火墙拦截。