使用 Arduino 和 PlatformIO 点亮 STM32F103C8 (Blue Pill) 上的 LED
STM32F103 是意法半导体推出的一款基于 ARM Cortex-M3 内核的中端32位微控制器,主打高性能和丰富外设。STM32F103C8T6 是该系列中的一款经典型号,被称为 Blue Pill。STM32F103系列是STM32中最畅销的系列之一,而它凭借其低价和易用性成为 DIY、学生项目和中小规模商业产品的首选。本文通过简单的 Blink LED (闪烁 LED 灯)示例,介绍在 Ubuntu Linux 上搭建开发环境的实战经验。
物料 🔗
这是一个极其简单的示例,只需要最少物料即可:
- STM32F103C8T6 开发版。焊接好的开发版,目前价格在 13 元左右。
- USB转TTL 串口模块。用于烧录程序,比如 CP1202 驱动的USB转TTL串口模块。注意这种模块有 MiniUSB、MicroUSB 和 Type-C 接口的,购买时注意选择。
- 杜邦线若干。
需要注意的是,烧录 STM32F103 有多种方式,比如 ST-LINK V2下载器、USB转TTL模块等。我购买了 ST-LINK V2 下载器,但在我的电脑上,无论如何无法烧录成功;最终还是使用了 CP1202 驱动的USB转TTL串口模块烧录成功。不知道是开发版的问题,ST-LINK V2 下载器的问题,还是电脑系统的问题。另外,我的电脑似乎一直无法使用 CH240x 驱动的USB转TTL串口模块。
在 STM32F103C8T6 上的 PC13 引脚接了一个板载 LED(可在 LED旁边看到 PC13 字样)。当 PC13 输出低电平时,LED 亮;当输出高电平时或者浮空时,LED 灭。因此,可用于验证烧录是否成功。
开发工具 🔗
PlatformIO 🔗
PlatformIO 是一个跨平台的嵌入式开发工具,支持多种微控制器(如STM32、ESP32、Arduino)和框架(如Arduino、HAL、FreeRTOS),集成了构建、调试和库管理功能。它基于VS Code或CLI运行,简化了嵌入式开发流程,适合专业和开源项目。可在 VS Code 中安装 PlatformIO 插件进行使用。
代码开发 🔗
新建项目 🔗
在 VS Code 的边栏打开 PlatformIO 后,点击 Create New Project
创建新项目。在 Board 选择框中输入 stm32f103c8
,选择 STM32F103C8 (20K RAM, 64 Flash)(Generic)
,在 Framework 中选择 Arduino
,然后填入其他字段后点击 Finish 创建项目。
修改配置 🔗
项目的配置位于 platformio.ini
文件中。由于使用串口烧录,因此需要设置烧录的端口。对于 Linux 系统,可在终端输入 ls /dev/tty*
,查找类似 /dev/ttyUSB0
或者 /dev/ttyACM0
的设备。
在我的电脑上,ls /dev/tty*
的唯一结果是 /dev/ttyUSB0
。最终 platformio.ini
的内容如下:
[env:genericSTM32F103C8]
platform = ststm32
board = genericSTM32F103C8
framework = arduino
upload_protocol = serial
upload_port = /dev/ttyUSB0
monitor_speed = 115200
更新代码 🔗
打开 main.cpp
文件,更新内容如下:
#include <Arduino.h>
void setup() {
pinMode(PC13, OUTPUT);
}
void loop() {
digitalWrite(PC13, HIGH);
delay(500);
digitalWrite(PC13, LOW); // PC13 输出低电平,点亮 LED
delay(500);
}
烧录 🔗
硬件接线 🔗
使用杜邦线,通过如下方式连接引脚:
USB-TTL | STM32F103 |
---|---|
TX | PA10 |
RX | PA9 |
GND | GND |
3.3V | 3.3V |
进入烧录模式 🔗
STM32 需要通过 BOOT 引脚选择启动模式:
- BOOT0 接高电平(1)
- BOOT1 接高电平(0)
这两个引脚在开发版上有标识,并且可使用跳线帽短接,实现接高电平(1)还是低电平(0)。
烧录完成后,就会看到 LED 在闪烁了。
运行 🔗
烧录完成后,可拔掉开发板上的杜邦线了。但如果通过USB供电,发现LED又不闪烁了。这是因为开发板处于开发模式。为此,可通过硬件复位,可退出烧录模式:
- 将 BOOT0 引脚拉低(接 GND,即短接 0)
然后通过 USB 线供电,又可看到 LED 灯在闪烁了。