Linux下开发STM32环境搭建

HarderHeng Lv5

一、大致思路

本次搭建环境的大致思路是

  • Windows + wsl
  • Cubemx进行基础配置和makefile的生成
  • vscode进行项目开发
  • gcc-arm-none-eabi交叉编译工具链进行项目编译
  • OpenOCD进行代码的烧录
  • 配合GDBserver进行调试

本质上进行一个嵌入式项目的开发,写代码,编译成可执行文件,将可执行文件烧录到嵌入式平台上,就是我们要做的所有的事情。对使用集成开发环境来说,我们不需要关系如何编译,如何烧录,只需要进行项目的构建和代码的编写,最后按下编译和烧录还有调试按钮。而在这篇教程中我们将尝试自己从头构建项目,STM32所需要的所有启动文件放到项目中,然后构建一个makefile来规定如何进行编译,最后使用OpenOCD工具进行可执行文件的烧录,以及通过GDBserver进行代码在嵌入式平台上的调试。

二、Cubemx安装

对于WSL这里默认已经配置好了。如果没有配置好可以去微软官网上自己尝试配置,不会花太长时间。或者使用其他的虚拟机也可以,但是使用WSL和vscode配合会非常简单而流畅。

这里到了第一个难点。

在我们的大致思路中需要makefile来进行项目的编译,但是如果要我们从头自己写一个这样的makefile是非常困难的事情,所以将使用st官方提供的Cubemx来进行makefile的生成。

踩坑:请不要在linux平台上使用Cubemx。

Cubemx并不是开源软件,并不能够自行在MacOS或者Linux上进行编译。ST用了java来做跨平台,这里关于java跨平台的具体细节我就不再详细了解,但是这个没有对Linux平台做过适配的软件显然是可能出问题的。在我的WSL上根据教程安装了之后,并不能够正常启动。或许也有可能是因为WSL没有图形化界面,但是Linux版本的Cubemx是自带的图形界面的。最终安装成功后进行启动并没有成功,所以在WSL环境或者Linux环境下尽可能不要使用Cubemx。

回到Windows平台的Cubemx的安装上来,可以选择去ST的”官网“找到安装包,可能过程比较麻烦,需要邮箱接收下载地址的。下载的时候不要使用迅雷进行接管,直接使用浏览器自带的下载器进行下载。并且下载过程中概率出现下载的zip包不完整的情况,在我这里的概率是100%。所以我干脆直接找了别人的网盘链接下载并安装。

在安装Cubemx之前,请确保自己的java环境是OK的。在“java“官网上下载软件。点击下载然后找到适合自己的版本下载并安装即可。

安装java之后即可开始Cubemx的安装,安装过程也没有什么好注意的都是一路next。

Cubemx配置

安装Cubemx之后打开Cubemx进行配置,请移步另一篇博客“STM32Cubemx教程”这里不再赘述。

三、工具链和openocd安装

按理说我们在这里需要安装交叉编译的工具链,但是对arm-none-eabi-gcc这个交叉编译工具链来说,会稍微有一些麻烦。

在我的Ubuntu22.04LTS中,apt包管理器中下载的arm-none-eabi-gcc并不直接包含gdb,如果手动下载gdb-arm-none-eabi的话则会以gdb-multiarch代替它。在这里可以选择自己下载交叉编译的工具链然后进行解压到一个位置,再把文件夹加入到环境变量中。

在这里我并没有采用上面的方法,我直接使用apt进行了下载,分别下载了arm-none-eabi-gccgdb-multiarch

1
2
3
4
sudo apt-get install arm-none-eabi-gcc
sudo apt-get install arm-none-eabi-gdb
arm-none-eabi-gcc -v #gcc版本
gdb-multiarch -v #gdb版本

这两个工具并没有被下载到/usr/local/bin中,而是到了/usr/bin中。対编译来说这是无所谓的,makefile能够自动找到编译器的位置,但是调试时我们是需要gdb的具体位置的。

