PlatformIO IDE(VScode) 下调试 STM32 平台程序

PlatformIO 系列文章 stm32开发新方式-platformio 中最后提到说 PlatformIO 限制了免费用户调试程序的功能,最近发现 PlatformIO 已经免费开发程序调试功能,所以现在我们可以使用内建支持更好的方式调试我们的 ST MCU 的程序了,那今天我们就聊一下这一块内容。

官方称其为 PIO Unified Debugger,很好理解,就是统一的调试器,意思是凡是 PIO 支持的可调式的 MCU 开发平台均可以使用统一功能的调试器,PIO 跨平台的特性仍然支持程序调试,也就是说在 windows、linux和 macOS 下均可以得到相同的开发体验。

You should have PIO Account to work with PIO Unified Debugger. A registration is FREE.

官方说明免费使用这个调试功能需要登录一个 PIO 账户,这个很简单嘛,注册一个然后在 VSCode 的 PIO IDE 中登录即可,这可能是唯一的限制了!

功能特性

官方文档中提到 VScode 搭建的 PIO 开发环境可以提供最强大的调试功能特性,包括以下:

  • 局部、全局和静态变量的浏览器 (Local, Global, and Static Variable Explorer)
  • 条件断点 (Conditional Breakpoints)
  • 表达式监控 (Expressions and Watchpoints)
  • 通用寄存器检阅 (Generic Registers)
  • 外设寄存器检阅 (Peripheral Registers)
  • 内存数据检阅器 (Memory Viewer)
  • 汇编检阅 (Disassembly)
  • 多线程支持 (Multi-thread support)
  • 调试会话的热重启和激活 (A hot restart of an active debugging session)

以下为 genericSTM32F103C8 开发板使用 Arduino 开发框架时调试程序时的界面:

实践

下面我们就以 genericSTM32F103C8 开发板使用 Arduino 开发框架为例讲解一下,调试程序是多么的简单。

前提条件

开发环境

  • 已经安装 vscode
  • vscode 已经安装 PlatformIO IDE 插件

上述条件满足后,打开 vscode 新的窗口,会如下图中所示,左边栏多出 PlatformIO 的logo,以及最下边状态栏左边有个小房子的图标:

硬件

  • 一个 stm32f103c8t6 的最小系统板
  • stlink v2 调试器

PIO 账户

如果没有 PIO 账户那就先注册一个,打开 vscode 点击上图中提到的小房子的图标就会打开 PlatformIO 的管理页面,点击右上角的 PIO Account 图标

此时会跳转到 PIO 账户登录页面,登录按钮下面有一个链接 create a new one ,点击一下即可进入注册页面:

输入自己的邮箱,点击注册按钮即可完成注册, PlatformIO 会自动生成一个密码发到你的邮箱,返回到登录页面输入邮箱和密码登录即可。

新建项目

返回到 Home 页面,点击 New Project 按钮开始新建项目,这里项目名称定义为 c8t6Blink,一个控制 LED 闪烁的简单例子,Board 就选 STM32F103C8(20k RAM. 64k Flash)(Generic) ,然后使用 Arduino 框架,最后点击 Finish 即可创建项目:

初次创建可能需要时间会长一点,会下载编译需要的一些依赖工具包,以后再创建相同平台项目的时候就很快了。

编写程序

手头上这个最小系统板上的 LED 是 PB0 管脚控制的,硬件设计是低电平 LED 点亮,所以一个简单的闪灯程序如下:

#include <Arduino.h>

#define LED_PIN PB0

void setup() {
  // put your setup code here, to run once:
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(LED_PIN, LOW);
  delay(100);
  digitalWrite(LED_PIN, HIGH);
  delay(900);
}

点击底部状态栏左边的小对号图标就可以进行编译,编译完成后点击右边向右的箭头图标就可以烧写程序,初次上传烧写需要时间长一些,PIO 需要下载一些相关工具包,以后就是正常上传程序了,完成后就能看到程序正常运行,LED 闪了起来。

调试程序

按下 F5 按键即可触发程序调试,本以为会出现类似本篇文章第一张图的样子,结果会出现以下错误:

> Executing task: platformio debug <

Error: Please specify `debug_port` for environment
终端进程已终止,退出代码: 1

终端将被任务重用,按任意键关闭。

为什么会出现这个错误?原因很简单,PIO 不知道我们是用什么调试工具进行程序调试,所以需要在项目配置文件 platformio.ini 中指明一下我们使用 stlink 进行调试:

[env:genericSTM32F103C8]
platform = ststm32
board = genericSTM32F103C8
framework = arduino
debug_tool = stlink

此时点击 F5 就可以正常触发调试了,可以看到启动调试程序默认停到 main 中第一句。

  • 顶部会看到调试工具栏,可以实现调试会话的重启、程序启停、执行等操作按钮
  • 可以在代码编辑器行号前面单击添加或删除断点
  • 左侧调试工具区点击 PERIPHERALS 栏,可以查看所有外设寄存器配置,方便验证寄存器配置正确与否
  • MEMORY 栏可以添加内存地址来查看指定字节的数据,方便验证指针数据
  • 监视 中可以添加监测变量,随时查看变量变化
  • 变量 中展示了所有当前断点可检阅的全局、局部以及静态变量
  • 调用堆栈 中展示了函数的调用层次
  • 调试控制台的最下方可以输入 adb 命令,从而实现更强大的调试操作
  • DISASSEMBLY 栏可以控制切换汇编窗口方便查看汇编代码