跳至内容
vscode开发stm32

vscode开发stm32

2026-06-11

1. 环境准备

Windows下为了在vscode中开发单片机,需要准备的工具如下:

  1. ARM交叉编译工具

  2. Make管理工具(也用于编译windows环境运行的c/c++)

  3. 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-make

1.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 openocd

2. 代码编译

使用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