工具链


构建

arm-none-eabi-gcc 编译器
arm-none-eabi-binutils 工具包,包含了汇编器、链接器等工具
arm-none-eabi-newlibs 基于嵌入式系统的标准库
屏幕截图 20251030 193030
屏幕截图 20251030 193141
屏幕截图 20251030 193213


调试

调试流程图:
$$\text{用户操作 (Code-OSS GUI)} \rightarrow \text{Cortex-Debug (GDB Front-end)} \rightarrow \text{GDB (Client)} \ \rightarrow\ \text{OpenOCD (Server)} \rightarrow \text{ST-Link/J-Link (Hardware)} \rightarrow \text{STM32 芯片}$$

OpenOCD

软件中间层,理论上只需要ocd不需要GDB就可以调试,但是GDB能够提供用户友好的调试命令。
OpenOCD提供了两种通信接口:GDB ServerTcl(tcl可以理解为一种语言) 接口。前者是GDB的连接接口,后者可以用过telnet(telnet可以理解为一种TCP/IP服务的客户端)直连来操作。这两种通信接口都是基于 TCP/IP 协议栈的。但是在同一台电脑上,就只是一个端口向另一个端口的通信,IP都是本地IP:127.0.0.1或者等效地localhost
使用OpenOCD:

1
openocd -f /path/to/interface/stlink.cfg -f /path/to/target/stm32f4x.cfg

表示使用前面的硬件调试器,来与后面的芯片通信。也可以把这两个写到同一个.cfg文件中:
使用Find命令:

1
2
3
4
5
6
7
8
9
10
11
# 1. 加载接口配置
# find 命令用于在 OpenOCD 的配置路径中查找文件
source [find interface/stlink.cfg]

# 2. 加载目标配置 (注意:这个文件会处理 JTAG/SWD 协议和 Flash 银行定义)
source [find target/stm32f4x.cfg]

# 3. 设置启动后的操作(可选,但常用)
# 目标上电后,通常需要停止 CPU 运行,并打印状态
init
reset halt

使用绝对路径:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# stlink_stm32f1.cfg

# 1. 加载接口配置
# 推荐使用双引号""或花括号{}
# 使用完整的路径,或者使用 find 命令(让 OpenOCD 在其默认路径中查找)

# 方案 A: 使用绝对路径(最可靠,但较长)
source "/usr/share/openocd/scripts/interface/stlink-v2.cfg"

# 方案 B: 使用 find 命令(更通用,如果文件在默认路径)
# source [find interface/stlink-v2.cfg]

# 2. 加载目标配置
source "/usr/share/openocd/scripts/target/stm32f1x.cfg"
# 方案 B: source [find target/stm32f1x.cfg]

# 3. 设置启动后的操作
init
reset halt

这样使用时只调用这一个.cfg文件即可:

1
openocd -f stm32f4-stlink.cfg(上面的这个组合文件的名字)

这些配置文件官方一般已经给出,就在软件的安装目录下。Linux下的位置是:

1
/usr/share/openocd/scripts/

在这个 scripts 目录下,您会看到两个主要的子目录:

  • interface/ 存放各种调试器硬件的配置文件(如 stlink.cfg, jlink.cfg, ftdi/ 目录下的文件等)。

  • target/ 存放各种目标芯片(CPU 内核和 Flash)的配置文件(如 stm32f4x.cfg, esp32.cfg, cortex_m.cfg 等)。
    用户只需要自己组合写一个组合的cfg文件即可。

GDB

软件应用层。使用步骤:

1. 启动 OpenOCD 服务端

首先,您需要让 OpenOCD 运行起来,以便它能够连接到您的 STM32 目标板,并监听 GDB 的连接请求(默认端口 3333)。

  • 命令示例:
1
2
# 假设使用 ST-Link 调试 STM32F4
openocd -f interface/stlink.cfg -f target/stm32f4x.cfg
  • 状态: 终端会显示 OpenOCD 启动信息,确认它已连接到调试器,并开启了 GDB 远程调试端口 (3333) 和 Telnet/Tcl 端口 (4444)。

  • 保持运行: 这个 OpenOCD 进程必须保持运行,不能关闭。您可能需要新开一个终端窗口来运行 GDB。

2. 启动 GDB 客户端

在新终端中,启动您的交叉编译 GDB 版本,并加载您编译好的程序文件。

  • 加载程序文件: 启动 GDB,并指定您的 .elf 格式的程序文件。这个文件包含了符号信息(变量名、函数名、行号等),这是 GDB 实现高级调试的关键。
