对于我来说学习一个东西似乎是循环往复的事情,从不会学到会,然后学着学着发现自己又不会了,然后再一次从不会到会,又从会到不会。当我第一次感到自己学会了这样东西的时候,我就知道自己已经入门了。然后再从会深挖,学到深处发现自己又不会了。对于一个东西每一次发现不会的时候,我知道这是我的又一次突破。
现有市面上的单片机数不胜数,从会了第一款单片机开始,到发现有好多单片机不会,会了好几款单片机后发现许多单片机都如此特别,会了单片机的总体通式后发现许许多多的单片机都有他独特的开发环境。而在之前的摸爬滚打之中我发现去搭建一类单片机的开发环境有时候真的极为痛苦。特别是在拿到一台全新的电脑的时候,搭建一套环境真的十分费时费力。并且随着项目越来越大,团队开发的需求也迫在眉睫,但其实大家很多时候搭建的环境也不怎么一样,协同开发之前就需要很长时间去沟通开发环境的问题。
总是想着有没有像软件开发一样,有VS,Xcode等一系列的IDE,让我在开发这种类型的单片机时只用选择这种单片机的组件,就能立刻把这个单片机开发的所有环境在一个软件下自动化的搭建好,并且能保证团队开发时我们的操作系统不同,软件不同也能很好的协同完成开发。同时每个人的开发习惯不同,甚至连编辑器用什么颜色都会讨论一番。我喜欢在VSCode上搭建我的瑞士军刀,而他喜欢在Sublime Text创造他的工兵铲,甚至她只想在她的电脑里只优雅的躺着一个VS。
而有这样一个出生于2014年的小玩意已经成长为了一个十分优秀的,用于物联网开发的生态系统————PlatformIO
本教程仅提供搭建STM32开发环境的教程,如果要用于其它的单片机请看其它教程或者官方文档系统学习
通过前面的序言应该对PlatformIO有了一个粗浅的印象,而更具体是什么就可以自行去百度、知乎或者官网上去深入了解了。
这里只介绍在VSCode里搭建PlatformIO,其它的编辑器或者IDE去官网上查看教程就行。
注意:搭建时和本博客后面需要下载东西的时候一定要全局挂点东西(大家应该都是自己有办法的,没办法我这里也不能在这里教你嘛 ┑( ̄Д  ̄)┍)
直接在VSCode的拓展里搜索PlatformIO IDE直接安装。
安装好后还会安装一些组件,看完全安装完了重启VSCode。
如果直接用PlatformIO选择CubeMX生成的工作环境,在他自动安装完依赖环境和SDK等也能使用HAL库的,只不过CubeMX生成的代码与它的图形化界面更为方便。并且CubeMX自动生成的代码会把用到的HAL库复制到项目中,虽然项目会很大,可是对跨平台的时候更为友好。PlatformIO的HAL与CubeMX生成的HAL有部分的不同,如果直接编译会有一些报错,所以我们要使用CubeMX生成的库与链接器。PlatformIO的灵活性也让我们的想法能轻易实现。
PlatformIO的识别机制其实很简单,就是读取platformio.ini来识别项目的配置。有这个文件就是platformio.ini项目,所以以下引出了两种方法,一种比较规范,一种比较野。
在CubeMX做好配置后,在Project Manger->Project中设置好项目路路径和项目名称,将Toolchain/IDE改成Makefile(但其实后续编译和生成的的makefile也没有必然联系)。将Project Manger->Code Generator中的第一个改成Copy only the necessary library files。(Copy all作者也没试过,按作者的项目习惯是只拷贝用了的库,所以没测试。读者看完了后可以自行去尝试一下)
生成好后打开PlatformIO的home界面使用new project。
name要与CubeMX生成的项目名相同
board也要选择与你型号相同的单片机
framework随便选,等等我们要改(但建议可以选择Stm32cube)
location选择与CubeMX的项目路径一样的路径(不用打开项目文件夹)
然后等待亿下他安装这类单片机的开发平台、库、工具等。(第一次生成要安装这些东西会很慢,但后面再生成就会很快了)
我们要修改配置文件使其使用我们的库和链接文件。这里就直接把配置文件放出来复制粘贴吧(STM32F103RC的配置文件,不同看注释自行更改),至于更多的参数自行前往官方的说明文档中学习
;在配置文件中分号开头为注释
[platformio]
;将源代码的编译目录移到项目目录下,否则默认src下
src_dir = ./
[env:genericSTM32F103RC]
;配置平台和板子
platform = ststm32
board = genericSTM32F103RC
;framework = stm32cube(不用framework了)
;编译配置-D是宏定义,-Idir是include文件目录,读者可按自己项目结构更改
build_flags =
-D STM32F103xE
-ICore/Inc
-IDrivers/CMSIS/Include
-IDrivers/CMSIS/Device/ST/STM32F1xx/Include
-IDrivers/STM32F1xx_HAL_Driver/Inc
-IDrivers/STM32F1xx_HAL_Driver/Inc/Legacy
;选择编译文件的所在路径,这里包含了源文件路径,启动文件,驱动库和rtos路径。如果+<*>便是路径下的所以文件,-<.git/>便是忽略.git路径下的文件
src_filter = + + + +
;选择链接文件
board_build.ldscript = ./STM32F103RCTx_FLASH.ld
;选择下载的仿真器,这里是选择的jlink,如果不设置默认stlink
upload_protocol = jlink
;字面意思
debug_tool = jlink
保存等pio识别完成后,按左下角的build便可完成了(报错请查看报错说明,看看-I的路劲是否完全且正确)
这个路子比较野,因为PlatformIO是靠platformio.ini来识别项目的,所以直接把写好的文件复制粘贴到项目里面去就行了。(文件结构同上,自行更改后复制粘贴到目录下就行)
其实方法都一样,只需要更改配置文件的编译include文件路径就行,改动如下
[platformio]
src_dir = ./
[env:genericSTM32F103RC]
platform = ststm32
board = genericSTM32F103RC
build_flags =
-D STM32F103xE
-ICore/Inc
-IDrivers/CMSIS/Include
-IDrivers/CMSIS/Device/ST/STM32F1xx/Include
-IDrivers/STM32F1xx_HAL_Driver/Inc
-IDrivers/STM32F1xx_HAL_Driver/Inc/Legacy
;新增以下三句(其它的也自行更改就行)
-IMiddlewares/Third_Party/FreeRTOS/Source/include
-IMiddlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3
-IMiddlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2
src_filter = + + + +
board_build.ldscript = ./STM32F103RCTx_FLASH.ld
upload_protocol = jlink
debug_tool = jlink
直接点右下角的Upload就行,第一次烧录也需要下载几个驱动,jlink等驱动也在这里安装好了。后面就不需要等这么久了。只要你的电脑识别到了jlink并且识别到的你的单片机就能完成下载了。
在这样舒适的环境下debug当然也是很容易的。网上有许多方法都可以对其进行debug,但作者懒,就使用pio自带的debug方式了。VSCode中本身就有运行和调试模块,在我们生成项目后,pio就帮我们把debug的文件配置好了。只要在platformio.ini设置好我们的debug_tool就没问题了。(skip Pre-Debug模式就如它的字面意思,跳过了准备阶段的再编译再烧录的过程,直接开始调试)点击F5(开始调试)便跑起来了。我们能看见程序停在了main函数开始处。(旁边的参数相信大家就是老油条了,框如其名,就不再说了)
相应的,我们可以自行去修改launch.json的配置文件去为调试添加参数或者自行去修改调试的各个参数。至于配置文件各个参数的意义读者就自行参考VSCode官方的说明文档。
这个在解决了上面序言所说的一系列痛点的同时其实也解决了keil的一个小麻烦。keil在要添加用户编写的驱动文件不仅要把它添加进文件夹下,还要在软件下面再添加一次,而pio在设置好后直接把文件进去就可以直接编译了,方便快捷。