3. 使用JTAG调试器连接目标板

任务目标

本案例将完成JTAG调试器与目标板的连接配置,实现程序下载与在线调试。使用STM32F407开发板搭配ST-Link/V2调试器(兼容JTAG/SWD协议),在OpenOCD环境下完成从配置文件编写到GDB调试会话启动的完整闭环。

环境与依赖

  • 硬件:STM32F407VET6开发板、ST-Link/V2调试器、杜邦线或板载接口
  • 软件:OpenOCD 0.11+、GDB(arm-none-eabi-gdb)、arm-none-eabi-gcc工具链
  • 连接关系:ST-Link的SWDIO→PA13、SWCLK→PA14、GND→GND、3.3V→3.3V(或使用板载ST-Link接口)

OpenOCD配置文件

创建 stm32f407.cfg,内容如下:

# 调试器接口配置
source [find interface/stlink.cfg]
transport select hla_swd

# 目标芯片配置
source [find target/stm32f4x.cfg]

# 复位配置
reset_config srst_nogate

# 初始化脚本
proc init_board {} {
    # 连接目标板
    init
    # 复位并暂停在复位向量
    reset halt
    # 读取芯片ID确认连接
    flash read_bank 0 /dev/null 0 4
}

init_board

编译测试程序

准备一个最小测试程序 main.c:

#include <stdint.h>

volatile uint32_t counter = 0;

int main(void) {
    while (1) {
        counter++;
        for (volatile uint32_t i = 0; i < 100000; i++);
    }
}

编译命令:

arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -nostdlib -Ttext=0x08000000 -o test.elf main.c
arm-none-eabi-objcopy -O binary test.elf test.bin

启动OpenOCD并下载程序

终端1启动OpenOCD服务:

openocd -f stm32f407.cfg

终端2连接GDB并下载调试:

arm-none-eabi-gdb test.elf
(gdb) target remote localhost:3333
(gdb) load
(gdb) monitor reset halt
(gdb) continue

验证方法与判定标准

  1. 连接验证:OpenOCD启动后输出 Info : stm32f4x.cpu: hardware has 6 breakpoints, 4 watchpoints,且无错误信息,说明JTAG链路正常。
  2. 芯片ID验证:OpenOCD日志中出现 Info : STM32F4xx - 4096 KiB flash 或类似芯片识别信息。
  3. 下载验证:GDB执行 load 后输出 Loading section .text, size 0x1c lma 0x8000000 等加载信息,无报错。
  4. 运行验证:GDB执行 continue 后程序运行,通过 Ctrl+C 中断,执行 p counter 可看到counter值在增长,证明程序在目标板上实际运行。

常见问题排查

  • 连接失败:检查SWDIO/SWCLK接线是否正确,确认ST-Link驱动已安装(Linux下为libusb)。
  • 芯片无法识别:确认目标板供电正常,尝试降低JTAG速率:在cfg中添加 adapter speed 1000。
  • 下载后不运行:检查是否执行了 monitor reset halt,确保程序入口地址正确(0x08000000)。

通过以上步骤,即可完成JTAG调试器与目标板的连接、程序下载和在线调试的完整流程。GDB中可使用 break main、step、watch counter 等命令进行源码级调试。