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。