代码烧写方式

Tutorial: 电子电路 Category: 嵌入式 Published: 2026-10-08 01:26:37 Views: 1 Likes: 0 Comments: 0

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/CLKSWCLK/CLK调试时钟
SWDIO/DIOSWDIO/DIO双向调试数据
GNDGND公共电平参考
VTref/3.3V3.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:

BOOT0BOOT1启动区域用途
0X主 Flash运行用户程序
10System Memory运行出厂 Bootloader,执行串口下载
11SRAM从片内 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 时再使用串口方式。无论采用哪种方法,都应保留编译日志、映像版本和校验结果,防止把“成功连接”误当成“烧入了正确程序”。