前言
本文主要是介绍在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
环境下配置一下。