1. 三种烧录方式到底怎么选:先搞清楚你手里有什么
STM32F103C8T6 这颗芯片,可以说是国内嵌入式入门圈子里绕不开的一块“神级 MCU”。72MHz 主频、64KB Flash、20KB SRAM、丰富的外设接口,加上最小系统板价格便宜到离谱,几乎每个电子相关专业的学生、每个想入门嵌入式的爱好者,手里都至少有一两块。但芯片本身再好,程序烧不进去就是一块砖。我见过太多新手卡在“Keil 编译通过了,但板子没反应”这一步,折腾一整天,最后发现是烧录方式选错了,或者接线接反了。
这篇内容就是把我这些年用 STM32F103C8T6 烧录程序踩过的坑、总结的经验,一次性讲清楚。核心围绕三种主流烧录方式展开:ST-Link、J-Link、USB转TTL。这三种方式各有各的适用场景,没有绝对的优劣,关键看你的需求是什么、手里有什么工具、板子上引出了哪些接口。我会从原理、接线、软件配置、实测速度、常见报错五个维度逐一拆解,最后给出一张对比表和选择建议,让你看完就能直接动手。
不管你是刚买了一块最小系统板不知道怎么下手,还是已经用过其中一种方式但想了解其他方案的差异,这篇内容都能帮你省下大量试错时间。尤其是那些遇到“No target connected”“Can not connect to target”“蓝屏死机”之类问题的朋友,我在后面的排查章节里会逐一给出解决方案。
2. 烧录之前必须搞清楚的硬件基础
2.1 STM32F103C8T6 的启动模式与烧录接口
在讲三种烧录方式之前,有一个基础概念必须先说清楚,否则后面很多现象你无法理解。STM32F103C8T6 有两个关键的启动配置引脚:BOOT0和BOOT1。这两个引脚的电平组合决定了芯片上电后从哪里开始执行代码。
| BOOT0 | BOOT1 | 启动模式 | 用途说明 |
|---|---|---|---|
| 0 | X | 主闪存存储器 | 正常运行模式,从 Flash 启动 |
| 1 | 0 | 系统存储器 | 进入出厂 Bootloader,用于串口下载 |
| 1 | 1 | 内置 SRAM | 调试用,一般不用 |
这个表格非常关键。当你用USB转TTL方式烧录时,必须把 BOOT0 跳到 1、BOOT1 跳到 0,让芯片进入系统存储器模式,也就是运行出厂固化的 Bootloader。烧录完成后,再把 BOOT0 跳回 0,重新上电,芯片才会运行你刚烧进去的程序。很多新手烧录完发现板子没反应,90% 的原因就是忘了把 BOOT0 跳回来。
而ST-Link和J-Link这两种方式,走的是 SWD 或 JTAG 调试接口,直接操作芯片内部的 Flash 控制器,不需要依赖出厂 Bootloader,所以不需要动 BOOT 跳线。这是它们相比 USB转TTL 最大的便利之处。
STM32F103C8T6 的 SWD 接口只需要两根信号线:SWDIO(数据线)和SWCLK(时钟线),再加上GND和3.3V,一共四根线就能完成烧录和调试。最小系统板上通常会引出这四个引脚,一般标注为 SWDIO、SWCLK、GND、3V3,有的板子还会额外引出NRST(复位引脚),建议一并接上,后面讲原因。
2.2 最小系统板的引脚布局与接线要点
市面上常见的 STM32F103C8T6 最小系统板,尺寸大概是 53mm × 22mm,板子两侧各有一排排针,间距 2.54mm,可以直接插在面包板上。板子一端是 Micro USB 接口(只供电,不带数据功能),另一端是 SWD 调试接口排针。
接线的时候有几个细节需要注意。第一,GND 必须共地,这是所有通信的基础,不管是 SWD 还是串口,下载器和目标板之间必须有一根可靠的 GND 连接。第二,3.3V 不要重复供电,如果最小系统板已经通过 USB 线供了电,就不要再从下载器的 3.3V 引脚往板子上供电,两个电源打架轻则烧录失败,重则烧毁芯片。第三,杜邦线不要太长,SWD 信号在高速通信时对线长敏感,超过 20cm 就容易出现连接不稳定的情况,建议控制在 10cm 以内。
还有一个容易被忽略的点:最小系统板上的BOOT0 跳线帽。出厂默认一般是接在 0 位置(GND),也就是正常运行模式。如果你要用串口烧录,需要把它拔下来插到 1 位置(3.3V)。有些板子的跳线帽质量不好,接触不良,也会导致烧录失败,建议用万用表量一下确认。
2.3 三种烧录方式的本质区别
从原理层面理解这三种方式的差异,能帮你更好地排查问题。
ST-Link和J-Link本质上都是调试器,它们通过 SWD 或 JTAG 协议与芯片内部的调试模块通信。芯片内部有一个叫Debug Access Port的硬件模块,调试器通过它可以直接读写 Flash 存储器、寄存器、内存,还能设置断点、单步执行。这种方式速度最快,功能最强,支持在线调试。
USB转TTL走的是完全不同的路径。它利用的是芯片出厂时固化在系统存储器里的一段 Bootloader 程序。芯片上电后,如果检测到 BOOT0=1、BOOT1=0,就从系统存储器启动,运行这段 Bootloader。Bootloader 会通过USART1(PA9 为 TX、PA10 为 RX)等待上位机发送固件数据,接收完成后写入 Flash。这种方式不需要额外的调试器,一个几块钱的 USB转TTL 模块就能搞定,但速度慢,不支持调试,而且每次烧录都要手动切换 BOOT 跳线。
理解了这些差异,你就能明白为什么 ST-Link 插上就能用,而 USB转TTL 要折腾跳线;为什么 J-Link 功能强大但价格贵,而 ST-Link 性价比高但只支持 ST 芯片。下面逐一展开。
3. ST-Link 烧录实战:性价比最高的选择
3.1 ST-Link 的版本选择与驱动安装
ST-Link 是 ST 官方推出的调试器,市面上常见的有ST-Link V2和ST-Link V2-1两个版本。V2 是独立的小方块,价格十几块钱,支持 SWD 和 SWIM 接口;V2-1 通常集成在 Nucleo 开发板上,功能更全,支持虚拟串口和虚拟U盘。对于 STM32F103C8T6 来说,V2 完全够用。
买 ST-Link 的时候要注意,市面上有大量山寨版本,芯片可能是用国产替代方案做的。这些山寨版大部分能用,但偶尔会遇到固件版本不兼容的问题。我实测下来,只要驱动装对了,山寨版烧录 STM32F103C8T6 基本没问题。
驱动安装有两种方式。第一种是安装STM32 ST-LINK Utility,这个软件自带驱动,安装完成后插上 ST-Link,设备管理器里会出现 “STMicroelectronics STLink dongle” 设备。第二种是安装STM32CubeProgrammer,这是 ST 官方新推出的烧录工具,功能更全,支持 ST-Link、UART、USB DFU 等多种方式,推荐优先使用。
注意:如果你之前装过旧版驱动,建议先在设备管理器里卸载干净,再装新驱动,否则可能出现“设备无法识别”的问题。
3.2 硬件接线:四根线搞定
ST-Link 与 STM32F103C8T6 最小系统板的接线非常简单,只需要四根线:
| ST-Link 引脚 | 最小系统板引脚 | 说明 |
|---|---|---|
| SWDIO | SWDIO (PA13) | 数据线 |
| SWCLK | SWCLK (PA14) | 时钟线 |
| GND | GND | 共地 |
| 3.3V | 3V3 | 供电(可选) |
如果最小系统板已经通过 USB 供电,3.3V 这根线可以不接。但 GND 必须接,SWDIO 和 SWCLK 必须接。有些板子的 SWD 接口标注可能是 “DIO” 和 “CLK”,对应关系是一样的。
我建议把NRST也接上。NRST 是复位引脚,接上之后 ST-Link 可以在烧录前自动复位芯片,避免因为芯片运行状态导致连接失败。尤其是当芯片里已经烧了一个进入低功耗模式或者死循环的程序时,不接 NRST 很可能连不上。
3.3 软件配置与烧录步骤
用STM32CubeProgrammer烧录的完整流程如下:
- 打开 STM32CubeProgrammer,在右上角选择 “ST-LINK” 作为连接方式。
- 点击 “Connect” 按钮,如果接线正确,软件会识别到芯片,显示芯片型号、Flash 大小等信息。
- 在左侧选择 “Erasing & Programming”,点击 “Browse” 选择编译好的
.hex或.bin文件。 - 勾选 “Verify programming” 和 “Run after programming”,点击 “Start Programming”。
烧录过程通常只需要几秒钟。如果一切正常,你会看到进度条走完,提示 “Programming complete”。
用STM32 ST-LINK Utility的流程类似:打开软件,点击 “Target” → “Connect”,连接成功后点击 “Target” → “Program & Verify”,选择文件,点击 “Start”。
用Keil MDK的话,需要在 “Options for Target” → “Debug” 里选择 “ST-Link Debugger”,然后点击 “Settings” 确认能识别到芯片。之后直接点 “Download” 按钮就能烧录。
3.4 实测速度与稳定性
我用一个 20KB 左右的固件做了对比测试。ST-Link V2 在 SWD 模式下,烧录 20KB 固件大约需要2-3 秒,包含擦除和校验。这个速度对于日常开发来说完全够用。稳定性方面,只要接线可靠,基本不会出现连接失败的情况。偶尔遇到 “No target connected”,通常是接线松动或者芯片处于低功耗状态,接上 NRST 就能解决。
ST-Link 最大的优势是便宜、够用、生态好。十几块钱的价格,支持所有 STM32 芯片,配合 Keil、IAR、CubeProgrammer 都能用。如果你只玩 ST 的芯片,ST-Link 是最省心的选择。
4. J-Link 烧录实战:功能最强但门槛也最高
4.1 J-Link 的版本差异与兼容性问题
J-Link 是 SEGGER 公司推出的调试器,在业界口碑极好,支持几乎所有主流 MCU 架构。但 J-Link 的版本非常多,从几百块的正版到几十块的山寨版,功能和稳定性差异巨大。
正版 J-Link 价格不菲,个人开发者一般会选择J-Link OB(On-Board)或者山寨版。山寨版 J-Link 通常是用 STM32F103 或者国产芯片做的,刷了 SEGGER 的固件。这些山寨版在烧录 STM32F103C8T6 时基本能用,但有几个坑需要注意。
第一个坑是固件版本。新版 J-Link 驱动会检测调试器是否为正版,如果是山寨版,可能会弹出 “J-Link clone detected” 的警告,甚至直接拒绝工作。解决办法是降级驱动版本,或者使用特定版本的 J-Link 固件。我实测下来,J-Link 驱动版本在 V6.xx 左右对山寨版比较友好。
第二个坑是芯片支持列表。有些国产替代芯片(比如某些 CW32 系列)需要特定版本的 J-Link 才能支持。如果你用的是国产 MCU,买 J-Link 之前最好确认一下驱动版本是否支持。
4.2 接线方式与 SWD 模式配置
J-Link 的接线和 ST-Link 类似,也是 SWDIO、SWCLK、GND、3.3V 四根线。但 J-Link 的 20 针标准接口和 ST-Link 的简易接口不一样,需要转接板或者杜邦线。
J-Link 的 20 针接口中,常用的引脚是:
| J-Link 20针引脚 | 信号 | 对应最小系统板 |
|---|---|---|
| Pin 1 | VTref | 3.3V |
| Pin 7 | SWDIO | SWDIO |
| Pin 9 | SWCLK | SWCLK |
| Pin 4/6/8/10... | GND | GND |
| Pin 15 | nRESET | NRST |
用杜邦线连接时,一定要对照 J-Link 外壳上印的引脚定义,不同厂家的转接板标注可能不一样。我见过有人把 SWDIO 和 SWCLK 接反了,结果一直连不上,折腾了半天才发现。
4.3 J-Flash 烧录工具的使用
J-Link 配套的烧录工具是J-Flash。使用流程如下:
- 打开 J-Flash,新建工程,选择目标芯片型号 “STM32F103C8”。
- 在 “Target Interface” 里选择 “SWD”,速度可以先设低一点,比如 1000kHz,连接稳定后再提高。
- 点击 “Target” → “Connect”,连接成功后会在日志窗口显示芯片信息。
- 打开要烧录的
.hex或.bin文件,点击 “Target” → “Production Programming” 或者直接按 F5 烧录。
J-Flash 的界面比 ST-Link Utility 复杂一些,但功能更强。它支持批量烧录、序列号自动递增、加密烧录等高级功能,适合量产场景。
4.4 实测速度与适用场景
J-Link 的烧录速度是三种方式中最快的。同样 20KB 固件,J-Link 在 SWD 模式下大约1-2 秒就能完成,比 ST-Link 快一些。如果开启高速模式,速度还能更快。
但 J-Link 的优势不仅仅在速度。它支持在线调试、RTT 实时传输、Flash 断点等高级功能,对于复杂项目的开发调试非常有帮助。如果你需要频繁打断点、查看变量、分析程序运行状态,J-Link 的体验明显优于 ST-Link。
不过对于 STM32F103C8T6 这种入门级芯片来说,J-Link 的优势有点“杀鸡用牛刀”。除非你手里已经有 J-Link,或者需要调试更复杂的项目,否则专门为 STM32F103C8T6 买一个 J-Link 性价比不高。
5. USB转TTL 烧录实战:最便宜但最折腾
5.1 USB转TTL 模块的选择与驱动
USB转TTL 模块的核心芯片常见的有CH340、CP2102、PL2303等。CH340 最便宜,几块钱就能买到,但驱动安装偶尔会出问题;CP2102 稳定性好一些,价格稍贵;PL2303 老版本芯片在 Win10/Win11 上兼容性较差,不建议买。
买 USB转TTL 模块时,注意要买支持 3.3V 电平的。STM32F103C8T6 的 USART 引脚是 3.3V 电平,如果模块输出的是 5V 电平,长期使用可能损坏芯片。很多模块上有 3.3V 和 5V 的跳线帽,记得跳到 3.3V。
驱动方面,CH340 需要安装厂商提供的驱动,CP2102 需要安装 Silicon Labs 的驱动。安装完成后,插上模块,设备管理器里会出现一个 COM 口,记住这个端口号,后面配置软件时要用。
5.2 BOOT 跳线设置与串口接线
USB转TTL 烧录的关键在于BOOT 跳线。烧录前必须把 BOOT0 跳到 1(3.3V),BOOT1 跳到 0(GND)。烧录完成后,把 BOOT0 跳回 0,重新上电。
接线方面,USB转TTL 模块与最小系统板的连接如下:
| USB转TTL 引脚 | 最小系统板引脚 | 说明 |
|---|---|---|
| TXD | PA10 (RX) | 发送接接收 |
| RXD | PA9 (TX) | 接收接发送 |
| GND | GND | 共地 |
| 3.3V | 3V3 | 供电(可选) |
注意 TXD 和 RXD 是交叉连接的,模块的发送接芯片的接收,模块的接收接芯片的发送。很多人第一次接的时候直接 TXD 对 TXD,结果当然连不上。
5.3 使用 FlyMcu 或 STM32CubeProgrammer 烧录
串口烧录工具常用的是FlyMcu,国产软件,界面简单,专门用于 STM32 串口下载。使用流程:
- 打开 FlyMcu,选择对应的 COM 口。
- 波特率一般选 115200,如果烧录失败可以降低到 57600 或 38400。
- 选择要烧录的
.hex文件。 - 勾选 “编程后执行” 和 “校验”。
- 点击 “开始编程”。
如果一切正常,你会看到进度条走完,提示 “编程成功”。然后拔掉 BOOT0 跳线帽,重新插到 0 位置,按一下复位键,程序就开始运行了。
STM32CubeProgrammer 也支持串口烧录。在连接方式里选择 “UART”,选择 COM 口和波特率,点击 “Connect”,然后选择文件烧录即可。
5.4 实测速度与常见问题
串口烧录的速度是三种方式中最慢的。同样 20KB 固件,在 115200 波特率下大约需要10-15 秒。如果固件更大,时间会更长。而且串口烧录不支持调试,每次烧录都要手动切换 BOOT 跳线,非常繁琐。
串口烧录最常见的失败原因是BOOT 跳线没设对。如果 BOOT0 没有跳到 1,芯片从 Flash 启动,Bootloader 不会运行,上位机自然连不上。另一个常见原因是串口被占用,比如你同时打开了串口助手和 FlyMcu,两者抢同一个 COM 口,就会导致连接失败。
还有一个坑是CH340 驱动兼容性。某些版本的 CH340 驱动在 Win11 上会出现 “无法识别的 USB 设备” 或者蓝屏。解决办法是去官网下载最新驱动,或者换用 CP2102 模块。
6. 三种方式实测对比与选择建议
6.1 速度、成本、易用性对比
| 对比维度 | ST-Link | J-Link | USB转TTL |
|---|---|---|---|
| 价格 | 10-30元 | 50-300元 | 5-15元 |
| 烧录速度(20KB) | 2-3秒 | 1-2秒 | 10-15秒 |
| 是否需要跳线 | 否 | 否 | 是 |
| 支持在线调试 | 是 | 是 | 否 |
| 支持芯片范围 | 仅ST | 几乎所有 | 支持串口Bootloader的芯片 |
| 驱动稳定性 | 好 | 山寨版一般 | CH340一般,CP2102好 |
| 适合场景 | 日常开发 | 复杂项目/量产 | 应急/极简需求 |
6.2 不同场景下的选择建议
如果你是初学者,刚买了一块 STM32F103C8T6 最小系统板,我建议直接买一个 ST-Link V2。十几块钱,接线简单,配合 Keil 或 CubeProgrammer 都能用,不需要折腾 BOOT 跳线,烧录速度快,还能在线调试。这是最省心的方案。
如果你手里已经有 J-Link,或者需要调试更复杂的项目,那就用 J-Link。它的调试功能更强,烧录速度更快,但要注意山寨版的兼容性问题。
如果你预算极其有限,或者只是偶尔烧录一次,USB转TTL 也能用。但要做好心理准备,每次烧录都要切换 BOOT 跳线,速度慢,而且不支持调试。适合应急场景。
6.3 关于国产替代芯片的补充说明
最近几年国产 MCU 发展很快,很多 STM32F103C8T6 的替代芯片在引脚和功能上兼容。这些芯片用 ST-Link 烧录时,大部分能正常识别,但偶尔会遇到 “Flash 大小识别错误” 或者 “无法擦除” 的问题。用 J-Link 的话,需要确认驱动版本是否支持对应芯片。USB转TTL 方式对国产芯片的兼容性取决于芯片是否内置了兼容的 Bootloader,这个要具体芯片具体分析。
7. 常见问题排查与避坑指南
7.1 连接失败类问题
问题一:ST-Link 提示 “No target connected”
排查思路:先检查接线,确认 SWDIO、SWCLK、GND 三根线接对且接触良好。然后检查目标板是否供电,3.3V 是否正常。如果都正常,尝试接上 NRST 引脚,或者在 CubeProgrammer 里把 “Connect Under Reset” 模式打开。还有一种可能是芯片里运行的程序把 SWD 引脚复用了,导致调试接口被占用,这时候需要按住复位键再点击连接。
问题二:J-Link 提示 “Cannot connect to target”
排查思路:确认 J-Link 驱动版本是否兼容,山寨版 J-Link 建议用 V6.xx 驱动。检查 SWD 速度是否设得太高,降低到 1000kHz 试试。确认目标芯片型号选择正确,STM32F103C8T6 的 Device 选 “STM32F103C8”。
问题三:串口烧录提示 “无法打开串口”
排查思路:确认 COM 口选择正确,设备管理器里能看到。关闭其他占用串口的软件,比如串口助手、Putty 等。检查 BOOT0 是否跳到 1,BOOT1 是否跳到 0。降低波特率试试。
7.2 烧录成功但程序不运行
这是新手最常遇到的问题。烧录显示成功,但板子没反应。原因通常有三个:
第一,BOOT0 没有跳回 0。串口烧录完成后,必须把 BOOT0 跳回 GND,否则芯片每次上电都进入 Bootloader,不会运行你的程序。
第二,没有复位。烧录完成后,按一下板子上的复位键,或者重新上电,芯片才会从 Flash 重新启动。
第三,程序本身有问题。比如时钟配置错误、引脚定义不对、没有写主循环等。这时候需要用调试器单步跟踪,确认程序是否真的在运行。
7.3 驱动与软件兼容性问题
蓝屏问题:某些山寨 ST-Link 或者 CH340 驱动在 Win10/Win11 上会导致蓝屏。解决办法是卸载旧驱动,去官网下载最新版驱动。如果还是蓝屏,换一个调试器或者换一台电脑试试。
Keil 识别不到调试器:在 “Options for Target” → “Debug” 里确认选择了正确的调试器,点击 “Settings” 确认能识别到设备。如果识别不到,检查驱动是否安装,USB 线是否插好。
CubeProgrammer 连接超时:把 SWD 速度降低,勾选 “Connect Under Reset”,检查 NRST 是否接好。
7.4 独家避坑技巧
第一个技巧:用万用表确认杜邦线通断。很多烧录失败是因为杜邦线内部断了,外表看不出来。花一分钟量一下,能省下半小时排查时间。
第二个技巧:准备一个已知能用的最小系统板作为对照。当你怀疑是板子问题还是调试器问题时,换一块确认能用的板子试试,能快速定位问题。
第三个技巧:ST-Link 的固件可以升级。如果遇到兼容性问题,用 ST-Link Utility 或者 CubeProgrammer 升级固件试试。但注意,山寨版 ST-Link 升级固件有风险,可能变砖。
第四个技巧:串口烧录时先点“开始编程”再给板子上电。FlyMcu 有一个 “DTR 低电平复位” 选项,勾选后软件会自动控制复位,省去手动操作。但前提是你的 USB转TTL 模块引出了 DTR 和 RTS 引脚。
8. 烧录之外的几个实用建议
8.1 固件加密与读保护
STM32F103C8T6 支持读保护功能,可以防止别人通过调试器读出你烧录的固件。在 CubeProgrammer 里可以设置 “Read Out Protection” 为 Level 1,这样通过 SWD 就读不出 Flash 内容了。但注意,一旦开启读保护,再次烧录时需要先解除保护,而解除保护会擦除整个 Flash。所以量产时再开,开发阶段不要开。
8.2 批量烧录的效率优化
如果你需要烧录多块板子,ST-Link 和 J-Link 都支持批量烧录。J-Flash 可以配置成 “Production Programming” 模式,按一下按键就自动烧录下一块。ST-Link 的话,可以用 CubeProgrammer 的命令行版本写一个批处理脚本,自动烧录并校验。
8.3 最小系统板插面包板的注意事项
STM32F103C8T6 最小系统板插在面包板上时,注意排针间距是 2.54mm,面包板中间槽两侧的孔距也是 2.54mm,但板子宽度可能刚好跨过中间槽。插的时候要对准,不要硬按,避免把排针压弯。另外,面包板的接触电阻比较大,SWD 信号经过面包板可能会不稳定,建议烧录时直接用杜邦线连接,不要经过面包板。
8.4 关于国产替代芯片的烧录经验
国产替代芯片在烧录时,ST-Link 有时会识别成 “Unknown device” 或者 Flash 大小显示错误。这时候可以尝试在 CubeProgrammer 里手动选择芯片型号,或者用 J-Link 配合对应版本的驱动。串口烧录的话,需要确认国产芯片的 Bootloader 是否兼容 ST 的协议,大部分兼容,但少数需要专用工具。
我在实际使用中的体会是,ST-Link 配合 CubeProgrammer 是 STM32F103C8T6 最稳妥的烧录方案,没有之一。J-Link 适合手里已经有设备且需要高级调试功能的场景,USB转TTL 则是预算极度受限或者应急时的备选。把 BOOT 跳线、接线、驱动这三件事搞清楚,基本上就不会再被烧录问题卡住了。