命令行烧录与 GDB 调试 STM32

知识库
知识库文档
/tech-stacks/openocd/examples/命令行烧录与 GDB 调试 STM32.md

文档

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 再试

信息

路径
/tech-stacks/openocd/examples/命令行烧录与 GDB 调试 STM32.md
更新时间
2026/5/31