前言
本文主要是介绍在win10的环境下,利用cubemx,openocd,vscode软件以及烧录工具stlink来实现stm32的开发。(主要是去实习了,公司要求换个环境开发)
安装清单
- vscode
- MinGw
- 交叉编译工具链
- openocd
- cubemx
- stlink驱动
安装vscode
安装MinGW
来到sourceforge网站下载,选择红框的压缩包,点击下载

下载后解压缩运行,最终在桌面可以看到下面MinGW的在线安装器的图标(如果在桌面看不到就去开始菜单搜索)。这只是个安装器,需要在线下载真正的安装内容,所以速度不会快。

点击图标,跳出下面这个界面,点击这些组件旁边的框框,点击mark for install。

选择下面这些需要的组件,有的可能已经先帮你安装好了。




选择完毕后点击Installation。

等待安装成功后,要进行环境变量的设置。右键我的电脑属性,点击高级系统设置。然后按照下图的操作,记得添加之后要一路点击确定。


点击Path

我的安装路径是 C:\MinGW,但是那些可执行文件在bin文件夹内,所以记得路径要包括到bin。

最后一路点击确定。
安装vscode常用插件
-
ARM:使的ARM汇编代码获得语法高亮,这里主要用在启动文件上。
-
C/C++:使VScode获得对C/C++语言的支持,包括智能提示,调试等。
-
Chinese (Simplified) Language Pack for Visual Studio Code:VScode中文语言包。
-
C++ Intellisense:提供C++智能感知功能。
-
Cortex-Debug:对ARM Cortex-M内核的单片机提供调试支持。
-
Cortex-Debug: Device Support Pack - STM32F1(F4,L1):这三个芯片包分别对Cortex-Debug提供三款芯片的设备支持。
-
GBKtoUTF8:因为平时的Keil的STM32工程文件大部分都是GB2312编码的,这个扩展可以自动将GB2312 转换为UTF-8编码。
-
LLVM :代码补全。









安装交叉编译工具链
来到官网往下拉就能看到2019的版本,点击这个红框,选择这个版本。

然后下载zip压缩包。

解压后如下图所示。

此处可以看到我的路径是E:\gcc-arm-none-eabi-9-2019-q4-major-win32,添加环境变量,这次也要将路径拓展到\bin。


设置之后,打开命令行,输入arm-none-eabi-gcc -v,如果看得到版本信息就说明设置成功啦。

安装OpenOcd
来到官网,如下图所示,选择的是windows的版本。点击红框下载压缩包。

解压之后如下所示。

同样添加环境变量,也要包括到bin。我的路径是E:\openocd-20201228\OpenOCD-20201228-0.10.0\bin。

设置之后,打开命令行输入openocd -v查看是否设置成功。

安装stlink驱动
来到官网,然后点击获取软件,之后会让你填个邮箱,在邮箱给出的链接下载软件就行了。

下载后解压,选择红框的exe。

安装完成后就是这样的。

当电脑连接stlink时,如果安装成功,就可以在设备管理器看到下图红框的提示。

stm32cubemx新建工程
新建一个cube的工程

选择对应的芯片

选择外部晶振

用的是stlink-sw下载的模式

配置时钟树

选择makefile

勾上这两个选项

然后点击上方的Generate Code,即可生成需要的外设配置代码

打开文件夹如下所示

这里有个很方便的小技巧,参考这个链接,可以实现右键选择需要用vscode打开的文件。
编译
配置c_cpp_properties.json
按下Ctrl+Shift+P打开命令行,输入edit configurations(json)。他会在工程文件夹下生成一个.vscode文件夹并在其中创建一个c_cpp_properties.json的配置文件。其中include路径和宏定义可以参照makefile添加。

这是默认的vscode给的模板。

接下来根据我们从cubemx生成的makefile来进行修改。打开maikefile,找到个宏定义处,
将这两个宏定义添加到自己的c_cpp_properties.json文件。(记得把开头的D去掉)

修改后的内容如下所示。

完整的代码。
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE",
"USE_HAL_DRIVER" ,
"STM32F103xB"
],
"compilerPath": "C:\\MinGW\\bin\\gcc.exe",
"cStandard": "gnu11",
"cppStandard": "c++17",
"intelliSenseMode": "gcc-x86"
}
],
"version": 4
}
方法(一)
直接手动在中断输入make命令,或者make -j4等。如果提示下列错误,找到自己安装的MinGW路径,来到bin 文件夹。将mingw32-make修改为make。



如下图所示,编译成功。

方法(二)
按下Ctrl+Shift+P打开命令行,输入task。点击配置任务。

点击使用模板创建tasks.json文件。

