Linux下使用vscode开发STM32

linux下使用vscode一键式编译烧录调试STM32

1. 环境准备

在开始之前,需要安装以下必要的软件和工具:

  1. STM32CubeMX:用于生成STM32工程代码,提供了图形化界面,可以方便地配置STM32的各0种参数。
  2. vscode:一个轻量级的代码编辑器,支持多种编程语言,支持插件扩展,可以通过插件实现STM32的编译、烧录和调试。
  3. OpenOCD:一个开源的调试工具,支持多种调试器,可以通过OpenOCD实现对STM32的调试。
  4. gcc-arm-none-eabi编译器,用于编译STM32的代码。
  5. gdb-multiarch:一个多架构的调试器,支持多种架构的调试,用于vscode一键调试STM32。

1.1 安装STM32CubeMX

ST官网下载STM32CubeMX-Linux安装包,解压后,右键赋予SetupSTM32CubeMX-6.x.x.linux可执行权限,然后双击运行,按照提示安装即可。

安装完成后,在安装目录下双击STM32CubeMX打开STM32CubeMX,依次点击Help->Manage embedded software packages,然后根据自己的STM32型号,勾选相应的STM32Cube MCU Package,然后点击Install安装HAL库。

1.2 安装vscode

官网下载vscode .deb安装包,在下载目录下打开中端并执行sudo dpkg -i vscode-amd64.deb

然后打开vscode,按下Ctrl+Shift+X打开插件商店,分别搜索并安装插件Cortex-Debug,C/C++CMake,CMake Tools,Arm Assembly

1.3 安装OpenOCD

可以使用sudo apt-get install openocd gcc-arm-none-eabi gdb-multiarch一条命令安装OpenOCD、gcc-arm-none-eabi和gdb-multiarch,也可以单独安装。

在终端执行sudo apt-get install openocd即可安装OpenOCD。

安装完成后,可以通过openocd -v命令查看OpenOCD的版本。

如果连接上烧录器,可通过lsusb查看OpenOCD是否识别到烧录器,如下图所示,我的烧录器是ST-LINK/V2

1.4 安装gcc-arm-none-eabi

在终端执行sudo apt-get install gcc-arm-none-eabi即可安装gcc-arm-none-eabi。

安装完成后,可以通过arm-none-eabi-gcc -v命令查看gcc-arm-none-eabi的版本。

网上的教程使用了arm-none-eabi-gdb调试器,我在配置过程中先是发现安装目录没有arm-none-eabi-gdb,后来在官网下载源文件并添加到环境变量后,发现arm-none-eabi-gdb调试器无法正常调试,并报出以下错误:

1
2
3
4
5
Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
Python runtime state: core initialized
ModuleNotFoundError: No module named 'encodings'

Current thread 0x00007c3a754ecc00 (most recent call first):
个人猜测是因为arm-none-eabi-gdb不支持python3.10,但由于电脑上的其他项目需要python3.10,所以不能降级python,后面大量搜索相关经验发现gdb-multiarch调试器可以正常调试,所以建议使用gdb-multiarch调试器。

1.5 安装gdb-multiarch

直接在终端执行sudo apt-get install gdb-multiarch安装gdb-multiarch。

2.生成STM32工程代码

这一部分的主要内容是,演示如何使用STM32CubeMX生成STM32工程代码,配置PB0、PB1,一闪一灭实现LED跑马灯效果

2.1 新建工程

主页点击New Project,下方的ACCESS TO MCU SELECTOR选择自己的STM32型号

然后双击选中自己的开发板,这里我的STM32型号是STM32F767IGT6,然后在弹窗中点击Yes,进入Pinout & Configuration界面。

2.2 配置RCC

Pinout & Configuration界面,依次点击System Core->RCC,将High Speed Clock (HSE)Low Speed Clock (LSE)设置为Crystal/Ceramic Resonator

2.3 配置引脚

Pinout view界面,找到PB0PB1,分别单击设置为GPIO_Output

然后在System Core->GPIO中,进行如下配置,并为PB0PB1设置标签LED0LED1,在后面生成代码时会自动生成对应的宏定义,可以方便地找到对应的引脚。

2.4 配置时钟树

Clock Configuration界面,配置时钟树,使得STM32的时钟频率为216MHz。 有以下三处需要配置:

然后细调GPIO的配置,设置初始化状态为High,使得LED灭时为高电平,点亮LED时为低电平。GPIO设置为推挽输出,输出速度为High,使得LED点亮时电流较大,亮度较高。

2.5 生成代码

