使用 VSCode 打造 STM32 开发环境

VSCode 应该是目前最流行的开发工具之一了。这篇文章记录了我在 linux 下,使用 VSCode 作为 STM32 开发环境的一些折腾过程。

我使用的是 Ubuntu 18.04,使用其它发行版应该也没有任何问题,或者 windows。需要准备的原料有:

  • VSCode + 官方 C/C++ 插件
  • gcc-arm-none-eabi
  • make
  • STM32CubeMX
  • jlink + 驱动

前三项可通过 apt-get 等包管理工具安装。如果你是要进行一个新项目的开发,强烈安利使用 STM32CubeMX 进行源代码工程的生成,可以免除自己写 makefile,写无聊的硬件配置代码。如果是从已有的 keil 项目移植,需要自己写好 makefile,并检查好代码中 armcc 和 gcc 的特性兼容性问题(比如 __weak 这样的东西),具体内容不在本篇讲述。

1. 使用 STM32CubeMX 生成一个项目工程

如果已经用过这个玩意了,可以跳过这一步,没用过的可以看一下。

STM32CubeMX - STM32Cube initialization code generator - STMicroelectronicswww.st.com图标

这个工具是 java 开发的,需要在系统中装好 jre。在选择好自己的芯片型号后,建立一个新项目。

配置好所需要的各个管脚和外设的功能,在这里我建立一个简单的点灯程序,需要 PA6 作为 LED 的管脚。注意的是,除了 RCC 这样必须要配置的外设外,调节的接口也要配置好。

如果有需要嵌入式操作系统的需求,可以把 freertos 也配上。

在 Projec->Settings 中,选择 toolchain-ide 项目 makefile,

如果喜欢的话,勾选下面一项,将外设的配置代码分成独立成对的 .c .h 文件

然后,生成工程源码。目录中的结构是这个样子的

Drivers,Inc 文件夹包含了 HAL 库的代码,Middlewares 包含了 freertos 等中间层代码,我们的用户层代码丢在 Src 中。进入这个文件夹,如果你已经安装好了前面的原料,直接执行 make,将建立一个 build 目录,里面包含生成 hex 和 .bin 文件。至于 makefile, gcc-arm-none-eabi 具体如何工作的,不在本篇论述。

2. 使用 VSCode 编写、调试代码

VSCode 和 C/C++ 插件装好,并去下载安装 jlink 的驱动

Downloadswww.segger.com图标

都准备好后,用 VSCode 打开工程文件夹,按 F1 搜索 C/CPP: Edit configurations,配置一写信息帮助 C/C++ 插件更好的做语义 completion 和代码检查工作。可以把 makefile 中的 C_INCLUDES 和 CDEFS 照抄到 "includePath" 和 "defines" 中。"defines" 中添加一条 "__GNUC__"。然后将 arm-none-eabi-gcc 编译器的 standard library 路径也加入。如果你不知到它们在哪儿,运行这条命令

echo | arm-none-eabi-gcc -v -E -x c++ -

然后把 include <...> 下的路径都添加到 "includePath" 中,最后结果类似下图

现在,使用 VSCode 修改一下代码,添加点灯的任务,可以看到补全功能

修改完后 make 编译生成一下固件。

3. 调试

点开调试界面,新建调试配置,在 launch.json 文件中输入以下信息,注意其中可执行文件要替换成你的自己的文件路径

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "ARM Debug",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/led_test.elf",
            "miDebuggerPath": "arm-none-eabi-gdb",
            "targetArchitecture": "arm",
            "cwd": "${workspaceFolder}",
            "externalConsole": true,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "text": "exec-file '~/stm_proj/led_test/build/led_test.elf'"
                },
                {
                    "text": "target remote localhost:2331"
                },
                {
                    "text": "monitor reset"
                },
                {
                    "text": "monitor halt"
                },
                {
                    "text": "load"
                }
            ]
        }
    ]
}

使用 jlink 连接好 PC 和开发板,开启 GDBServer,同样,注意根据你的芯片型号和调试接口选择正确的参数

JLinkGDBServer -device STM32F405RG -if SWD

然后,我们就可以开始调试了!

总结:

VSCode 的代码补全非常舒适,反应速度也比较快,插件很多,喜欢的还可以用 vim 插件,用它写代码的体验远远超过 keil、eclipse 这样的傻大个。

调试实际上就是 VSCode 可以使用 gdb 作为后端调试工具,使用 stlink,openocd 等工具,修改其中对应的配置,开启 gdbserver 就都能调试。不过目前的调试能力好像还不是很完善,比如无法实时查看寄存器,不打断点有点小问题。

如果更懒人一点,可以把编译、烧录、开 gdbserver 等都做成 tasks。

编辑于 2018-10-14