点击Others,然后就会生成一个默认模板。

默认模板如下:

我们配置这个任务是为了编译,所以将label修改成编译代码。

原代码如下:
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "编译代码",
"command": "make",
"args": [
"-j4"
],
"problemMatcher":[
"$gcc"
],
"group": "build",
}
]
}
配置完成后,点击终端,点击运行任务,就会出现我们配置好的编译代码的任务,点击之后其执行内容就相当于之前执行的make命令。执行这个任务的时候会再打开一个终端。



下载
再次配置task.json文件。

最终的task.json文件如下所示。
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "编译代码",
"command": "make",
"args": [
"-j4"
],
"problemMatcher":[
"$gcc"
],
"group": "build",
},
{
"type": "shell",
"label": "下载",
"command": "openocd",
"args": [
"-f",
"E:/openocd-20201228/OpenOCD-20201228-0.10.0/share/openocd/scripts/interface/stlink.cfg",
"-f",
"E:/openocd-20201228/OpenOCD-20201228-0.10.0/share/openocd/scripts/target/stm32f1x.cfg",
"-c",
"program build/test.elf verify reset exit"
],
"problemMatcher":[
"$gcc"
],
"group": "build",
}
]
}
配置过程也跟上一步配置编译的任务差不多,但是需要注意的就是openocd的路径以及生成的.elf目标文件的名字。
下面是openocd的路径


跟上一步一样,打开终端,点击运行任务,点击下载的任务。

调试
这部分需要做的工作是配置launch.json文件以及在task.json添加任务。
launch.json
点击左边的Debug图标,如果第一次设置的话,会让你创建一个launch.json文件。

选择红框的选项。

接下来选择默认配置。

生成的默认的配置文件如下。然后红框的部分就根据自己实际工程来修改。

修改后的配置文件:红色部分根据自己makefile要生成的target来修改,gdb路径根据自己的电脑路径来设置。绿色部分是因为我们使用的是openocd工具而增加的配置文件。注意增加部分的file test.elf。

最后修改完成的launch.json文件的内容:
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) 启动",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/test.elf",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "arm-none-eabi-gdb.exe",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{"text": "cd ${workspaceFolder}/build"},
{"text": "file test.elf"},
{"text": "target remote localhost:3333"},
{"text": "monitor reset"},
{"text": "monitor halt"},
{"text": "load"},
]
}
]
}
task.json
其实只是增加了一个启动下载调试器的任务,文件内容如下
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "编译代码",
"command": "make",
"args": [
"-j4"
],
"problemMatcher":[
"$gcc"
],
"group": "build",
},
{
"type": "shell",
"label": "下载",
"command": "openocd",
"args": [
"-f",
"E:/openocd-20201228/OpenOCD-20201228-0.10.0/share/openocd/scripts/interface/stlink.cfg",
"-f",
"E:/openocd-20201228/OpenOCD-20201228-0.10.0/share/openocd/scripts/target/stm32f1x.cfg",
"-c",
"program build/test.elf verify reset exit"
],
"problemMatcher":[
"$gcc"
],
"group": "build",
},
{
"label": "启动调试器下载",
"type": "shell",
"command":"openocd -f interface/stlink.cfg -f target/stm32f1x.cfg"
}
]
}
启动
打开终端,执行启动调试器下载任务。


当任务开启完成后,点击Debug图标,点击(gdb)启动

当出现下面的界面时说明配置成功,可以开始debug了

注意
-
有时候需要在cube工程重新配置一些外设,生成需要的代码,在进行编译的时候可能会出现这种错误,这是因为cube会在
makefile文件的包含路径重复增加,所以直接在makefile那里直接把多余的路径删除就可以了。

-
如果要增加自己的一些源文件,记得在
makefile的C_SOURCES增加必要的说明。
-
在下载交叉编译工具链的时候可能因为下载的是新版本,所以导致了某些路径的冲突,导致环境一直安装不成功。
总结跟改进
-
用
vscode来开发的话,比起MDK来说还是没有那么方便,需要添加一些配置,不过好处就是编译和下载的速度会稍微快点。但是debug功能还是没有MDK的香。 -
写新工程重新添加配置的时候,可能会因为生成的目标文件名字不同,所以有时候需要注意修改,后边如果有空可以研究写个脚本,直接把
makefile要生成的target用一个统一的变量表示,以后就不用写新工程的时候去注意修改目标文件的名字。 -
在
windows环境下,vscode有一个非常方便的插件iotlink,使用教程也十分简单。这个插件直接帮你把编译下载调试等功能设置好了,也会帮你把需要的工具链等等自动下载。不过这只限于windows。 -
有空也想在
linux环境下配置一下。