stm32开发新方式-platformio的IDE

platformio是一款跨平台的物联网开发的生态环境,VS Code 这款强大的文本编辑器辅以 PlatformIO IDE 插件就可以化身为一款强大的MCU开发环境,支持绝大多数流行的单片机平台,比如今天要讨论的 stm32 系列单片机。

2018101015391609436627.png

测试环境及工具

  1. 本文讲解使用的系统平台是 macOS 10.14,其它平台比如 linux、windows 步骤和操作基本类似;
  2. stm32 开发板是以stm32f103c8t6为核心的最小系统板;
  3. stm32 芯片调试器使用的是 stlink v2;

platformio IDE 搭建

  1. 下载对应平台的VS Code,这里下载 mac 版的,下载完成后安装即可; 20181010153916303585687.jpg
  2. 打开 vs code ,点击左侧第五个按钮,显示插件管理界面,搜索插件 PlatformIO IDE,并安装此插件; 20181010153916446822188.png 安装过程耐心等待,成功后会有提示!

platformio IDE 简介

重新打开安装好插件的 VS Code ,会看到左下角多了一个小房子logo样式的按钮,点击这个按钮就会打开 Platformio 主页:

20181010153916512699587.png

可以看到主页中最顶端包含了一个导航栏,有用的就是前进后退的按钮和账户相关的交互元素,整个主页其实是Platformio在本地开启了一个web应用(类似于一个简单的小网站),包含了Home、Account、Libraries、Boards、Platforms和Devices六个标签页,下面分别简单说明一下。

Home 标签页

进入Platformio 的主页显示的就是 Home 标签页,标签页内从上到下可以依次看到以下内容:

  1. Show at startup 的复选框,勾上后,每次启动 vs code 就会启动这个主页;
  2. Quick Access 下有四个操作按钮,分别是:
    • New Project:用于新建工程;
    • Import Arduino Project:用于导入电脑中已经存在的 Arduino 工程;
    • Open Project:用于打开已经存在的 Platformio 工程;
    • Project Examples:用于打开本机已经安装的单片机平台的例程工程;
  3. Recent News:显示最新 Platformio 信息;

Account 标签页

这个标签页用于管理账户信息,首次打开的时候,是用户登录页面,当登录已有的 Platformio 账户后,就会显示用户信息和密码的相关操作,这里就不细讲了!

Libraries 标签页

20181010153917108391128.png

  1. Registry 标签页

    这个页面是有一个搜索框,搜索框内没有内容的时候,会在搜索框下面显示所有可用的库,搜索框中输入关键词就会过滤显示相关的库。

    点击想要安装的库,就会进入这个库的详细页面,这个页面里有安装按钮、例程、使用方法等操作接口。

  2. Installed 标签页

    这里主要展示本机已经安装的第三方库。

  3. Built-in 标签页

    这里显示已安装平台内置的库。

  4. Updates 标签页

    展示需要更新的库。

Boards 标签页

20181010153917351153178.png

这个标签页用来展示 Platformio 支持的开发板列表,最上方的搜索框内可以输入关键词过滤显示相关的开发板,比如输入 Arduino 就会显示Arduino的开发板。

列表中每个条目显示一个开发板,包含信息:

项目 含义
Name 开发板名称
Platform 对应的单片机平台
Frameworks 支持的开发框架
MCU 对应的单片机型号
FRQ 单片机工作主频(Mhz)
ROM 单片机的存储
RAM 单片机内存
Extra 其它信息

Platforms 标签页

这个标签页用来管理平台支持,比如我的这里安装了两个单片机平台的支持:

这两个条目可以点进去查看平台详细信息和对平台进行一定操作。标签页内还包含所有的嵌入式、桌面平台的相关管理项,同时也有框架展示的标签页,可以通过这里的每个条目了解对应框架的信息和使用方法。

Devices 标签页

这里显示连接电脑的硬件设备,比如串口、数字逻辑设备和网络设备。

使用 Platformio IDE

这里以创建 ST STM32 平台的 stm32f103c8t6 芯片工程为例,讲解一下工程的基本使用方法。

