platformio是一款跨平台的物联网开发的生态环境,VS Code 这款强大的文本编辑器辅以 PlatformIO IDE 插件就可以化身为一款强大的MCU开发环境,支持绝大多数流行的单片机平台,比如今天要讨论的 stm32 系列单片机。
测试环境及工具
- 本文讲解使用的系统平台是 macOS 10.14,其它平台比如 linux、windows 步骤和操作基本类似;
- stm32 开发板是以stm32f103c8t6为核心的最小系统板;
- stm32 芯片调试器使用的是 stlink v2;
platformio IDE 搭建
- 下载对应平台的VS Code,这里下载 mac 版的,下载完成后安装即可;
- 打开 vs code ,点击左侧第五个按钮,显示插件管理界面,搜索插件 PlatformIO IDE,并安装此插件;
安装过程耐心等待,成功后会有提示!
platformio IDE 简介
重新打开安装好插件的 VS Code ,会看到左下角多了一个小房子logo样式的按钮,点击这个按钮就会打开 Platformio 主页:
可以看到主页中最顶端包含了一个导航栏,有用的就是前进后退的按钮和账户相关的交互元素,整个主页其实是Platformio在本地开启了一个web应用(类似于一个简单的小网站),包含了Home、Account、Libraries、Boards、Platforms和Devices六个标签页,下面分别简单说明一下。
Home 标签页
进入Platformio 的主页显示的就是 Home 标签页,标签页内从上到下可以依次看到以下内容:
Show at startup
的复选框,勾上后,每次启动 vs code 就会启动这个主页;Quick Access
下有四个操作按钮,分别是:- New Project:用于新建工程;
- Import Arduino Project:用于导入电脑中已经存在的 Arduino 工程;
- Open Project:用于打开已经存在的 Platformio 工程;
- Project Examples:用于打开本机已经安装的单片机平台的例程工程;
Recent News
:显示最新 Platformio 信息;
Account 标签页
这个标签页用于管理账户信息,首次打开的时候,是用户登录页面,当登录已有的 Platformio 账户后,就会显示用户信息和密码的相关操作,这里就不细讲了!
Libraries 标签页
-
Registry 标签页
这个页面是有一个搜索框,搜索框内没有内容的时候,会在搜索框下面显示所有可用的库,搜索框中输入关键词就会过滤显示相关的库。
点击想要安装的库,就会进入这个库的详细页面,这个页面里有安装按钮、例程、使用方法等操作接口。
-
Installed 标签页
这里主要展示本机已经安装的第三方库。
-
Built-in 标签页
这里显示已安装平台内置的库。
-
Updates 标签页
展示需要更新的库。
Boards 标签页
这个标签页用来展示 Platformio 支持的开发板列表,最上方的搜索框内可以输入关键词过滤显示相关的开发板,比如输入 Arduino 就会显示Arduino的开发板。
列表中每个条目显示一个开发板,包含信息:
项目 | 含义 |
---|---|
Name | 开发板名称 |
Platform | 对应的单片机平台 |
Frameworks | 支持的开发框架 |
MCU | 对应的单片机型号 |
FRQ | 单片机工作主频(Mhz) |
ROM | 单片机的存储 |
RAM | 单片机内存 |
Extra | 其它信息 |
Platforms 标签页
这个标签页用来管理平台支持,比如我的这里安装了两个单片机平台的支持:
- Atmel AVR
- ST STM32
这两个条目可以点进去查看平台详细信息和对平台进行一定操作。标签页内还包含所有的嵌入式、桌面平台的相关管理项,同时也有框架展示的标签页,可以通过这里的每个条目了解对应框架的信息和使用方法。
Devices 标签页
这里显示连接电脑的硬件设备,比如串口、数字逻辑设备和网络设备。
使用 Platformio IDE
这里以创建 ST STM32 平台的 stm32f103c8t6 芯片工程为例,讲解一下工程的基本使用方法。
新建工程
-
打开 Platformio 的主页,点击
New Projects
; -
在工程新建窗口中,配置如下创建名为 blink 的工程:
最后点击 Finish ,等待片刻工程就会创建完成。
这里暂时选择使用框架为
Arduino
,stm32还可以选择其它框架,这里先挖个坑,等有时间专门写一下针对stm32其它框架的使用。
工程界面介绍
新建工程后,就会打开相应的工程,如下图所示:
文件结构
窗口左侧默认显示的是资源管理器,这里可以看到文件结构。
.pioenvs
文件夹:存放编译产生的中间文件和最后生成的执行文件;lib
文件夹:存放库文件;src
文件夹:存放源文件,其内部默认生成名为main.cpp
的源文件;platformio.ini
:工程的配置文件
工具栏
在工程窗口的左下方会看到多出来的一些按钮,这就是工程的工具栏:
依次说明这几个快捷按钮的作用:
- 主页按钮:前面已经提到过是打开 Platformio 主页的按钮
- 编译按钮:小对号,点击后会编译当前激活的工程
- 烧写按钮:向右的小箭头,触发程序烧写的过程
- 远程烧写按钮:小云朵,触发远程烧写程序的过程
- 清理按钮:小垃圾桶,用于清理编译过程生成的文件
- 测试按钮:小烧瓶,测试工程,免费版的Platformio受限不能用;
- 运行任务按钮:小本子,会跳出操作菜单,包含编译、烧写、调试等操作;
- 串口监视器按钮:小插头,点击后会启动命令行的串口监视助手;
- 终端按钮:小命令行,点击后新建一个终端窗口;
快捷操作栏
点击窗口左侧的做后一个logo也就是小蚂蚁头,就会出现针对工程的快捷操作:
根据字面意思就知道相应快捷操作是什么用途了,这里就不做介绍了。
编写代码
src文件夹下为源文件,更改源文件 main.cpp
的内容如下:
#include <Arduino.h>
#define LED_PIN PB0 // 十里使用的最小系统板板上LED连接的是PB0
void setup() {
pinMode(LED_PIN, OUTPUT);
}
void loop() {
digitalWrite(LED_PIN, HIGH);
delay(1000);
digitalWrite(LED_PIN, LOW);
delay(1000);
}
编写代码过程中就会感受到强大的代码提示功能,写代码从此一马平川,各种666!同时也支持代码跳转,比如跳转到函数定义,可以按住 command
键(linux和window下是 ctrl
键)然后鼠标左键单击就可以跳转,感受空间穿梭的快感!
编译程序
这个操作很简单,点击工具栏中的编译按钮即可触发编译,编译信息会在新的终端窗口中显示,初次编译的时候,会很慢,那是因为 Platformio 根据工程配置下载对应的平台支持文件,包含了配置的框架、编译工具、调试工具等等,因为这是国外的服务,所以可能会很慢,耐心等待即可,编译完成后,会出现如下类似信息:
> Executing task: platformio run <
Processing genericSTM32F103C8 (platform: ststm32; board: genericSTM32F103C8; framework: arduino)
...
Compiling .pioenvs/genericSTM32F103C8/src/main.cpp.o
...
Compiling .pioenvs/genericSTM32F103C8/FrameworkArduino/wirish_time.cpp.o
Archiving .pioenvs/genericSTM32F103C8/libFrameworkArduino.a
Indexing .pioenvs/genericSTM32F103C8/libFrameworkArduino.a
Linking .pioenvs/genericSTM32F103C8/firmware.elf
Checking size .pioenvs/genericSTM32F103C8/firmware.elf
Building .pioenvs/genericSTM32F103C8/firmware.bin
Memory Usage -> http://bit.ly/pio-memory-usage
DATA: [== ] 15.3% (used 3136 bytes from 20480 bytes)
PROGRAM: [== ] 21.6% (used 14188 bytes from 65536 bytes)
============================ [SUCCESS] Took 3.33 seconds ============================
终端将被任务重用,按任意键关闭。
触发编译还可以使用快捷操作栏中的 build
操作。
上传程序
十里使用的是 stm32f103c8t6 的最小系统板,经调试器 stlink v2 连接电脑,点击工具栏的烧写按钮(或者快捷操作栏的 Upload
操作),即可看到跳出的终端中显示上传过程中打印的信息,这里就不列出来了。
烧写过程中,stlink v2 调试器的指示灯会有所反应,完成后,最小系统板的程序就会运行,就会看到板上的LED闪动了起来,说明烧写成功!
调试程序
很可惜!免费版(社区版)PlatformIO 的调试功能受限,所以不能正常进行程序调试,若想正常使用,需要订阅Plus版。作为一个勤俭节约的人怎么可能要花这份钱呢!那怎么办呢!不要紧,VS code中有款插件叫做 Cortex Debug,稍作配置就能进行正常的工程调试啦!
openocd 添加至系统环境变量
在这里我们使用openocd开启调试服务,若要使用此方式进行调试, Cortex Debug 能自动调用环境变量中能找到的openocd,为了使用方便,需要将openocd添加至系统的环境变量,上面我们知道,Platformio 已经自动安装了编译调试工具。
在用户目录下应该会找到文件夹 .platformio
,会从下面的文件夹中找到 openocd 运行文件(windows下是openocd.exe,目录可能有所不同):
/Users/5km/.platformio/packages/tool-openocd/bin
-
对于linux或者macOS使用者
-
若使用的命令行shell是zsh,可以使用以下命令添加环境变量:
echo 'export PATH="/Users/5km/.platformio/packages/tool-openocd/bin:$PATH"' > ~/.zshrc
-
若使用的命令行shell是bash,可以使用以下命令添加环境变量:
echo 'export PATH="/Users/5km/.platformio/packages/tool-openocd/bin:$PATH"' > ~/.bashrc
-
-
windows用户,找到相应目录以后,按照网上的方法,将目录添加到环境变量中就可以了
添加完成后,启动一个命令行,执行以下命令,如果打印了版本信息说明添加成功:
$ openocd -v
GNU MCU Eclipse 64-bits Open On-Chip Debugger 0.10.0+dev-00392-gbe9ef0b0 (2018-01-12-16:51)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
安装 Cortex Debug 插件
VS code 插件管理器中搜索 Cortex Debug ,安装即可。
优化编译选项
程序调试,需要编译的时候生成符号库,所以需要为工程配置中添加生成符号库的支持,工程配置 platformio.ini
中添加以下内容即可:
build_flags =
-g
最终配置内容:
[env:genericSTM32F103C8]
platform = ststm32
board = genericSTM32F103C8
framework = arduino
build_flags =
-g
重新编译一遍!
添加调试配置
-
VS Code 菜单栏——调试——添加配置;
-
选择
{} Cortex Debug: OpenOCD
即可添加配置; -
更改配置,参考 Cortex-Debug Launch Configurations 添加和调整
.vscode/launch.json
文件的部分配置如下:{ "version": "0.2.0", "configurations": [ { "type": "cortex-debug", "request": "launch", "servertype": "openocd", "cwd": "${workspaceRoot}", "executable": "${workspaceRoot}/.pioenvs/genericSTM32F103C8/firmware.elf", "name": "Debug (OpenOCD)", "device": "STM32F103C8", "configFiles": [ "interface/stlink.cfg", "target/stm32f1x.cfg" ], "runToMain": true }, ] }
其中,
executeable
配置为工程中生成的 elf 文件的路径,这个需要自行更改为自己工程的device
指定芯片型号,调试器会自行选择 svd 文件,以便正确显示外设寄存器的正确信息configFiles
配置两个文件,一个是接口配置,一个是调试目标(芯片)的配置文件runToMain
设置为true,启动调试后会运行到 main 入口停止
进行调试
点击 VS Code 窗口左侧的调试按钮,切换至调试界面:
橙色圈内的下拉菜单可以选择调试配置,根据名称(对应上面配置信息中的 name
)选择刚刚添加的配置,单击其左边的绿色三角按钮(保证电脑经stlink连接到了最小系统板上),即可启动调试过程:
启动调试后默认停在程序最开始的地方,能够看到窗口最上方出现了一个调试工具栏, 包含了基本的执行操作:
依次是继续执行、单步、单步进入、单步跳出、重新运行和停止操作按钮。
可以打开 main.cpp
文件,在代码行号左侧点击可以添加或删除断点。在 pinMode(LED_PIN, OUTPUT);
添加断点,点击继续执行按钮,运行至断点处,然后点击单步进入按钮,此时可以看到窗口:
可以看到窗口左侧部分能够查看变量,包含局部、全局变量;还可以添加变量监视;再下面就是调用堆栈,这里可以看到函数的调用层次。
还可以看到一个 CORTEX PERIPHERALS 的标签,点开后会看到如下图橙色框内的外设寄存器的信息,方便调试程序!
以上看来满足了基本的调试功能了,大功告成!
one more thing
其实调试这块儿有一个问题,Platformio比较霸道,当你关闭工程重新打开后,它会自动把 launch.json
中的配置更改为 Platformio 的调试配置,所以每次打开工程后需要自行添加 Cortex Debug 的配置(见添加调试配置),目前还没想到很好的解决方法,想到后会更新在此。
总结
本文讲了 PlatformIO IDE 的安装以及基本的使用,满足了stm32系列单片机的基本开发需求。