文档
OpenOCD:命令行烧录与 GDB 调试 STM32
目标
使用 OpenOCD + arm-none-eabi-gdb 通过 ST-Link 对 STM32F4 进行命令行烧录和源码级调试。
硬件
- STM32 Nucleo-F407ZG 开发板(内置 ST-Link/v2-1)
- 或任意 STM32 + ST-Link 连接
一、烧录固件
1. 启动 OpenOCD Server
openocd -f interface/stlink.cfg -f target/stm32f4x.cfg
成功输出:
Info : STLINK V2J37M26 (API v2) VID:PID 0483:374B
Info : Target voltage: 3.249107
Info : stm32f4x.cpu: hardware has 6 breakpoints, 4 watchpoints
Info : Listening on port 3333 for gdb connections
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
2. 通过 Telnet 烧录
新开终端:
telnet localhost 4444
# OpenOCD 命令提示符下:
> halt # 暂停 CPU
> flash write_image erase /path/to/firmware.elf
> reset run # 复位并运行
> exit
3. 一行命令烧录(无需 Telnet)
openocd -f interface/stlink.cfg \
-f target/stm32f4x.cfg \
-c "program firmware.elf verify reset exit"
| 参数 | 含义 |
|---|---|
program |
烧录命令 |
verify |
烧录后校验 |
reset |
烧录后复位 |
exit |
完成后退出 OpenOCD |
二、GDB 源码调试
1. 启动 OpenOCD(后台)
openocd -f interface/stlink.cfg -f target/stm32f4x.cfg &
2. 启动 GDB 连接
arm-none-eabi-gdb firmware.elf
# GDB 命令提示符下:
(gdb) target extended-remote localhost:3333
(gdb) monitor reset halt # OpenOCD 命令:复位并暂停
(gdb) load # 下载固件到 Flash
(gdb) break main # 断点在 main 函数
(gdb) continue # 运行到断点
(gdb) step # 单步执行
(gdb) print variable_name # 查看变量
(gdb) info registers # 查看寄存器
(gdb) x/10xw 0x20000000 # 查看内存 (10 words)
(gdb) monitor reset run # 复位运行
(gdb) quit
3. 一键调试脚本
#!/bin/bash
# debug.sh — 启动 OpenOCD + GDB
openocd -f interface/stlink.cfg -f target/stm32f4x.cfg &>/dev/null &
OOCD_PID=$!
sleep 1
arm-none-eabi-gdb -ex "target extended-remote localhost:3333" \
-ex "monitor reset halt" \
-ex "load" \
-ex "break main" \
-ex "continue" \
"$@"
kill $OOCD_PID 2>/dev/null
常见 GDB 命令速查
| 命令 | 作用 |
|---|---|
monitor reset halt |
复位 MCU 并暂停 |
monitor flash write_image erase file.bin 0x08000000 |
烧录 .bin |
break function_name |
函数断点 |
break *0x08001234 |
地址断点 |
watch variable |
变量修改时中断 |
backtrace |
调用栈 |
layout src |
源码窗口 |
Ctrl+X A |
退出 TUI 模式 |
关键点
localhost:3333= GDB Server,:4444= Telnet 控制台- ST-Link/v2 最大 SWD 频率约 4MHz,可用
-c "adapter speed 4000"设置 - 如果
load失败,先monitor reset init再试