![fbc037387083bd74dca06ae5a65e5186.png](https://i-blog.csdnimg.cn/blog_migrate/a2a90dfe88312b98cf7c91d6b2da7ac5.jpeg)
2020年7月26日更新:
增加了Jlink GDB Server的支持,可以使用J-Scope 和 SEGGER RTT了
2020年7月3日更新:
改为了使用Cortex-Debug插件来进行调试;
详细研究了c_cpp_properties.json该如何配置,保证消灭红色波浪线;
修改了一些细节使其适应最新的软件;
1. 用STM32CubeMX创建工程
STM32CubeMX生成的是用HAL库开发的项目,具体怎么配置这里就不介绍了,只介绍重要部分。
1.1. 安装支持包
主页右边可以安装不同芯片的支持包,例如F1系列,F4系列
![1b771037417ba0c326885a5f94c3ddcb.png](https://i-blog.csdnimg.cn/blog_migrate/e3237c2914ef7c326f16686a1c11bd5c.jpeg)
1.2. Debug接口配置
左上角File..可以新建项目。
新建项目以后,SYS里选择debug接口,这里选的是SWD,也可以选JTAG
![0ae29c5c6c0e9c0f86d1ced064a72892.png](https://i-blog.csdnimg.cn/blog_migrate/e80dfbeaa4632cdd9a7f198daeb6fce4.jpeg)
1.3. 时钟配置
先在RCC里选择高速外部时钟(HSE)和低速外部时钟源(LSE),这里选的都是晶振(因为板子上有这两个晶振)。
![75928f54d22f96c0cb6fa820a898d0f8.png](https://i-blog.csdnimg.cn/blog_migrate/8b8c6589c5dba375666a9f834d1bf9e2.jpeg)
然后选择“时钟配置”,先在左边填好外部晶振的频率,然后在右边填上自己想要的主频,Cube会自动帮你配置锁相环。
![8aba3931545848bd6d07167dc9f8a484.png](https://i-blog.csdnimg.cn/blog_migrate/f2d871baedb49b5e25b92ad3392cebb9.jpeg)
1.4. 项目配置
Toolchain/IDE选择生成makefile即可。前面的项目结构我选的basic,你也可以选Advanced,后面目录结构就不一样了,VSCode的配置要稍微改一下。
![c6a393234eb2a6936b64c380b6548305.png](https://i-blog.csdnimg.cn/blog_migrate/4397571efeb2f8160da1b067890ac070.jpeg)
1.5. 代码生成器配置
我选了这几个选项,看名字就知道意思了,推荐勾选
![37ccc0891c06d211033c853f06419f63.png](https://i-blog.csdnimg.cn/blog_migrate/74ffece774e2fcf8f6053f4d3d9ef286.jpeg)
1.6. 生成代码
点击右上角的GENERATE CODE生成代码。
2. 配置VS Code
用VS Code打开工程文件夹,你将会看到这样的目录结构:
![5f29db152fb8ac0435903d33d9259455.png](https://i-blog.csdnimg.cn/blog_migrate/d645da467ba9c17dab5d2f7af90194fc.png)
.ioc文件和.mxproject文件是STM32Cube的工程文件,Driver里是STM32和ARM CMSIS的库,最好不要修改。Inc和Src是供用户修改的源码。
2.1. 安装VS Code 插件
在插件商店搜索即可,需要这几样:
- Chinese (Simplified):VS Code的语言支持是以插件形式存在的,需要装个中文插件;
- C/C++:提供代码补全、智能感知和debug功能;
(注意,VSCode 可能会推荐你安装C/C++ Intellisense插件来做智能感知 ,但它依赖于GNU Global工具,我们的arm工具链里没有这个,所以不用装);
- C/C++ Snippets:好用的代码模板小工具。比如说,装好以后,敲个for,就可以自动补全整个for循环代码;
- ARM:提供ARM汇编语言的代码高亮;
- Cortex-Debug:本教程的核心,有了它,才能把ARM工具链和OpenOCD等命令行工具组织到VSCode中,并进行图形化操作。
2.2. 配置VS Code内置终端(linux不用管)
文件--首选项--设置,搜索terminal,设置内置终端的Shell为git bash(之前的默认是power shell)。
![18dbd39dbbbb8c70f455e24fca9f0215.png](https://i-blog.csdnimg.cn/blog_migrate/1f6e9541c01ade2c7c749a8797b8f25a.png)
点击“在settings.json中编辑",修改为自己安装git bash的路径:
"terminal.integrated.shell.windows": "C:Program FilesGitbinbash.exe"
Ctrl+S保存后,按 Ctrl+` (波浪线那个键) 就可以打开终端,就可以看到Bash了:
![1ffdbc129c78639f492cc5316be6298b.png](https://i-blog.csdnimg.cn/blog_migrate/3731eadd6443768e1d20839c2fa9ff00.jpeg)
【注】如果你只想在开发STM32的时候用bash,可以只在当前目录下新建一个.vscode文件夹,然后新建一个单独的settings.json,在里面写上:
{
"terminal.integrated.shell.windows": "C:Program FilesGitbinbash.exe"
}
这就是只在这个文件夹内生效的配置了,会覆盖掉全局的配置。
2.3. 配置智能感知
其实这个时候我们敲make已经可以编译成功了。但是VS Code的编辑窗口里会给我们亮一堆红点,代码里给我们一堆红色波浪线。这是因为VS Code本身的一个待改进的地方,下面具体解决。
还记得我们使用Keil开发时,Project Options里的全局宏定义吗?
![41bb4a3a6d5eb0786068ac193fb42a77.png](https://i-blog.csdnimg.cn/blog_migrate/c4bd0aae7afa08bc9e8697131a25b1e9.jpeg)
在通过Makefile组织的项目中,这两个宏是通过gcc的-D参数在编译时添加的:
![c9660c401fdfc87cb214030fbdd26ff8.png](https://i-blog.csdnimg.cn/blog_migrate/000a8533a795c981a7c93ef4fcd22f45.png)
但是,VS Code只是一个编辑器,它检查代码的时候并不会去读makefile,而是只看.h和.c文件,于是stm32f4xx.h中就检测不到那个宏,表现为灰色(认为这个宏没有被定义):
![74e5768eea97250338102356ed9fa5ad.png](https://i-blog.csdnimg.cn/blog_migrate/acf18e3bd6cd072a3bc03b966a98a2cf.jpeg)
于是你就可以看到一大串”xxxx is undefined”之类的报错,其实都是这个原因导致的。但是直接去make的话是没有问题的。
因此我们需要在当前目录的.vscode文件夹下创建c_cpp_properties.json配置文件,用来告诉VS Code我们定义了这些宏。
随便找到一处红色波浪线,点击并把光标移到那一行,左上角会出现一个黄色小灯泡。点击黄色小灯泡并选择“编辑‘includePath设置’”。
![2c538101a7a881789569404c05d493c4.png](https://i-blog.csdnimg.cn/blog_migrate/2224fc4948628d4a56401f2fd7fe6730.jpeg)
直接用c_cpp_properties.json
来配置:
![6103574f59e9c1e1bd9849877c65a586.png](https://i-blog.csdnimg.cn/blog_migrate/5763133e4dde4333795b78f028b93fb2.jpeg)
VS Code自动在当前目录下的.vscode文件夹下生成一个c_cpp_properties.json文件,我的配置给出如下:
{
"configurations": [
{
"name": "Win32",
"includePath": [
"C:/Program Files (x86)/GNU Arm Embedded Toolchain/9 2020-q2-update/lib/gcc/arm-none-eabi/9.3.1/include",
"${workspaceFolder}/Inc",
"${workspaceFolder}/Drivers/STM32F4xx_HAL_Driver/Inc",
"${workspaceFolder}/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy",
"${workspaceFolder}/Drivers/CMSIS/Device/ST/STM32F4xx/Include",
"${workspaceFolder}/Drivers/CMSIS/Include"
],
"defines": [
"USE_HAL_DRIVER",
"STM32F407xx"
],
"compilerPath": "C:/Program Files (x86)/GNU Arm Embedded Toolchain/9 2020-q2-update/bin/arm-none-eabi-gcc.exe",
"intelliSenseMode": "gcc-x64",
"browse": {
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": "",
"path": [
"${workspaceFolder}"
]
}
}
],
"version": 4
}
这个配置是我研究测试很久得到的,保证没问题,下面详细解释几个重要部分:
- “name”:这是用于标记使用的平台的标签。除了win32还可以选Linux或Mac。也就是说,这个json里“configuration“下可以写三组配置,只要每组配置前面写上不同的平台,即可在不同的操作系统上使用就会自动适配不同的配置,非常方便
- "includePath":告诉VS Code该去哪里查找头文件。第一个目录是C语言标准库的目录, 剩下的几个目录直接从Makefile里复制然后稍微修改下即可。
"${workspaceFolder}"
表示项目文件夹; - ”defines“:全局宏定义,告诉VS Code这些宏都被定义了,只是没写在源码中而已。上述多加的两个宏是makefile里的。
- "compilerPath":指定编译器的路径。因为有一些宏是编译器自带的,连makefile里都没有,例如
__GNUC__
。有些教程里会让你在defines里面加上__GNUC__
,但是这是没必要的。只要你指定了编译器路径,所有的编译器自带的宏就都导入了VS Code。 - "intelliSenseMode":因为我们用的是gcc所以选gcc-x64
- "browse.path":源文件搜索路径。据说是用来做代码补全和查找定义的,但是我测试后发现删去也不影响使用,不过还是留着吧。这个路径和includePath不同,browse.path是自动递归所有子目录的。而include.path默认只看本目录。
Ctrl+S保存c_cpp_properties.json文件,发现左边目录里一个红点都没有了,强迫症舒服了!
![c20cc7d26f39d46e195b71002db2db9f.png](https://i-blog.csdnimg.cn/blog_migrate/76eb4708e24fbecf6165308b6b3b167d.png)
2.4. 配置build任务
直接在终端里敲一个make,就会根据makefile的内容,在当前目录下创建一个build文件夹,在里面生成每个源文件生成的.o文件,以及最终链接得到的elf文件(用于调试),以及用于直接下载用的十六进制文件(.hex)和二进制文件(.bin)。编译成功的话看起来就像这样:
![048a4ac18a215e1963a257af54ce1d9e.png](https://i-blog.csdnimg.cn/blog_migrate/4c704bfca10f1af7cfab3a56e19aa0b0.jpeg)
【注】如果你没有看前一篇文章,git bash里没有make,可以从这个链接搞
为了方便后面的操作,我们在.vscode目录下创建tasks.json文件(文件名里别少了s!),内容如下:
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "build",
"type": "shell",
"command": "make",
"args": [
"-j4"
]
},
{
"label": "clean",
"type": "shell",
"command": "make",
"args": [
"clean"
]
}
]
}
这个文件创建了两个任务,分别叫做build和clean,build任务就是在bash里执行了make -j4,clean任务就是在bash里执行了make clean。VS Code是可以给任务绑定快捷键的,具体就不介绍了,有兴趣可以自己搜索。
不使用快捷键而执行task的方法:按Ctrl + P,然后输入”task[空格]“,就会出现可用的任务列表。
至此,编译的部分已经完成,下一部分是调试。
链接:
Jayant:用VS Code开发STM32(一)——软件安装zhuanlan.zhihu.com![e4f5a8637c71511b923b706ab3feffa6.png](https://i-blog.csdnimg.cn/blog_migrate/803d80ec62ab38a372abf2ac12c45886.jpeg)
![5706d3e3976c93ffc28a9c142ad96b6d.png](https://i-blog.csdnimg.cn/blog_migrate/0f1ebe37b1875ec828f1d049847fab2a.jpeg)