Linux下使用VSCode开发STM32(一)
一. 开发工具安装
1. Visual Studio Code与插件
Visual Studio Code的安装和使用参考Linux下使用VSCode和CMake搭载C/C++开发环境
插件安装:
2. STM32CubeMX
可以去ST官网直接下载
选择STM32Cube init code generator for Linux,下载完后直接右键打开安装
3. OpenOCD烧录工具
打开终端直接安装就好,这样还能自动安装其他依赖包
sudo apt install openocd
成功安装完后可以看到openOCD版本号,连接上烧录器用lsusb
命令可以看到相关信息
4. gcc-arm-none-eabi编译器
GNU Toolchain for Arm processors
Open source GNU tools for Arm processors: GCC, GDB, binutils, and libraries
下载完后首先解压到合适的位置,我这里解压到了/opt
ls看看里边的内容
然后把编译器路径添加到环境变量:
方法一(进当前用户生效):
cd ~
vi .bashrc
#打开.bashrc后把下面这句添加到最后面
export PATH=$PATH:/opt/gcc-arm-none-eabi-10-2020-q4-major/bin
#保存退出后需要使环境变量生效:
source .bashrc
方法二(所有用户生效):
sudo vi /etc/profile
#打开/etc/profile后把下面这句添加到最后面
export PATH=$PATH:/opt/gcc-arm-none-eabi-10-2020-q4-major/bin
#保存退出后需要重启使环境变量生效:
reboot
一切顺利的话,可以查到编译器的版本号
二. 生成工程
1. STM32CubeMX生成工程代码
生成工程的方法可以参考STM32CubeMX系列教程
这里需要注意两点:
一是SYS
里Debug
要选择合适的接口配置,二是要选择生成Makefile
文件
2. VSCode编辑工程
用VSCode打开工程目录,发现已经有Makefile
文件了,而且打开main.c后一堆红色报错,虽然这里的报错并不影响你正常编译,但是强迫症实在难受,解决办法如下:
按下快捷键Ctrl+Shift+p
,输入C/C++然后点击Edit Configurrations(JSON)
输入以下内容,对应的是MDK配置里的宏定义,需要根据你的工程来填写
保存后关闭所有文件,重新打开main.c,没有报错了强迫症十分满足,接着愉快编写点灯测试代码。
写完测试代码,按快捷键Ctrl+Shift+`打开VSCode内置终端,输入make命令回车开始编译
成功编译后会提示生成了elf,hex,和bin文件
三. OpenOCD烧录
首先烧录器连上STM32并打开电源,另外单独打开一个终端,输入以下指令
openocd -f interface/stlink-v2.cfg -f target/stm32f4x.cfg
- stlink-v2.cfg对应烧录器,支持的烧录器在
/usr/share/openocd/scripts/interface
- stm32f4x.cfg对应MCU,支持的芯片在
/usr/share/openocd/scripts/target
烧录器成功连接上后回到VSCode刚才的内置终端,分别输入
telnet localhost 4444
通过telnet连接openocdprogram /home/lps/stm32/test01/build/test01.hex
烧录hex文件reset
复位STM32exit
关闭连接
此时可以看到STM32板子LED在闪烁
四. json脚本实现一键编译烧录调试
创建json脚本,创建方法还是参考Linux下使用VSCode和CMake搭载C/C++开发环境
只需注意launch.json要选择Cortex Debug
1. launch.json
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Cortex Debug",
"cwd": "${workspaceRoot}",
"executable": "./build/test01.elf",
"request": "launch",
"type": "cortex-debug",
"servertype": "openocd",
"configFiles": [
"interface/stlink-v2.cfg",
"target/stm32f4x.cfg"
],
"armToolchainPath": "/opt/gcc-arm-none-eabi-10-2020-q4-major/bin",
"svdFile": "STM32F427x.svd",
"preLaunchTask": "Build"
}
]
}
2. task.json
{
// 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"
}
]
}
3. SVD文件
.svd文件能在调试的时候方便看到各个外设的状态,在之前Windows下MDK和EWARM安装目录里都可以找到
MDK514/ARM/Pack/Keil/STM32F4xx_DFP/2.9.0/CMSIS/SVD/*.svd
EWARM7.5/arm/config/debugger/ST/*.svd
选择自己芯片的svd文件拷贝工程主目录
4. 工程目录
如果添加完这几个文件发现有小红点报错,重新打开VSCode即可,最终的文件目录如下
5. 一键调试
开始前把前面连接openocd的终端全都关掉,在main函数最开头打一个断点,修改一下延时时间(为了验证工程是否能重新编译和烧录)
按F5,发现工程自动编译,烧录并且进入调试状态,最终停在了startup_stm32f427xx.s开头,跟在MDK里调试一样,继续按F5就运行到了在main函数里打的断点。
调试界面打开CORTEX_PERIPHERALS
能看到各个外设的状态
六. 总结
此文最终实现了STM32CubeMX自动生成Makefile和工程框架代码,然后在VSCode里继续完成编辑,烧录和调试,适用于在Linux下新建工程开发STM32,openocd还支持各种烧录器,包括且不仅限于stlink和jlink。
如果不想用STM32CubeMX生成的库,想用旧的标准外设库或者想编译以前写好的工程代码,那就需要用CMake来生成makefile,参考:
Linux下使用VSCode,GCC,OpenOCD实现STM32一键编译烧录调试(CMake篇)