背景介绍
毕业后很久没用过 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,使用开发板上的外部晶振。

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

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

4. 配置工程与代码生成选项
在 Project Manager 中填写工程名称 test_led 和保存路径。
注意:下图的工具链选择有误,后续打开工程时会遇到提示,修正过程见后文。

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

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

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

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

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

6. 工具链选择记录
首次生成时误选了 EWARM(IAR),因此打开工程时提示安装 IAR。

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

完成后,在 VS Code 中打开工程进行代码编辑,通过“项目助手”调用本机 STM32CubeIDE 的编译工具和 STM32CubeProgrammer 的烧录工具。
二、串口接线与 BOOT 配置

USB 转 TTL 使用 3.3V 逻辑电平:TXD 接 STM32 的 PA10,RXD 接 PA9,GND 接 GND,开发板正常供电。
下载时设置 BOOT0=1、BOOT1=0。芯片复位后进入 ST 出厂预置的 Bootloader,等待电脑发送固件,再将其写入 Flash。写入后断电不会丢失。
三、在 VS Code 中编译烧录并运行
保持上述接线和 BOOT 配置,每次下载只需:按一下并松开 RESET,再点击“编译烧录并运行”。

扩展自动保存代码、编译生成 ELF 固件,通过串口写入 Flash,校验成功后发送 Go 0x08000000,启动刚下载的程序。失败信息显示在按钮下方。
编译和烧录入口集成在 VS Code 中,修改代码后即可在开发板上验证。若其他软件正在连接同一个串口,先断开连接。
程序启动后,芯片已经离开 Bootloader。下次下载前,再按一下 RESET,让芯片重新进入下载模式,然后点击按钮即可。
四、独立上电运行
开发期间保持 BOOT0=1、BOOT1=0,配合 RESET 和一键烧录反复下载。此时再次复位或上电,芯片仍会进入 Bootloader;Flash 中的程序还在,只是没有自动启动。
需要上电直接运行时,将 BOOT0 改为 0,BOOT1 保持 0,再复位或重新上电,芯片就会从 Flash 启动自己的程序。