设置完成后,点击右上角Generate Code,填写工程名称,选择工程路径,选择Toolchain/IDEMakefile 然后转到Code Generator界面,选择Generate peripheral initialization as a pair of '.c/.h' files per peripheral,这样做可以将每个外设的初始化代码分别放在.c.h文件中,方便查找和修改,然后点击右上角的Generate Code生成代码。

2.6 编写代码

使用vscode打开生成的工程代码,然后在Src目录下的main.c文件的while(1)循环,替换为以下代码,实现LED跑马灯效果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
while (1)
{

/* USER CODE END WHILE */
HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET); //点亮LED0

HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);//熄灭LED1

HAL_Delay(500);

HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET);//熄灭LED0

HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);//点亮LED1

HAL_Delay(500);

/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */

如果发现代码中有undefined reference的错误,可以参考4.2解决。 在vscode中按下Ctrl+Shift+‵,打开内置终端,输入make编译代码,编译成功后,会在build目录下生成led.elf,led.bin,led.hex三个文件。

3. OpenOCD烧录

打开OpenOCD

ST-LINK/V2连接到电脑和STM32开发板,并打开STM32的电源,然后在终端执行openocd -f interface/stlink-v2.cfg -f target/stm32f7x.cfg - openocd:启动OpenOCD - -f interface/stlink-v2.cfg:指定烧录器为ST-LINK/V2,支持的烧录器可在/usr/share/openocd/scripts/interface目录下查看 - -f target/stm32f7x.cfg:指定目标芯片为STM32F7x,支持的芯片可在/usr/share/openocd/scripts/target目录下查看

烧录代码

在vscode中按下Ctrl+Shift+‵,打开内置终端,然后依次执行以下命令:

1
2
3
4
5
telnet localhost 4444 #通过telnet连接OpenOCD
program /home/bean/project/STM32/led/build/led.hex #烧录hex文件
#执行完后,两个LED灯都会灭
reset #复位,两个LED灯会开始跑马灯效果
exit #退出telnet

此时可以看到板子上的两个LED灯在交替闪烁,实现了跑马灯效果。

4. 一键编译烧录调试

如果像上文那样手动编译、烧录、调试,会比较繁琐,可以通过vscode及其丰富的插件实现F5一键编译、烧录、调试。

4.1 下载SVD文件

SVD文件是芯片的寄存器描述文件,在调试时被用于查看和修改寄存器的值。
可以在这里下载自己的STM32开发版的SVD文件,然后将SVD文件放在工程目录下。

4.2 配置c_cpp_properties.json

按下Ctrl+Shift+P打开命令面板,输入C/C++,点击Edit Configurations(JSON),然后在c_cpp_properties.json中 修改"defines": [],为:

1
2
3
4
"defines": [
"USE_HAL_DRIVER",
"STM32F767xx"
],
定义USE_HAL_DRIVERSTM32F767xx这两个宏定义,这样在代码中就可以使用这两个宏定义,不会再出现undefined reference的错误。

4.2 配置launch.json

按下Ctrl+Shift+D打开调试视图,然后点击create a launch.json file,选择Cortex-Debug,然后在launch.json中修改为以下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Cortex Debug",
"cwd": "${workspaceFolder}",
"executable": "./build/led-1.elf", // elf文件路径,根据自己的工程修改
"request": "launch",
"type": "cortex-debug",
"servertype": "openocd",
"configFiles": [
"interface/stlink-v2.cfg", // 选择 stlink-v2.cfg
"target/stm32f7x.cfg" // 选择 stm32f7x.cfg
],
"svdFile": "STM32F7x7.svd",
"preLaunchTask": "Build",
"gdbPath": "/usr/bin/gdb-multiarch" // gdb-multiarch路径
}
]
}

4.3 配置tasks.json

按下Ctrl+Shift+P打开命令面板,输入Tasks,选择Tasks: Configure Task,然后选择Create tasks.json file from template,选择Others,然后在tasks.json中修改为以下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
{
// 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"
}

]
}

最终的目录结构如下:

4.4 一键编译烧录调试

在开始前先把之前打开的OpenOCD关闭,在main.c中的main函数中设置如图所示断点,然后按下F5,vscode会自动编译、烧录、调试,然后跳转到第一个断点处,通过F10逐过程调试,可以看到LED灯的交替闪烁。

5. 总结

本文介绍了如何在Linux下使用vscode开发STM32,通过STM32CubeMX生成STM32工程代码,然后通过vscode一键式编译、烧录、调试STM32,实现了LED跑马灯效果。希望本文对大家有所帮助。

参考文献: