OpenOCD:JTAG/SWD 调试与烧录
更新时间:2026-09-21。硬件工具。工具链和 GDB 见 arm-none-eabi-gcc,命令行烧录 STM32 另见 st-flash。
一句话回答
OpenOCD 是开源片上调试器,通过 JTAG/SWD 探针(ST-Link/J-Link/CMSIS-DAP)连到目标 MCU,启动后同时开 GDB server(默认 3333)和 Telnet(4444);你用 arm-none-eabi-gdb target remote :3333 连上去做断点、单步、看寄存器,或用 load 烧录、Telnet 里发 reset/halt 等命令。
一、安装
bash
sudo apt install openocd
openocd --versionWindows 有官方二进制/xpack 版。
二、启动 OpenOCD
bash
openocd -f interface/stlink.cfg \
-f target/stm32f1x.cfg-f 指定「调试器接口」和「目标芯片」两类配置。看到监听 3333/4444 即成功,该终端保持运行。
三、用 GDB 连接
bash
arm-none-eabi-gdb firmware.elf在 gdb 里:
bash
(gdb) target remote :3333
(gdb) monitor reset halt
(gdb) load # 烧录固件
(gdb) break main
(gdb) continue
(gdb) monitor reset run # 复位并运行四、Telnet 直接发命令
bash
telnet localhost 4444
> halt
> flash write_image erase firmware.hex
> reset run
> mdw 0x20000000 8 # 读内存
> exit常见坑
- 接线/驱动问题:SWDIO/SWCLK/GND 接错、ST-Link 驱动没装好(Windows 常见),连不上。
- interface/target 配置选错:芯片系列对应的 target 文件不对,识别不到内核。
- 芯片被低功耗/读保护锁住:连接失败,需解除读保护或避免进入无法调试的低功耗模式。
- 时钟速度太高:
adapter speed过大导致不稳定,降速再试。 - GDB 连不上是因为 OpenOCD 没在后台运行:它是服务端,要保持那个终端开着。
- 占用了端口:3333/4444 被别的进程占用,先释放。
- 复位后立刻跑飞:用
reset halt先停住再操作,而不是reset run。
总结
OpenOCD 通过 JTAG/SWD 把目标芯片接到 GDB:用 interface + target 配置启动 GDB server(3333) 和 Telnet(4444),gdb target remote 连接后可断点单步、load 烧录、reset halt 控制;多数连不上的问题出在接线、驱动、芯片配置或低功耗/读保护上。