近两年, 微软越来越拥抱开源支持跨平台, win10 搭载 Linux 子系统, 开源 VSCode 作为跨平台编辑器, VS2017 官方支持了 Linux 和嵌入式开发功能.
ST 也是, 近两年开发的软件工具基本都是跨平台 (基于 Java) 的, 比如 STM32CubeMX,MCUFinder,STM32CubeProgrammer 等. 17 年年底收购了 truestudio 的开发公司 - Atollic. 这个公司的 IDE 就是基于 Eclipse 使用 GNU 套装的.
官方都支持了, 那我们有必要了解一下. 要是好用, 说不定就可以淘汰老旧的 Keil 了.
必要软件
VSCode 或者 VS2017.
GNU ARM Embedded Toolchain .
JLink 或者 STLink .
STM32CubeMX. 这个一般开发 STM32 的都会装.
使用思路
编译就不说了, 有 makefile, 有 gcc 就可以了.
调试的话, 整体的流程图如下:
前端 . 这里 VSCode 和 VS2017 就是封装了 GDB 的图形前端, 这样我们使用 GDB 调试的时候就不需要再在命令行窗口敲指令了.
GDB Client.arm-none-eabi-gdb
GDB Server.JLink 官方 SEGGER 提供了一个 GDB server.STLink 在 github 也有一个开源的项目. 这里演示使用 JLink. 如果不嫌麻烦的话, 也可以使用 openOCD.
调试器这里使用 JLink, 接口使用 SWD.
目标板芯片型号为 STM32F103RCT6
VS2017
这里使用 VSCode 举例, 但是 VS2017 实际上也是支持的, 可以参考官方 博客
VSCode 基本配置
这个现代化的编辑器, 好处就不多说了, 对比 keil 谁用谁知道, 网上也能搜到一堆的关于它的介绍.
必要插件
C/C++ 为必要插件, 否则无法调试.
建议安装插件
Uncrustify. 用来格式化代码, shift+alt+f, 非常方便. 缺点是代码中有 Unicode 可能会导致乱码, 然后配置文件有点多.
Bracket Pair Colorizer. 不同颜色高亮显示匹配括号, 爱护视力必备.
C/C++ Clang Command Adapter. 用来补全和诊断, 需要同时安装 Clang, 参考官方文档.
JLink 安装
安装完成后, 目录下应该有下列文件
GNU ARM Embedded Toolchain 安装
下载后, 安装或者解压即可. 目录下有一个 bin 的文件夹, 可以看到有下列文件:
安装完成后, 将 bin 文件夹路径添加到环境变量. 不过这不是必要的, 只是方便在命令行中使用, 在 vscode 中使用是不需要的.
使用 cube 生成代码以及 makefile
这里需要注意, cube 的版本至少要是 4.23.0. 否则没有生成 makefile 的选项, 这里使用 4.24.0. 在配置完成后, 设置选项需要选择 Makefile, 如下图:
点击生成后文件目录如下:
在 main.c 中添加两行闪灯的代码:
while (1) {
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
HAL_Delay(500);
Counter++;
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
至此, 整个工程就搭建好了.
编译
官方生成了 makefile, 那么只要执行 make 就可以了. makefile 的语法, 网上可以找到很多的教程, 这里不细说.
就目前的工程, 想要 make 成功, 改一句话即可使用, 即指定 gcc 的路径. 我的路径如下:
BINPATH = D:/GNU_ARM_TOOLS/2016q3_Version_5_6/bin
修改后, 打开命令行, 输入 make 即可. 如果, 提示 make 不是内部或者外部命令, 那你还需要安装 GNU make, 这个可自行搜索下载.
如果配置成功, 应该能看到下面的画面:
这样, 在 build 目录下面可以找到
blink.hex,blink.elf,blink.bin
这几个文件. 至此, 编译成功.
其实, 即使不使用 cube 生成 Makefile, 我们也可以自己写一个, 或者使用 CMake. 但是, 使用官方的文件, 会统一大家的程序结构, 以后移植或者开源也更容易.
而且, 官方的 Makefile 结构比较清晰, 熟悉 Keil 工程配置的人, 其实很容易接受.
下载
可以使用 JFlash 直接烧录
如果没什么问题的话, 复位之后, 目标板的 led 应该已经开始闪烁了.
调试
这里是重点.
1. 运行 GDB server
我这里是在 windows 平台下, JLink 提供的 GDB server 有一个图形客户端. Linux 平台下使用命令行版本, 也是一样的.
打开 JLinkGDBServer.exe, 配置连接好后, 应该看到下面的界面
这个 server 一直开着就行, 注意上面的端口号 2331, 后面要用到.
2. 测试 GDB
由于 VSCode 的配置文件中使用了较多的 GDB 指令, 这里使用命令行先演示一下, 方便理解, 也刚好测试 GDB 是否正确安装.
在命令行输入 arm-none-eabi-gdb, 应该看到如下画面, 否则你的 GNU 套装没安装好, 或者没添加到环境变量
继续输入下面的指令:
此时, 应该也看到 led 灯在闪烁了.
简单解释这几个指令, 详细的可以自行搜索 gdb 的教程, 或者查看 GNU 套件安装目录下的文档.
target remote :2331 : 连接到 GDB server.
file : 载入目标文件到 gdb.
load : 下载文件到目标板.
c: 运行到下一个断点, 如果没有断点, 会一直运行
monitor reset : 传递命令 reset 给 JLink GDB server.
monitor 后面的参数不是 gdb 的指令, 而是 gdb server 的 (这里就是 JLink Server 的), 这里参考 JLink 的文档 (在安装目录下有), 可以接受如下指令
常用的也就是 reset 了.
3. 配置 VSCode 调试
在 vscode 的窗口按下 F5, 弹出来的窗口选择 gdb
官方给了默认配置, 需要修改成我们自己的. 这里改动比较多, 具体的配置参数需要参考两个地方, 一个是 vscode 的 官网
, 一个是 cpp 插件的 github 文档
最终我们的配置如下:
{
// 使用 IntelliSense 了解相关属性.
// 悬停以查看现有属性的描述.
// 欲了解更多信息, 请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "blink Launch",
"type": "cppdbg",
"request": "launch",
"targetArchitecture": "arm",// 虽然官方说弃用了, 但实际上必须指明
"program": "blink", // 采用了自定义的设置, 这里没啥用了
"args": [""],"stopAtEntry": true,"cwd":"${workspaceFolder}","environment": [],"externalConsole": true,"MIMode":"gdb","miDebuggerPath":"D:/GNU_ARM_TOOLS/2016q3_Version_5_6/bin/arm-none-eabi-gdb.exe","setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"launchCompleteCommand": "None",
"miDebuggerServerAddress": "localhost:2331",
"customLaunchSetupCommands": [
{
"text": "target remote :2331",
"description": "connect to server",
"ignoreFailures": false
},
{
"text": "file F:/STM32/led/blink/build/blink.elf",
"description": "load file to gdb",
"ignoreFailures": false
},
{
"text": "load",
"description": "download file to MCU",
"ignoreFailures": false
},
{
"text": "monitor reset",
"description": "reset MCU",
"ignoreFailures": false
},
{
"text": "b main",
"description": "set breakpoints at main",
"ignoreFailures": false
},
]
}
]
}
再次按下 F5 后, 效果如图:
这个配置中, 最重要的就是
customLaunchSetupCommands
中的设置, 有了上面 gdb 再命令行的演示, 就很容易理解了.
总结
这里只是搭建了一个最简单的功能, 使用上确实比 Keil 繁琐很多, 而且有些实用功能没有实现, 比如说 live watch, 比如说查看寄存器内容. 如果有人专门针对 VScode 或者 VS2017 开发一个插件, 那么最终的调试功能就和 Keil 一样强大了.
加上 VScode 强大的编辑能力, 那么 Keil 除了 ARMCC 还可以让人留恋一下, 其他部分就都可以抛弃了.
提升
想要在实际工程中使用 vscode + GNU 的组合, 还需要提升几部分:
makefile. 需要增加更多功能, 比如下载, 比如分开 release 和 debug 等, 比如增量编译等.
使用 task.vscode 的 task 功能是很强大的, 不用浪费.
开发插件. 如上所提, 调试功能还是差 keil 不少.
来源: https://www.cnblogs.com/WeyneChen/p/8379214.html