抛弃Keil罢,这篇文章将会介绍如何使用VSCode中的PlatformIO插件来配置一个STM32的多平台开发环境。

前言

博主本人并没有系统的学习过STM32的相关知识,此前接触的嵌入式相关内容也仅限于Arduino框架,因此这个环境是我入门STM32的第一个环境,我也尽了自己最大的努力来使这个环境尽可能的顺手,并且在能学习新东西的情况下保留我自己原有的开发习惯。写成了这个教程来供大家参考。由于水平有限,这篇难免有所不足,希望大家可以在评论区分享自己的看法。

模组

这个开发环境分为以下几个部分

  • STM32CubeMX软件来生成STM32的初始化配置和程序框架,并且提供库文件
  • PlatformIO平台来提供各种外部库文件的安装,各种工具(下载工具、调试工具等)的配置和程序的编译环境
  • VSCode作为IDE的框架

CubeMX的安装与配置

STM32CubeMX能够同时兼容Win、Mac和Linux三大平台,下载地址https://www.st.com/zh/development-tools/stm32cubemx.html
现在的CubeMX已经不需要额外安装java运行环境了,能正常打开就算成功
关于该软件,可以参考以下文章,在此不做过多介绍了
STM32CubeMX介绍、下载与安装
STM32CubeMX入门教程(一)

platformIO的安装与配置

安装

打开VSCode,扩展商店搜索PlatformIO,安装即可

代理设置

和许多其他工具一样,PlatformIO的主要坑就是国内的网络环境问题。
在首次安装平台(Platform)时、新建工程时、编译时、上传时都会联网下载相关的软件包。并且大多数时候并没有关于下载进度的提示,导致很多时候会出现卡住的情况
因此,设置代理时必要的,关于代理设置,不论是Win下还是Mac/Lin下,都是通过设置环境变量实现的
可以参考 PlatformIO使用中遇到的坑

1
2
3
4
5
6
#Mac/Lin举例
export HTTP_PROXY=http://127.0.0.1:1080/
export HTTPS_PROXY=http://127.0.0.1:1080/
#保险起见,同时设置以下两项
export http_proxy=http://127.0.0.1:1080/
export https_proxy=http://127.0.0.1:1080/

你需要把这段代码加到.bashrc或者.zshrc
完成后通过以下命令测试

1
2
curl http://google.com
curl https://google.com

均有获取到内容则成功

环境安装

VSCode打开后点击下方蓝条的主页图标,或者左侧点击外星人图标再选择PIO Home-OPEN即可进入PlatformIO主页
主页左侧,可以管理项目、库、开发板、和平台
对于STM32开发,首先安装ST STM32Platform
在Platform菜单,Embedded选项卡中搜索安装即可
另外,安装也可以使用命令行进行(可以看到下载进度)
左侧选项卡中,点击PlatformIO Core CLI,VSCode下方会打开PIO命令行

1
pio platform install ststm32

即可

新建项目

PIO Home,左侧Project菜单,新建项目
根据你的开发需求选择对应的MCU或开发板,对于CubeMX生成的代码,选择CubeMX框架
如果CubeMX已经生成好代码,项目名与Cube中项目名相同,项目目录为项目名文件夹的上层目录
首次使用某MCU或者首次使用某框架,需要下载对应组件,需要挂上代理稍等(5分钟左右)

配置项目

官方对于platformio.ini文件格式的文档 “platformio.ini” (Project Configuration File)
项目新建后会自动打开,PIO的默认代码源文件在项目文件夹下的src目录,与CubeMX不同
修改文件夹下的platformio.ini文件,新建一些配置项

1
2
3
[platformio]
src_dir = Core/Src
include_dir = Core/Inc

然后尝试点击下方工具栏的勾号编译

上传程序

默认的上传方式是STLink,即插即用,其他方式可以通过修改platformio.ini定义

1
2
[env:xxxxxxxx] #在你对应的env部分中添加
upload_protocol = cmsis-dap #支持的方式请见文档

点个灯试试

以外置晶振的STM32F103C8T6为例,LED引脚PA8

生成框架

打开CubeMX,进入MCU Selector,搜索并选择F103C8T6

在引脚配置中,选择对应引脚,单击配置为GPIO_Output模式
右击引脚,设置UserLabel为LED
左侧功能栏中,选择RCC,配置HSE为外部晶振,此外建议打开调试功能,选择对应的调试模式

下一步进入时钟配置,时钟树可改可不改,点个灯而已
然后进入Project Manager,配置名称与路径,Toolchain选择Makefile

右上角GenerateCode,结束

PIO配置

打开PIO Home,新建项目,选择MCU和Framework,目录与Cube相同

完成后打开工程,发现左侧已经有Core等文件夹,生成的代码已经导入了
修改platformio.ini,尝试编译

写代码

打开main.c,写入点灯代码
找到main函数的while(1)循环,所有代码应写在对应的USER CODE BEGINUSER CODE END注释之间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* USER CODE BEGIN WHILE */
while (1)
{

HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
//翻转LED引脚的电平
//LED是你在cubemx中自定义的UserLabel名称,CubeMX会自动定义LED_Pin指向该引脚
HAL_Delay(1000);
//延时1000ms

/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
}

编译上传,成功
若没有在CubeMX中打开调试功能,能上传程序,但是只能上传一次,后续需要手动复位才能重新上传