VSCode下STM32开发环境搭建
本STM32教程使用vscode的EIDE插件的开发环境,完全免费,有管理代码文件的界面,不需要其它IDE。
视频教程见本人的
VSCode+EIDE开发STM32
安装EIDE插件
Embedded IDE 嵌入式IDE
这个插件可以帮我们管理代码文件,配置工具链(什么是工具链见下文)等。
这里先安装此插件,此插件使用,工具链安装等,后面配合示例工程讲解。
EIDE网站,可以查看此插件的更新日志。
这是什么? | Embedded IDE For VSCode
什么是工具链
简单的说就是把源文件(也就是xx.c xxx.cpp等)变成可执行文件的东西。
开发不同的东西需要不同的工具链,
比如在windows上,源文件最后会变成.exe
用Visual Studio写.cpp用的就是MSVC 编译器工具集(也称为工具链或“生成工具”)
用VSCode写.cpp,教程都会让你下载mingw
而开发单片机,也需要对应其内核的工具链。
stm32是arm的内核,所以需要arm相关的工具链。
keil就是armcc v5 v6的工具链(收费)。
本教程使用的是免费的gnu arm embedded toolchain即GNU Arm 嵌入式工具链。
这是它的网址Arm GNU Toolchain Downloads – Arm Developer,如果你想可以去下载最新版,我这里用EIDE安装。
使用EIDE安装gcc工具链
点击安装实用工具,安装gcc_arm工具链
它会开始下载安装工具链
如果使用EIDE安装工具链,它的安装路径如下
C:\Users\用户名.eide\tools
假如你本来就有,可以直接设置安装位置。
比如你自己下载了工具链,或者安装了stm32的工具包(STM32 VS Code Extension 插件让你安装的那个),或者安装了STM32CubeIDE,就直接找到gcc_arm工具链填入其路径就行。
点击设置工具链,设置 GNU Arm Embedded Toolchain
示例工程
创建一个示例工程,进一步说明。
示例工程实现LED闪烁。
用CubeMX生成工程代码
打开stm32cubeMX,打开选择器,选择你开发板对应的芯片型号。
进入配置界面,设置LED对应引脚为输出模式,通常是PC13因为这个引脚没有太多其它功能。
顺便设置个标签,LED0,便于后面写代码。
工程名称就叫demo1吧。
只复制必要的库文件,为每个外设生成一对‘.c/.h’文件初始化外设等不再赘述。
工具链/IDE选择
这里的STM32CubeIDE CMake Makefile 使用的都是arm-gcc的工具链!
不过CMake Makefile产生的工程需要自己配置项目资源,CubeIDE产生的工程导入即可。
这里先选择CMake或者Makefile自己配置一下项目,STM32CubeIDE导入的教程见下文。
生成的工程文件夹
EIDE插件的使用
新建空项目
STM32选择Cortex-M项目,项目名称建议和之前的工程名称保持一致。
项目保存位置为工程文件夹的位置(而不是工程文件夹内)
项目文件夹已经存在的警告选是
切换至工作区
VSCode切换到了工作区
编译工程
添加项目资源
添加.c文件
添加普通文件夹,它具有递归查找能力,能往下查找到你的代码文件。
添加包含.c代码的文件夹。
.c文件添加完毕
添加启动文件startup.s
项目资源添加一个虚拟文件夹
添加启动文件startup.s,选择文件的时候选择any就可以看到所有文件。
启动文件.s添加完毕
顺便说一下
普通文件夹要在工程文件夹下面添加。
当然如果你愿意,可以全部使用虚拟文件夹去添加所有源文件。
只要将工程涉及到源文件全部添加了就可以。
构建配置
选择CPU类型
选择CPU类型,根据你的单片机选择,STM32F4选M4,F1选M3
设置链接脚本路径
设置链接脚本路径,就是CubeMX生成的flash.ld文件。
它就在工程文件夹那层里,把它文件名填上去就行
项目属性
就是,头文件路径、库文件路径、要预处理的宏定义这些。
如果搞不清楚CubeMX生成的代码的相关配置,可以查看CubeMX生成的CMake或makefile。
这里说一下,并没有使用CMake,打开它只是为了确认要填入的信息。
添加头文件目录
就是所有.h所在的目录。
包含目录添加完毕
添加预处理宏定义
代码文件里有类似这样的代码,这些编译预处理命令需要添加预处理宏定义配合编译。
#if defined (USE_HAL_DRIVER)//如果定义了它
//...
//做什么什么
//...
#endif /* USE_HAL_DRIVER */
预处理宏定义添加完毕
当然,如果你自己建立了代码文件夹也需要添加相关的配置。
编译
都配置好了,然后就能编译了
随便打开一个代码文件,右上角既可以找到编译。
编译完毕,没有错误没有警告。
生成的可执行文件(待下载到单片机上)
如何烧录(下载)
安装下载器对应的工具。
一般大家搞stm32都是用stlink因为便宜,如果是jlink就下载jlink的。
安装后它也会安装STLINk的驱动等。
烧录配置,选择烧录工具
添加工程代码
添加让LED0闪烁的代码,并重新编译。
HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET);
HAL_Delay(500);
烧录
点击右上角的下载按钮即可下载。
提示:请正确连接你的下载器和开发板。
烧录完毕
LED0已经开始闪烁。
调试
相关解释请参考
cortex-debug 用法 - 博客 - Embedded IDE Forum
安装调试用的插件和工具
安装Cortex Debug
安装VSCode插件 Cortex Debug,调试需要。
安装OpenOCD
OpenOCD是一个免费的开源软件,用于调试和编程嵌入式设备。
可以直接在EIDE这里下载。
假如你有OpenOCD就不用重新下载了,之后写路径的时候改一下就行。
比如你自己下载了OpenOCD,或者安装了stm32的工具包(STM32 VS Code Extension 插件让你安装的那个),就直接找到填入其路径就行。
如果使用EIED安装OpenOCD,它的安装位置如下,安装位置之后要用。
C:\Users\用户名.eide\tools
创建launch.json文件
launch.json 是 Visual Studio Code 中用于配置调试器的文件。
launch.json的创建
切换到代码文件,点运行和调试。创建launch.json文件,在工程中。
调试器选择Cortex Debug
自动生成代码的时候选择OpenOCD
这是自动生成的launch.json还需要修改
填写可执行文件路径
调试要用到可执行文件.elf,它在build/Debug下。
executable 这里填入
//elf文件看当前工程名称或是看build文件夹下的elf文件名称
"executable": "build/Debug/demo1.elf",
填写配置文件路径
找到你OpenOCD的安装位置
configFiles这里如下填写
"configFiles": [
//使用ST-LINK,路径根据你的openOCD的安装位置修改,stlink版本根据你的下载器修改
"C:/Users/CaiYunWei/.eide/tools/openocd_7a1adfbec_mingw32/share/openocd/scripts/interface/stlink-v2-1.cfg",
//使用stm32f?,路径根据你的openOCD的安装位置修改,stm32f?根据你的芯片修改
"C:/Users/CaiYunWei/.eide/tools/openocd_7a1adfbec_mingw32/share/openocd/scripts/target/stm32f4x.cfg"
],
stlink .cfg文件路径如下,使用哪个根据你的下载器修改。
C:\Users\你的用户名.eide\tools\openocd_7a1adfbec_mingw32\share\openocd\scripts\interface
stm32 .cfg文件路径如下,使用哪个根据你的芯片修改。
C:\Users\你的用户名.eide\tools\openocd_7a1adfbec_mingw32\share\openocd\scripts\interface\target
参考的launch.json文件
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"cwd": "${workspaceRoot}",
//.elf可执行文件路径
"executable": "build/Debug/demo1.elf",
"name": "Debug with OpenOCD",
"request": "launch",
"type": "cortex-debug",
"servertype": "openocd",
"configFiles": [
//使用ST-LINK,路径根据你的openOCD的安装位置修改,stlink版本根据你的下载器修改
"C:/Users/CaiYunWei/.eide/tools/openocd_7a1adfbec_mingw32/share/openocd/scripts/interface/stlink-v2-1.cfg",
//使用stm32f?,路径根据你的openOCD的安装位置修改,stm32f?根据你的芯片修改
"C:/Users/CaiYunWei/.eide/tools/openocd_7a1adfbec_mingw32/share/openocd/scripts/target/stm32f4x.cfg"
],
"searchDir": [],
"runToEntryPoint": "main",
"showDevDebugOutput": "none"
}
]
}
生成的jlink相关代码用不到,可以删掉。
开始调试
搞好之后保存launch.json文件,选择设置好的启动项Debug with OpenOCD,加入断点,即可开始调试
成功
可以在左面查看变量,添加监视等。
导入CubeIDE工程
CubeIDE实际上也是用的arm-gcc的工具链。
我这里用cubeMX生成一个来说明。
创建一个CubeIDE工程
导入
导入空的嵌入式gcc项目
项目资源,项目属性等已经自动添加好了。
构建配置仍需手动修改。
注意生成的flash.ld文件中
.ARM.extab (READONLY) : /* The "READONLY" keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */
{
. = ALIGN(4);
*(.ARM.extab* .gnu.linkonce.armextab.*)
. = ALIGN(4);
} >FLASH
它有个关键词需要gcc11以上的版本,目前(2025年1月20日)EIDE下载到的是10!可以删除相关内容,或者手动更新工具链。
之后即可正常编译。
烧录、调试等完全一致,见上文。
后记
使用VSCode EIDE开发,不需要其它IDE。
使用arm-gcc完全免费
没有这个EIDE插件确实能开发,但是要手动配置工具链,每次编译代码都需要在命令窗口中输入相应的指令,很麻烦。
按理说,找到对应内核的工具链就能开发相应的单片机。
EIDE这个插件能设置的工具链挺多的。
CMake现在在C/C++的项目中用的越来越多,建议了解一下。
STM32 VS Code Extension 插件用的是CMake。但它没有图形化的配置界面,比如加个文件,得自己写路径,比较麻烦。
参考资料
抛弃keil?VScode开发stm32完整教程_哔哩哔哩_bilibili
VSCode+EIDE开发CH32V系列RISC-V MCU - Wahahahehehe - 博客园