新建工程

  1. 打开 Platformio 的主页,点击 New Projects

  2. 在工程新建窗口中,配置如下创建名为 blink 的工程: 20181010153917456152478.png 最后点击 Finish ,等待片刻工程就会创建完成。

    这里暂时选择使用框架为 Arduino,stm32还可以选择其它框架,这里先挖个坑,等有时间专门写一下针对stm32其它框架的使用。

工程界面介绍

新建工程后,就会打开相应的工程,如下图所示:

20181010153917478980641.png

文件结构

窗口左侧默认显示的是资源管理器,这里可以看到文件结构。

  1. .pioenvs 文件夹:存放编译产生的中间文件和最后生成的执行文件;
  2. lib 文件夹:存放库文件;
  3. src 文件夹:存放源文件,其内部默认生成名为 main.cpp 的源文件;
  4. platformio.ini:工程的配置文件

工具栏

在工程窗口的左下方会看到多出来的一些按钮,这就是工程的工具栏:

2018101015391752644261.png

依次说明这几个快捷按钮的作用:

  1. 主页按钮:前面已经提到过是打开 Platformio 主页的按钮
  2. 编译按钮:小对号,点击后会编译当前激活的工程
  3. 烧写按钮:向右的小箭头,触发程序烧写的过程
  4. 远程烧写按钮:小云朵,触发远程烧写程序的过程
  5. 清理按钮:小垃圾桶,用于清理编译过程生成的文件
  6. 测试按钮:小烧瓶,测试工程,免费版的Platformio受限不能用;
  7. 运行任务按钮:小本子,会跳出操作菜单,包含编译、烧写、调试等操作;
  8. 串口监视器按钮:小插头,点击后会启动命令行的串口监视助手;
  9. 终端按钮:小命令行,点击后新建一个终端窗口;

快捷操作栏

点击窗口左侧的做后一个logo也就是小蚂蚁头,就会出现针对工程的快捷操作:

20181010153917672863905.png

根据字面意思就知道相应快捷操作是什么用途了,这里就不做介绍了。

编写代码

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

添加完成后,启动一个命令行,执行以下命令,如果打印了版本信息说明添加成功:

$ 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

重新编译一遍!

添加调试配置

  1. VS Code 菜单栏——调试——添加配置;

  2. 选择 {} Cortex Debug: OpenOCD 即可添加配置;

    20181010153918052073191.png

  3. 更改配置,参考 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 窗口左侧的调试按钮,切换至调试界面:

20181010153918105576989.png

橙色圈内的下拉菜单可以选择调试配置,根据名称(对应上面配置信息中的 name )选择刚刚添加的配置,单击其左边的绿色三角按钮(保证电脑经stlink连接到了最小系统板上),即可启动调试过程:

启动调试后默认停在程序最开始的地方,能够看到窗口最上方出现了一个调试工具栏, 包含了基本的执行操作:

20181010153918158198422.png

依次是继续执行、单步、单步进入、单步跳出、重新运行和停止操作按钮。

可以打开 main.cpp 文件,在代码行号左侧点击可以添加或删除断点。在 pinMode(LED_PIN, OUTPUT); 添加断点,点击继续执行按钮,运行至断点处,然后点击单步进入按钮,此时可以看到窗口:

20181010153918191850308.png

可以看到窗口左侧部分能够查看变量,包含局部、全局变量;还可以添加变量监视;再下面就是调用堆栈,这里可以看到函数的调用层次。

还可以看到一个 CORTEX PERIPHERALS 的标签,点开后会看到如下图橙色框内的外设寄存器的信息,方便调试程序!

20181012153931904181209.png

以上看来满足了基本的调试功能了,大功告成!

one more thing

其实调试这块儿有一个问题,Platformio比较霸道,当你关闭工程重新打开后,它会自动把 launch.json 中的配置更改为 Platformio 的调试配置,所以每次打开工程后需要自行添加 Cortex Debug 的配置(见添加调试配置),目前还没想到很好的解决方法,想到后会更新在此。

总结

本文讲了 PlatformIO IDE 的安装以及基本的使用,满足了stm32系列单片机的基本开发需求。