vscode开发stm32
1. 环境准备
Windows下为了在vscode中开发单片机,需要准备的工具如下:
ARM交叉编译工具
Make管理工具(也用于编译windows环境运行的c/c++)
OpenOCD烧录和调试工具
1.1 ARM交叉编译工具
在windows下编译arm单片机程序的交叉编译器为:arm-none-eabi-gcc,
下载地址:https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads
不要选择太旧的
实测cubemx版本为6.15.0生成的代码中,使用经典版本gcc-arm-none-eabi-10.3-2021.10-win32.exe已经无法处理生成的一些链接文件导致编译报错
这里使用的版本为如下。前者直接安装自动配置环境变量;后者直接解压缩即可,但是需要自己配置环境变量。
- arm-gnu-toolchain-15.2.rel1-mingw-w64-x86_64-arm-none-eabi.msi
- arm-gnu-toolchain-15.2.rel1-mingw-w64-x86_64-arm-none-eabi.zip
**这里建议选择压缩包,自己解压并添加环境变量,因为修改路径比较容易。**这里解压后修改文件夹名字为:arm-none-eabi-gcc_15.2,原名字太长了。

添加环境变量,系统变量->Path(到bin路径)。

检查是否配置可用,在cmd窗口中使用如下指令,能看到版本号表示配置正确。
arm-none-eabi-gcc --version
where arm-none-eabi-gcc另外,还有一个老版本的交叉编译工具链,这里建议下载压缩包解压后留着,但是不用添加环境变量。这里放到了路径:D:\ToolChain\arm-none-eabi-gcc_10.3
- gcc-arm-none-eabi-10.3-2021.10-win32.zip
- gcc-arm-none-eabi-10.3-2021.10-win32.exe
cubemx6.17生成的工程,使用这个旧版本的工具链不能编译,链接脚本中有些命令老版本不支持。
但是新版本的工具链可以编译,但是调试代码有问题,还需要安装一些其他的配置。
因此可以选择使用新版本的编译,老版本的调试。或者把新版本所需的其他环境也配齐。
1.2 Make管理工具
在windows下的make工具为:mingw64
下载地址:https://github.com/niXman/mingw-builds-binaries/releases
根据电脑架构选择即可,这里使用当前最新的。
- x86_64-16.1.0-release-win32-seh-ucrt-rt_v14-rev1.7z
安装方式同上,直接解压并添加环境变量即可,这里解压完把最外层名字很长的文件夹删了,修改文件夹名字为mingw64_16.1。

添加环境变量,系统变量->Path(到bin路径)。

检查是否配置可用,在cmd窗口中使用如下指令,能看到版本号表示配置正确。
mingw32-make --version
where mingw32-make1.3 OpenOCD烧录和调试工具
在vscode中比较通用的工具为:OpenOCD
下载地址:https://openocd.org/
这里也下载当前最新的。
- xpack-openocd-0.12.0-7-win32-x64.zip
安装方式同上,直接解压并添加环境变量即可,修改文件夹名字为openocd_0.12.0。

添加环境变量,系统变量->Path(到bin路径)。

检查是否配置可用,使用如下指令,能看到版本号表示配置正确。
openocd --version
where openocd2. 代码编译
使用cubemx创建一个点灯工程,这里使用STM32F401CCU6。
在生成的工程类型中选择Makefile,其余正常配置即可。

生成工程后使用vscode打开工程。
工程中已经包含了一个makefile文件,可以看到他这里如果定义了GCC_PATH就会按照定义的路径寻找编译器。如果没有则直接使用arm-none-eabi-gcc编译器。
这里生成的makefile中默认没有定义这个路径,所以会走else分支,使用arm-none-eabi-gcc编译器,因为这个编译器路径已经在环境变量里了,所以系统是可以直接找到的。

打开一个终端,输入如下指令进行编译:mingw32-make -j8,编译完成后的结果存放于生成的build文件夹下。

