继上篇文章,如何在MacOS利用STM32CubeMX生成初始化工程、Makefile自动编译生成机器码,再通过OpenOCD烧录到Stm32的Flash。对于简单的实验操作,如Blink、按键输入、Beep蜂鸣器,是不会感觉在编写代码有啥困难,至多就需要来回在 "Drivers/STM32F1xx_HAL_Driver/Src"(HAL库定义描述功能函数等)、 "Drivers/STM32F1xx_HAL_Driver/Inc"(HAL库定义描述typedef、define等)来回翻阅。 (注: "Drivers/STM32F1xx_HAL_Driver/Src"是很重要的HAL库文件描述,里面包含了如何使用HAL库各种模块的说明)
在实际的项目时,多种功能模块组合,会使调用HAL库不同模块的频率增加。在缺失IDE的IntelliSense(补全功能),来回翻阅不同HAL库模块.c文件查看函数定义名等操作,是肯定让人抓狂的。所以缺乏IDE编写代码,即不符合工程项目实际需要,也不能高效的编写项目代码。那对于执着反对使用盗版软件,同时秉持学习是为更好了解背后具体运作原理。那如何解决不用Windows平台下的Keil,实现在Keil下方便的编写代码呢?VSCode!网络上也不乏有类似的教程,但还是回到我实际应用尝试过程中,遇到网络其他分享者没有提到的、不具体的问题。所以通过本篇文章,更好的描述如何在MacOS中,通过VSCode编写STM32(HAL库)代码。同样,本文章将会忽略如“如何在MacOS下安装VSCode”这类已经有很多很好的教程的问题,而更着重在 如何配置的问题上。
1 准备工作
- 利用STM32CubeMX生成工程目录(详见MacOS基于STM32CubeMX、Makefile和OpenOCD的Stm32交叉编译环境搭建)
- VSCode(安装方法见其他优秀的分享者或官方文档(English): Visual Studio Code on macOS)
- VSCode插件"C/C++ extension"(安装方法见官方文档(English): Using Clang in Visual Studio Code)
在这里引用VSCode的官方教程Using Clang in Visual Studio Code,能方便的自动生成VSCode工程Project。
打开"Terminal"用cd命令进入到STM32工程根目录,如
cd STM32_ProjectName/
在工程根目录,在"Terminal"中输入"code ."(需要提前在VSCode中安装shell command line)。将会自动生成相应的VSCode工程Project,同时自动打开VSCode.app
code .
可以看到。左边菜单栏就包含了由STM32CubeMX生成的工程目录结构,如"BEEP"(工程名)
![9cb2db40107944408acb6ac0c1f77e7a.png](https://i-blog.csdnimg.cn/blog_migrate/2d1b36e491b20d186fa3a425b3e2cfe3.jpeg)
2 配置C/CPP: Edit configurations(UI)
按"F1"或组合键"Command + shift + P"呼出Command Palette(我也不知道怎么翻译好...)。可参考Using Clang in Visual Studio Code 中"C/C++ configuration"
![2e25b312e29b8e8a227cd499905dfbe5.png](https://i-blog.csdnimg.cn/blog_migrate/60cc2d6b2644b9d3fa53c45931856e8b.jpeg)
在Command Palette中输入"C/C++: Edit Configurations (UI)",即上图选项中的第一项。进入配置UI(微软工程师幸苦了)
![56652499a19c0efc3f42673a4de2f515.png](https://i-blog.csdnimg.cn/blog_migrate/6355033e6d512282f717dbae72ec1b78.jpeg)
可以看到里面就能编写类似Makefile文件内,用以给编译器理解工程目录结构的各种信息。同样,我们也需要告诉这个插件,如何寻找对应的.h、.c文件,帮助我们在编写代码时检查语法和自动补全功能。
在这里对于不太了解STM32CubeMX生成目录结构的朋友,就需要参照着工程对应的Makefile,在这仅仅做简要的讲解,更细致的理解可以参考其他更优秀的分享者的文章。
- 编译器路径
通过我的观察,推测C/C++ Configurations插件是通过编译器来检查部分语法的(类似C标准库"stdio.h"中的printf()之类)。我们是通过交叉编译器,生成对应的机器码。所以在这里需要选(文本框右边有个小的选项标志)"/usr/local/bin/arm-none-eabi-gcc"(如果你的交叉编译器不在系统PATH中,可以自己填入对应的地址)
- 包含路径
描述中已经很清楚的说明"C/C++ Configurations"插件的工作方式,所以在这里需要填入包括HAL库的头文件的文件目录地址,用于给插件提供检索目录,达到自动补全的主要目的。对STM32CubeMX生成工程目录中相应.h头文件分布在哪不清楚的,可以查看Makefile辅助填写。(注意: 这里仅需要填Inc的目录,即.h所在的文件目录即可)
![2dac95b5b84e280823288889f853d747.png](https://i-blog.csdnimg.cn/blog_migrate/10b317946306d0817abbceac50d05171.jpeg)
通过查看Makefile文件内容,可以看到编译需要包含的Inc目录(-I目录Path)。依次填入,如下图
![80355a61cd1aabee4ef8d12b14a38514.png](https://i-blog.csdnimg.cn/blog_migrate/9ec34aed15f3f5dc2d01c3df62b1ff59.jpeg)
- 定义
定义的作用让编译器知道你需要使用HAL库中那些模块等类似的操作(相当于模块开关)。同样参考Makefile
![a88273b0d95dcd6b6d78da592df8cca1.png](https://i-blog.csdnimg.cn/blog_migrate/c2004fd3bfb484d7997a2d46dc2c983d.png)
可以看到通过define高速编译器需要使用HAL库、编译目标芯片的型号(-D定义)。依次填入,如下图
![a9ec5ef74e48fcff736ebd002967a267.png](https://i-blog.csdnimg.cn/blog_migrate/b652a20c2e7df786a7a82366960f160a.png)
至此,就能在MacOS下的VSCode通过HAL库优雅编写STM32代码啦~
![27d2a831336b89361dcc595f103188a9.png](https://i-blog.csdnimg.cn/blog_migrate/25b492e13cb5b822eb7631395121789e.jpeg)
Running Visual Studio Code on macOScode.visualstudio.com
![03839fff076117d477763149de9be55b.png](https://i-blog.csdnimg.cn/blog_migrate/2decc031d7065c5624a75c15c4a96446.png)
![03839fff076117d477763149de9be55b.png](https://i-blog.csdnimg.cn/blog_migrate/2decc031d7065c5624a75c15c4a96446.png)