1
2
# 假设您编译好的文件是 build/project.elf
arm-none-eabi-gdb build/project.elf
  • GDB 提示符: GDB 启动后,您会看到 (gdb) 提示符。

3. GDB 连接到 OpenOCD

这是最关键的一步。在 GDB 提示符下,您使用 target remote 命令连接到 OpenOCD 正在监听的端口。

  • 连接命令:
1
(gdb) target remote localhost:3333
  • target remote: 告诉 GDB 连接一个远程目标。

  • localhost: 因为 OpenOCD 和 GDB 运行在同一台电脑上,所以使用本地地址。

  • 3333: OpenOCD 默认的 GDB Server 端口。

  • 连接成功: OpenOCD 会响应 GDB 的连接,GDB 此时就可以开始向 OpenOCD 发送调试命令了。OpenOCD 会通过 ST-Link 将这些命令传递给 STM32 芯片。

4. 调试流程(GDB 常用命令)

连接成功后,您可以开始进行调试了。

GDB 命令 功能描述 配合 OpenOCD 的效果
load 将程序加载并烧录到芯片的 Flash 中。 GDB 发送烧录命令,OpenOCD 执行 Tcl 脚本中的烧录操作。
break main main 函数设置断点 GDB 发送断点设置命令,OpenOCD 在芯片上设置硬件/软件断点。
continue 让程序从当前位置继续运行 OpenOCD 收到命令后,解除 CPU 停止状态。
step 单步执行(进入函数内部)。 GDB 协调 OpenOCD,执行一条指令后重新停止。
next 单步跳过(不进入函数内部)。 GDB 协调 OpenOCD,执行一条指令后重新停止。
info locals 查看当前函数中的局部变量 GDB 从芯片内存中读取变量地址的值,并根据 .elf 符号表进行解析。
quit 退出 GDB。 退出 GDB 客户端,但 OpenOCD 服务器可能仍在运行。

code 扩展

Code-OSS 上需要安装的所有扩展总结

  1. C/C++ Extension Pack:这是一个扩展包,包含基础的 C/C++ 语言支持、智能感知、导航和调试支持。

  2. Cortex-Debug嵌入式调试的核心。它负责连接 GDB 和 OpenOCD,并提供可视化的调试界面(变量查看、断点设置等)。
    Cortex-Debug需要在.vscode目录下提供一个launch.json文件:
    (这个版本的配置文件很好,不需要自己写.cfg配置文件)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
{

"configurations": [

{

"name": "STM32 Debug",

"type": "cortex-debug",

"request": "launch",

// --- 编译产物和工作目录 ---

"cwd": "${workspaceFolder}",

// 确保此路径和文件名与您 CMake 构建的 ELF 文件一致

"executable": "${workspaceFolder}/build/Debug/F1test.elf", //注意修改

// --- GDB Server 配置 (此处为适用OpenOCD工具的配置,若为stlink等则不需要配置下面的.cfg文件等) ---

"servertype": "openocd",

// OpenOCD 可执行文件在 Arch Linux 上的标准路径

"serverpath": "/usr/bin/openocd", //注意修改



// GDB 客户端可执行文件路径

"gdbPath": "arm-none-eabi-gdb",



// OpenOCD 脚本的搜索路径 (Arch Linux 标准位置)

"searchDir": [

"/usr/share/openocd/scripts"

],



// 芯片和调试器配置文件 (使用标准脚本,更稳定)

"configFiles": [

"interface/stlink.cfg", //注意修改

"target/stm32f1x.cfg" //注意修改

],

// --- 目标设备配置 ---

"device": "STM32F103C8", // 目标芯片型号,用于寄存器显示

"interface": "swd", // 调试接口类型 (通常是 SWD)

"svdFile": "${workspaceFolder}/STM32Fx.svd", // SVD 文件路径



// 调试启动设置

"runToEntryPoint": "main", // 启动后运行到 main() 函数

"preLaunchTask": "" // 如果您有自动构建任务,可在此处添加

}

]

}
  1. CMake Tools构建系统的核心。它负责管理您的 CMakeLists.txt,配置和执行您的 make 构建命令。

  2. DeviceTree(可选):如果您需要配置设备树文件,这个扩展提供语法高亮和支持。



工具链
https://mingzaitown.github.io/2025/10/31/STM32/工具链/
作者
MingZai
发布于
2025年11月1日
许可协议