这个名字是因为在mingw64工具中的make工具就是这个名字,如果想直接使用make指令,只需要把这个文件在这里再复制一个,并改个名字叫make.exe,以后就可以直接输入make命令编译了。

清除编译make clean命令还是有点问题,需要修改makefile或者安装其他工具,这里先不麻烦了,直接删除build文件夹即可。
3. 代码烧录和调试
3.1 代码烧录
写一段闪灯逻辑,并编译完成。
然后代码烧录比较简单,直接使用如下命令即可
openocd -f interface/cmsis-dap.cfg -c "transport select swd" -f target/stm32f4x.cfg -c "program build/debug_demo.hex verify reset exit"命令解释:
-f interface/cmsis-dap.cfg 选择下载器
-c "transport select swd" 指定下载方式swd(非必须 会自动检测)
-f target/stm32f4x.cfg 指定下载对象
-c "program build/debug_demo.hex verify reset exit 指定要下载的文件 校验、复位后退出可选的下载器位于安装路径下:CompilationTools\xpack-openocd-0.12.0-7-win32-x64\xpack-openocd-0.12.0-7\openocd\scripts\interface
可选的下载mcu位于安装路径下:E:\CompilationTools\xpack-openocd-0.12.0-7-win32-x64\xpack-openocd-0.12.0-7\openocd\scripts\target
下载效果如下,完成后自动复位运行。

3.2 代码调试
vscode中安装Cortex-Debug插件,他还会自动安装所需的其他插件。
安装完成后,点击左侧调试按钮,选择创建launch文件,选择Cortex Debug类型。

在生成的launch文件中填入如下内容:
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Cortex Debug",
"type": "cortex-debug",
"request": "launch",
"servertype": "openocd",
"cwd": "${workspaceFolder}",
// 可执行文件(必须是elf)
"executable": "./build/debug_demo.elf",
// 芯片型号
"device": "STM32F401CC",
// OpenOCD 配置
"configFiles": [
"interface/cmsis-dap.cfg",
"target/stm32f4x.cfg"
],
// 显式指定 SWD 传输
"openOCDLaunchCommands": [
"transport select swd"
],
// 到main函数停止
"runToEntryPoint": "main"
}
]
}
然后点击左侧调试栏上方的开始按钮,或者按下F5开始调试。
然后大概率肯定超时失败,报错信息中包含如下这句话。
If you cannot, it is most likely because "libncurses" or "python" is not installed. Some GDBs require these我这里在一台电脑上重复多次都一直不能成功,在另一台电脑上重新启动一次就进入调试了。
如果进不去调试,有两种办法。
第一种,把新版本的工具缺少的环境补齐(没研究是啥,不想装)。
第二种,在luanch文件中再添加一个参数gdbPath,显式指定调试工具路径,使用10.3老版本的工具。
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Cortex Debug",
"type": "cortex-debug",
"request": "launch",
"servertype": "openocd",
"cwd": "${workspaceFolder}",
// 可执行文件(必须是elf)
"executable": "./build/debug_demo.elf",
// 芯片型号
"device": "STM32F401CC",
// OpenOCD 配置
"configFiles": [
"interface/cmsis-dap.cfg",
"target/stm32f4x.cfg"
],
// 显式指定 SWD 传输
"openOCDLaunchCommands": [
"transport select swd"
],
// 到main函数停止
"runToEntryPoint": "main",
// 显式指定调试服务器的路径(可以指定老版本)
"gdbPath": "D:/ToolChain/arm-none-eabi-gcc_10.3/bin/arm-none-eabi-gdb.exe"
}
]
}然后就可以开心的调试了。
4. 编辑界面优化
待定
5. printf
gcc实现printf,串口中添加如下方法即可。
int __io_putchar(int ch)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}gcc的编译器节省体积默认删掉了float的格式化打印,可以手动修改makefile,添加这个字段,就支持了.
LDFLAGS = ... -Wl,-u,_printf_float