![5af024a3501bc20dc015d71445a63062.png](https://i-blog.csdnimg.cn/blog_migrate/093758b3489fe702fce782bdcbb28ed4.jpeg)
SAST weekly 是由电子工程系学生科协推出的科技系列推送,内容涵盖信息领域技术科普、研究前沿热点介绍、科技新闻跟进探索等多个方面,帮助同学们增长姿势,开拓眼界,每周更新,欢迎关注!欢迎愿意分享知识的同学投稿至eesast@mail.tsinghua.edu.cn , 期待你的作品!
前言:
笔者大概是电子系里为数不多的、习惯使用Macos操作系统的选手,然而在接触硬件开发时,还是面临着Keil软件没有macos版本的严重问题。迫于需要自力更生,不得不在网上查阅了诸多资料,也踩了许多坑,最终才完成了这套工具链的配置。
然而,尽管已经在宿舍安装了windows的台式机,还是沉醉于vscode的高颜值、强大的代码补全和跳转功能,因此希望将这个方法与大家分享,相信大家在花费一点点时间安装之后,都能够享用到这套工具带来的极大便捷。
本方法适用于windows、macos、linux三大操作系统。
由于使用STM32CubeMx进行初始化,因此将使用Hal库作为底层接口函数。建议在对STM32有初步了解后再去使用,避免掉坑。如果仍有配置上的困难,也欢迎联系笔者,一起讨论解决~
本方法所用到的大多文件都已经上传至清华云盘,可以在文末的链接中进行下载。
STM32CubeMx配置部分
首先,我们可以按照硬件部暑期stm32培训第一讲中的方法,设置LED灯的GPIO和时钟树。
在生成工程文件时,有别于MDK-ARM,我们这里选择makefile工具链。
(如果打不开STM32CubeMx,可能是由于Java版本不对,建议下载JDK8,更高版本因为缺少一部分功能,可能会在生成工程时报错)
![9544596ea318524f0613186449eadb27.png](https://i-blog.csdnimg.cn/blog_migrate/5b6399a1b4c35b3b67ac5585f839ae88.png)
Gererate code之后生成项目
![bc75c1889de96796ff5f90240b99eb36.png](https://i-blog.csdnimg.cn/blog_migrate/82e937507797d50dd44fea3bcb15c537.png)
VSCode编辑
![de2ebc5ddf7382a68a58cab295ca1551.png](https://i-blog.csdnimg.cn/blog_migrate/c5f4c8e4cb1a1ffdce75c1cc4e4541ee.png)
用vscode打开所在文件夹,.s文件里面可以查到各种各样的中断函数,但最重要的是Makefile文件:
![fce7c2a0f0d00799af3aff926ce72d35.png](https://i-blog.csdnimg.cn/blog_migrate/36192146377fb6fc3f25c6580f6d6eef.png)
如果在工程中添加了其他文件(不是由cubemx生成的),还需要把路径添加到Makefile的c_includes中去,见上图(和Keil操作类似),否则可能会在编译时,发现无法找到相应的头文件,尽管可以跳转找到。
![04d17c80bb03973abd99b8240cb8de04.png](https://i-blog.csdnimg.cn/blog_migrate/ce99c4a11c0e2903827d37f036b580fe.png)
此外,如果有新增加的源文件(不是CubeMx生成的),同样也需要将文件的相对路径添加到C_SOURCES中(见上图),否则这个文件将不会被编译,最后会报错(无法找到对应的函数/变量)。
在Makefile文件的C_DEFS中进行了全局宏定义,需要复制到vscode的c_cpp_properties.json中(可以用shift-control-P搜索)(之后需要的全局宏定义也都要在这两个地方添加)
![bdeac1192f8450b68012ec0cbbb472dd.png](https://i-blog.csdnimg.cn/blog_migrate/e06ee6fa7d19449e42da4cb12b6fa597.png)
![72bbfbd4a10b5897b25cc84e63dd5b38.png](https://i-blog.csdnimg.cn/blog_migrate/03d8b6625fd26b4d67e94bd998451214.png)
在difines中添加Makefile的两个全局宏定义,从而解锁了大量代码补全:(忽略大小写、待补全内容不需要连续),从此妈妈再也不担心我们会记错函数的名字了
![6b868e90ceae0cede07355d11c0818ef.png](https://i-blog.csdnimg.cn/blog_migrate/790feb8952e620202c347c4fd2b0fe3a.png)
![351ef680908e48f2b6b254e288f58ba4.png](https://i-blog.csdnimg.cn/blog_migrate/12e2c00897c15e20feb28707b063de61.png)
![c8ddae54366c0e098c8736a0e0de87c4.png](https://i-blog.csdnimg.cn/blog_migrate/3b755248f479d7410dc32ca9c9fca098.png)
此外也解锁了非常方便的跳转功能:按住crtl后(mac中是command)直接点击函数名/文件名/报错位置,就可以跳转到定义/声明/文件
![a25f0b0d89f19a7f8f47dc6c16176b91.png](https://i-blog.csdnimg.cn/blog_migrate/eb276a6d1ce2a92437614c42b2f637ed.jpeg)
到这里,我们不妨假设大家已经有能力完成源代码的编写,那么下一步就是至关重要的编译了。
gcc-arm交叉编译
我们用GNU Arm Embedded Toolchain(大概是arm公司提供的官方编译工具链)来进行编译
https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads
![c0c096ae5628f8f5127d27b74f42124d.png](https://i-blog.csdnimg.cn/blog_migrate/4f4b902dbd7263b252430ca02c3456ab.png)
大家可以自行选择合适的版本进行下载安装
安装完毕后记得勾选“添加环境变量”,以便在命令行直接使用相关指令;如果没有自动安装的话也可以手动添加:
![ec34192b2a5f3f0a91ed876d5e2dc987.png](https://i-blog.csdnimg.cn/blog_migrate/38a8dca1526786928b0738ec9ecb96e4.png)
右击此电脑—高级系统设置—环境变量—找到Path—编辑—新建
![452a34e95ed53e4278a2344b2a861f02.png](https://i-blog.csdnimg.cn/blog_migrate/e7c86fc2fc2c1d02a06749376fb09929.png)
复制进去如下的文件夹的路径(以防万一,可以把用户变量和系统变量都添加上),点击确定、保存之后重启电脑即可。
![24b0d7b599f442073bf335c90e883341.png](https://i-blog.csdnimg.cn/blog_migrate/0e144f5b2247c5c070dec2802db79ec8.png)
由于没有提供make文件,可以将网盘上提供的一个make.exe复制进这个文件夹
https://cloud.tsinghua.edu.cn/f/cdacebb6e7474a5ba83f/
此后,我们只需要在vscode的终端输入make并点击回车,就可以开始编译了,
![508573a4977265aa9a07ebf674821f0c.png](https://i-blog.csdnimg.cn/blog_migrate/62f906ba2c7a87630a78fd0ff5fa1cd7.png)
![6542690fa3424380f44f7a3093629038.png](https://i-blog.csdnimg.cn/blog_migrate/20be114719719b00a1c9dd3880fbdc9d.png)
编译完成后会产生hex和bin文件,将其烧录进入单片机即可
常见错误:除了C语言的语法错误之外,最频繁的就是忘记将新加的文件写在Makefile中,建议返回上一节的内容仔细检查相关步骤。
![29dad772caf2ed386a6b62a715804feb.png](https://i-blog.csdnimg.cn/blog_migrate/c12e75ddaa72a2b28ad1be6ca3b5f53c.png)
![53a5f9e23cabe08f06909fcd7774afef.png](https://i-blog.csdnimg.cn/blog_migrate/1bc8b318e765035f4e8e5d6bce08d347.png)
另外,如果出现无法显示浮点数的问题,可以修改Makefile中的编译选项,将LDFLAGS中的nano.specs(精简版标准库)改为nosys.specs,可以看到编译产生文件的大小会略微增大。
STM32CubeProgrammer烧写
我们可以在st官网上下载这一软件
https://www.st.com/en/development-tools/stm32cubeprog.html
一个大坑在于,与cubemx类似,这一软件需要安装java环境,但高版本的JDK省去了一个重要组件,会导致无法打开图形界面,因此建议使用jdk8
之后可以打开图形界面,长这个亚子:
![8bcc899fc208e2405413b9517059023f.png](https://i-blog.csdnimg.cn/blog_migrate/89692bc3277d29d83ab85b39f601973b.png)
在右侧的Firmware upgrade里面可以升级stlink的固件,如果识别不到,可能需要重新插一下stlink:(如果不升到最新版本的话可能不能正常烧录)
![a76f8f9474acc362e3222410af0c6453.png](https://i-blog.csdnimg.cn/blog_migrate/ed52714c338fcac02416fc51c384cd12.png)
目前常用的功能,一是stm32芯片的烧录:
连接stlink后,在file path中找到之前编译生成的bin文件,勾选Run after programming,点击Start Programming即可。此后就能看到stm32上的绿灯在每隔半秒闪烁一次。
![bad6e5c41e325e0d1826a71d867c896b.png](https://i-blog.csdnimg.cn/blog_migrate/f34d64e9b40dbc80ebaaffe0a7cbcbae.png)
另一作用就是芯片的重置:
如果烧录程序突然无法识别stm32,一个可能的原因是在stm32cubemx生成进行配置的时候,SYS的Debug没有设置成Serial Wire,这时就需要设置mode为Under Reset,再点击连接,进行Full chip erase就可以重置芯片,从而进一步烧录(顺便记得把工程Debug设置好)
![bb32234639c065d5095f8ea9ae61f1d9.png](https://i-blog.csdnimg.cn/blog_migrate/ac2b4b867bc43747e67954a90f9b8d25.png)
![8d1732946370739a78b63180ac4f5287.png](https://i-blog.csdnimg.cn/blog_migrate/2e2c7b77f719f1c737a23067a357d95f.png)
最后,如果大家还觉得这样的操作比较麻烦,那么我们可以利用命令行工具简化操作:首先在环境变量的Path中添加CubeProgrammer所在的文件夹:(把软件安装在了哪里)
![06ce608261fb7ecbe47f753d6771c863.png](https://i-blog.csdnimg.cn/blog_migrate/a090286c28323d20b26b2f03f33e41b7.png)
添加环境变量的操作同前;
在vscode的终端里,我们可以用命令行(CLI)一键烧录:(复制进去之后,直接按键盘的上箭头就可以显示之前已经使用过的指令,非常方便)
指令是STM32_Programmer_CLI -c port=SWD -d build/demo(工程名).bin 0x8000000 -s
![fe0df21b9cfc6e8761737055fbcc0787.png](https://i-blog.csdnimg.cn/blog_migrate/1641f796d6d2ddbc480ffb492bb08fee.png)
(因为还没修改debug选项,第一次没有烧进去,走一遍reset的流程,就可以顺利烧录了)
注意用命令行烧录的时候,需要断开图形界面软件和stlink的连接,事实上之后调试的时候就完全不需要打开图形界面了。
![5c79189a144a6c7f6e92117b4f2e315d.png](https://i-blog.csdnimg.cn/blog_migrate/3a499ea68a32504aad20812d94932582.png)
笔者也不知道这个鬼畜的“圹”是从哪里来的,但毕竟已经达到了100%,stm32上的灯也开始闪烁,可见这套流程总算是圆满成功了。
总结:
之所以要研究这套工具链,一是在于它能够兼容macos和linux系统(家里电脑是windows但随身笔记本mac air选手留下了辛酸的泪水),二是在于vscode的自动补全、跳转、搜索功能过于舒适。但一大问题还是在于,我们学习stm32所用的很多例程都是基于Keil的,所以需要大量的时间进行移植和debug,不过能在debug的过程中一步一步理解原理,找到问题所在,也算是一件令人头秃但快乐的事情吧。
![d31d6df7b6ac0fd530d7161941ea716d.png](https://i-blog.csdnimg.cn/blog_migrate/13998efe3a44b9cd9d4885a74dab9b1a.png)
附一张用11寸mac air花了好长时间摸(调库)出来的欧拉角检测
参考资料:
https://www.bilibili.com/read/cv5602458/(windows版)
https://blog.csdn.net/qq_39498701/article/details/104523284 (mac版)
文件资源:
https://cloud.tsinghua.edu.cn/d/212bf181bfdf44f49ee2/
撰稿人 | 高义淮
审稿人 | 刘洋
![546d2dec69a4cae83b11b8835f2a810b.png](https://i-blog.csdnimg.cn/blog_migrate/5c79ee50aabc50180548cd6300feb4ff.jpeg)