代码烧写方式
089.0.5代码烧写方式
一、代码烧写
STM32F103 常用两条下载路径:ST-Link 通过 SWD 直接访问芯片调试端口;串口工具通过芯片出厂固化在系统存储器中的 Bootloader 接收程序。两者最终都把代码写入片内主 Flash,但进入芯片的路径不同。
flowchart LR
ELF[Keil/CubeIDE 生成 ELF/AXF] --> SWD[ST-Link + SWD]
HEX[HEX/BIN 文件] --> PROG[CubeProgrammer/FlyMCU]
PROG --> UART[CH340C + USART1 Bootloader]
SWD --> FLASH[STM32 主 Flash 0x08000000]
UART --> FLASH
标题下的代码是课程烧写时使用的 temp 空工程应用层源码。即使 while(1) 中没有业务逻辑,启动文件、系统时钟和 HAL 初始化仍会形成可烧录映像,所以下载速度快不表示文件大小为零。
1.1 STM32单片机烧写
1.1.1 ST-Link烧写工具
ST-Link 是首选开发调试方式,因为它既能下载,又能断点和查看芯片状态。SWD 只需两根信号线,加上地和目标参考电压即可工作。
1.1.1.1 接线方法
按信号名称连接,不要只背“2、4、6、8”针脚;不同外壳、克隆板和排针方向可能不同。
| ST-Link 端 | 开发板端 | 作用 |
|---|---|---|
SWCLK/CLK | SWCLK/CLK | 调试时钟 |
SWDIO/DIO | SWDIO/DIO | 双向调试数据 |
GND | GND | 公共电平参考 |
VTref/3.3V | 3.3V | 让调试器感知目标逻辑电平;是否能给板供电取决于具体 ST-Link |
NRST(可选) | RESET/NRST | 连接复位,便于 Connect Under Reset |
最稳妥的做法是让开发板用自身 USB 或电源接口供电,ST-Link 的 3.3 V 只作目标参考,除非对应型号说明明确允许其给目标供电。VCC 与 GND 接反可能损坏双方;带电改线也可能造成短路。
SWD 电路可简化为:
ST-Link STM32F103
SWCLK ───────────────────> PA14 / JTCK-SWCLK
SWDIO <──────────────────> PA13 / JTMS-SWDIO
NRST ───────────────────> NRST (可选)
VTref <─────────────────── 3.3 V
GND ──────────────────── GND
1.1.1.2 Keil烧写方式
-
1.1.1.2.1 调至ST-Link烧写模式
在
Options for Target→Debug选择 ST-Link 调试器,再进入Settings选择 SWD 接口。Flash Download 页面需要有与目标 STM32F103 容量匹配的 Flash Programming Algorithm。这里烧写的是 STM32 工程,不是 51 单片机工程。 -
1.1.1.2.2 查看ST-Link连接状态
能看到 ST-Link 序列号、目标电压、芯片 Device ID 和
ARM CoreSight SW-DP,表示调试器与目标基本连通;No ST-LINK detected表示电脑没有识别调试器,No target connected则更可能是目标供电、SWD 接线或复位状态异常。点击 Download/Load 后,日志出现擦除、编程、校验完成的信息才算成功。只看进度条结束不够,还要确认没有
Verify Failed、受保护或算法缺失等错误。
若普通方式连接不上,可降低 SWD 时钟并尝试 Connect Under Reset;仍失败时检查 BOOT、NRST、电源和程序是否把 SWD 引脚重新配置为普通 GPIO。
1.1.1.3 STM32 ST-LINK Utility烧写方式
课程界面使用 STM32 ST-LINK Utility:连接芯片后可以整片擦除、打开 HEX 文件并执行 Program & Verify。该软件已经是停产的旧工具;ST 官方说明当前 STM32CubeProgrammer 已整合并替代 ST-LINK Utility、DfuSe 和 Flash Loader Demonstrator。
在 CubeProgrammer 中选择 ST-LINK 接口,连接后核对 Device ID 与 Flash 容量,加载 .hex、.bin 或 .elf/.axf 文件,设置地址并执行 Download/Verify。HEX 文件自带地址;BIN 是纯字节流,必须手动确认起始地址,STM32F103 主 Flash 通常从 0x08000000 开始。
整片擦除会清除用户程序,修改 Option Bytes 还可能改变读保护和启动行为。执行前应核对目标芯片,不能把“擦除”当作普通重试按钮。
1.2 串口烧写方式
1.2.1 串口介绍
本开发板的串口 USB 口经过 CH340C 连接 USART1。USB 侧是电脑协议,CH340C 输出的是 3.3 V TTL 串口;它不是传统 RS-232 电平,不能直接接 ±12 V 的 RS-232 接口。
串口下载链路为:
电脑 USB
│
▼
CH340C ── TXD ──> STM32 PA10 / USART1_RX
<─ RXD ─── STM32 PA9 / USART1_TX
│
GND ─────────── STM32 GND
TX 必须接对方 RX,RX 必须接对方 TX。板上已经完成交叉连接,使用板载 USB 口时不再外接这两根线。
1.2.2 连接串口
用具备数据功能的 USB 线连接串口接口,在设备管理器确认 CH340 的 COM 号。进入系统存储器 Bootloader 的条件是复位采样时 BOOT0=1、BOOT1=0:
| BOOT0 | BOOT1 | 启动区域 | 用途 |
|---|---|---|---|
| 0 | X | 主 Flash | 运行用户程序 |
| 1 | 0 | System Memory | 运行出厂 Bootloader,执行串口下载 |
| 1 | 1 | SRAM | 从片内 SRAM 启动,普通使用很少 |
X 表示当 BOOT0 为 0 时 BOOT1 不影响主 Flash 选择。移动跳帽后按 RESET 或重新上电,让芯片重新采样启动脚。跳帽左右哪边是 0/1 必须以板上 GND/3.3V 丝印和原理图为准。
1.2.3 打开FlyMCU软件
打开 FlyMCU,选择正确 COM 口、STM32 型号和 HEX 文件。课程常用波特率是 115200 bit/s;如果自动握手不稳定,可降低波特率排查线材和时钟问题。
勾选“编程后执行”后开始编程。若板上自动下载电路与软件的 DTR/RTS 极性设置匹配,软件可以控制 BOOT0 和 NRST;否则保持 BOOT0=1、BOOT1=0,点击开始后手动按一次复位。原理图中的 DTR/RTS 经三极管驱动复位和 BOOT0,不能把软件中的高低电平字样直接等同于芯片脚最终电平,三极管级可能产生反相。
出现“无法打开串口”时,关闭串口助手等占用该 COM 口的程序。下载时板载 TX/RX 指示灯闪烁只能说明线路有数据活动,是否成功仍以工具返回的同步、擦除、写入和校验结果为准。
下载完成后把 BOOT0 恢复为 0,再复位或重新上电,用户程序才能从主 Flash 启动。
1.2.4 启动模式选择
BOOT 引脚只决定复位后的启动映射,不决定程序被写入哪一种物理存储器。选择 System Memory 时,CPU 先运行芯片出厂 Bootloader;Bootloader 通过 USART1 接收数据并把用户映像写到主 Flash。选择主 Flash 后,CPU 才从 0x08000000 对应的用户程序启动。
因此串口下载的完整因果链是:
flowchart LR
A[BOOT0=1 BOOT1=0] --> B[复位]
B --> C[运行 System Memory Bootloader]
C --> D[USART1 接收 HEX 数据]
D --> E[写入主 Flash]
E --> F[BOOT0=0]
F --> G[再次复位]
G --> H[运行用户程序]
开发阶段优先使用 ST-Link;需要现场升级、没有调试器或验证 ROM Bootloader 时再使用串口方式。无论采用哪种方法,都应保留编译日志、映像版本和校验结果,防止把“成功连接”误当成“烧入了正确程序”。