背景介绍

毕业后很久没用过 STM32 了,今天刚好周末,看到家里还有一块 STM32F103C8T6 最小系统开发板,就拿出来玩一下。这次从点灯开始,回顾从 CubeMX 配置到 VS Code 编译、烧录并运行的流程,顺手记录下来,方便以后回顾。

这次使用 MacBook 开发,硬件是 STM32F103C8T6 最小系统开发板和 USB 转 TTL 模块,通过串口烧录。

软件用到以下四款工具:

  • STM32CubeMX:配置时钟、GPIO 等,生成工程。
  • STM32CubeIDE:提供当前工程使用的 ARM GCC 和 Make 编译工具。
  • STM32CubeProgrammer:负责烧录、校验,通过命令行工具发送启动命令。
  • VS Code:编辑代码,通过“项目助手”扩展调用上述编译、烧录工具,实现一键编译烧录并运行。

最终实现的效果是:日常修改和下载都在 VS Code 中完成,每次下载前手动按一下开发板 RESET,再点击“编译烧录并运行”即可。

下面按实际操作顺序,记录具体的配置和烧录流程。

一、CubeMX 配置工程

1. 配置外部时钟

在 System Core → RCC 中,将 HSE 设置为 Crystal/Ceramic Resonator,使用开发板上的外部晶振。

RCC 外部晶振配置

2. 配置时钟树

在 Clock Configuration 中,使用 8 MHz 外部晶振,经 PLL 倍频至 72 MHz,选择 PLLCLK 作为系统时钟;APB1 二分频至 36 MHz。

时钟树配置

3. 配置 GPIO

将 PC13 设置为 GPIO_Output,选择推挽输出,用户标签填写 LED,用于控制板载 LED。

PC13 GPIO 配置

4. 配置工程与代码生成选项

在 Project Manager 中填写工程名称 test_led 和保存路径。

注意:下图的工具链选择有误,后续打开工程时会遇到提示,修正过程见后文。

工程名称与保存路径参考

在 Code Generator 中,选择只复制必要的库文件,并勾选为每个外设分别生成 .c、.h 文件,以及重新生成时保留用户代码。

代码生成选项

5. 生成代码

点击 Generate Code。首次缺少 STM32F1 固件包时,点击 Yes 下载 HAL 库及芯片支持文件。

下载 STM32F1 固件包

邮件更新提醒可点击 Don’t ask me again 跳过,不影响工程创建。

跳过邮件更新提醒

阅读并接受固件包许可协议,完成安装。

STM32CubeF1 固件包许可协议

生成完成后,点击 Open Project 打开工程;Open Folder 仅打开所在文件夹。

代码生成完成

6. 工具链选择记录

首次生成时误选了 EWARM(IAR),因此打开工程时提示安装 IAR。

误选 EWARM 后的工具链提示

回到 Project Manager,将 Toolchain / IDE 改为 STM32CubeIDE,重新生成工程即可。

工具链改为 STM32CubeIDE

完成后,在 VS Code 中打开工程进行代码编辑,通过“项目助手”调用本机 STM32CubeIDE 的编译工具和 STM32CubeProgrammer 的烧录工具。

二、串口接线与 BOOT 配置

STM32 最小系统开发板与 USB 转 TTL 实物接线

USB 转 TTL 使用 3.3V 逻辑电平:TXD 接 STM32 的 PA10,RXD 接 PA9,GND 接 GND,开发板正常供电。

下载时设置 BOOT0=1、BOOT1=0。芯片复位后进入 ST 出厂预置的 Bootloader,等待电脑发送固件,再将其写入 Flash。写入后断电不会丢失。

三、在 VS Code 中编译烧录并运行

保持上述接线和 BOOT 配置,每次下载只需:按一下并松开 RESET,再点击“编译烧录并运行”。

VS Code 项目助手编译烧录入口

扩展自动保存代码、编译生成 ELF 固件,通过串口写入 Flash,校验成功后发送 Go 0x08000000,启动刚下载的程序。失败信息显示在按钮下方。

编译和烧录入口集成在 VS Code 中,修改代码后即可在开发板上验证。若其他软件正在连接同一个串口,先断开连接。

程序启动后,芯片已经离开 Bootloader。下次下载前,再按一下 RESET,让芯片重新进入下载模式,然后点击按钮即可。

四、独立上电运行

开发期间保持 BOOT0=1、BOOT1=0,配合 RESET 和一键烧录反复下载。此时再次复位或上电,芯片仍会进入 Bootloader;Flash 中的程序还在,只是没有自动启动。

需要上电直接运行时,将 BOOT0 改为 0,BOOT1 保持 0,再复位或重新上电,芯片就会从 Flash 启动自己的程序。