接下来下载openocd。

1
2
sudo apt-get install openocd
openocd -v #openocd版本

到这里为止我们基本把需要的工具和依赖处理完了。

四、配置部分内容

Cubemx给我们生成的项目文件并不完美,需要我们完善一个地方。

为了在调试过程中能够看到寄存器的数值,调试器需要知道寄存器的分布,我们需要找到SVD文件。

在Windows下的keil中如果下载过对应芯片的Pack,可以在Keil文件夹ARM/PACK/Keil/STM32xxxx_DFP/x.x.x/CMSIS/SVD/,在这里找到自己的芯片或者开发板对应的svd,并将这个文件爱你拷贝到项目的主目录中。

另外openocd给出的配置文件中可能存在一些问题。

启用openocd时需要指出使用的下载器和芯片类型,在我这里就是stlinkv2和stm32h723。

对stlinkv2来说这个文件没有什么用,会将配置文件直接导向stlink.cfg,即只需要选择stlink.cfg就可以。

对于stm32h7x.cfg这个文件,存在一个可能会报错的地方。我们进入到文件中找到reset_config srst_only这个地方,将后面的srst_only这个东西改成none就可以了。

如果Debug时没有出现问题应该就不需要修改这里

五、尝试启动测试

对项目进行make编译,得到中间文件和可执行文件在build文件夹下。

启动openocd。后面的两部分根据自己的下载器类型和芯片类型进行更改,在/usr/share/openocd/scripts中可以找到interfacetarget两个文件夹。

1
openocd -f interface/stlink-v2.cfg -f target/stm32h7x.cfg

然后打开另一个终端,输入运行以下命令。

1
2
3
4
telnet localhost 4444 #连接openocd
program /home/···/build/···.bin #烧录可执行文件,一定是完整的路径
reset #复位
exit #退出openocd连接

这样就顺利进行了代码的烧录。

六、编写json脚本一键编译烧录调试

创建launch.jsontasks.json

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
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"cwd": "${workspaceRoot}",
"executable": "./build/clock_test.elf",
"name": "Debug with OpenOCD",
"request": "launch",
"type": "cortex-debug",
"servertype": "openocd",
"configFiles": [
"/usr/share/openocd/scripts/interface/stlink-v2.cfg",
"/usr/share/openocd/scripts/target/stm32h7x.cfg"
],
"searchDir": [],
"runToEntryPoint": "main",
"showDevDebugOutput": "none",
"gdbPath":"/usr/bin/gdb-multiarch",
"svdFile":"STM32H723.svd",
"preLaunchTask": "Build",
"liveWatch": {
"enabled": true,
"samplesPerSecond": 4
}
},
]
}
1
2
3
4
5
6
7
8
9
10
11
12
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "Build",
"type": "shell",
"command": "make"
}
]
}

其中,launch.json中的executable,configFiles,svdFile需要根据自己的项目来,如果使用的是自己下载的交叉编译工具链,则需要将gdbPath改成armToolchainPath,值为自己的交叉编译工具链的位置。

七、调试

在需要调试的位置打上断点,按下F5就会进行编译,烧录,调试一系列的流程。在左边可以看到变量的值,cpu寄存器的值,还有下面外设寄存器的值。

然后就像调试普通的vscode项目一样进行调试即可。

八、Ex

这样构建的项目只能说非常初级,接下来将深入的开发方式。

  • 使用Cubemx只能HAL库

  • 没有加入嵌入式操作系统的调试

  • 没有自己手动编写makefile来控制编译过程

  • 没有办法看到调试过程中的更多参数比如RAM占用和调试时间

希望接下来能够解决这些问题。

  • Title: Linux下开发STM32环境搭建
  • Author: HarderHeng
  • Created at : 2024-12-17 11:08:17
  • Updated at : 2024-12-19 10:04:20
  • Link: https://harderheng.life/2024/12/17/Linux下开发STM32环境搭建/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments