☰
STM32F103C8T6程序烧录全攻略:ST-Link、J-Link与USB转TTL选型指南
2026/9/25 7:07:36 网站建设 项目流程

1. 三种烧录方式到底该怎么选

STM32F103C8T6 这颗芯片,可以说是国内嵌入式入门圈子里绕不开的一块“神U”。48个引脚、64KB Flash、20KB SRAM、Cortex-M3 内核,配合市面上十几块钱的最小系统板,几乎成了电子类专业学生和硬件爱好者的标配。但很多人拿到板子之后,第一个卡住的地方不是写代码,而是——程序怎么烧进去?我见过太多人在实验室里对着板子折腾一下午,ST-Link 报“No target connected”,J-Link 弹“No J-Link found”,USB转TTL 接线接反了把 TX 和 RX 搞混,最后怀疑是不是芯片坏了。其实绝大多数情况下,问题都出在烧录方式和接线细节上,跟芯片本身没多大关系。

这篇内容就是把我自己用 STM32F103C8T6 做项目时,反复用到的三种烧录方式——ST-Link、J-Link、USB转TTL——从头到尾捋一遍。每种方式我都会讲清楚它的原理、接线、软件配置、实测速度,以及最容易踩的坑。不管你是刚上手最小系统板的新手,还是已经做过几个项目但烧录总出问题的老手,都能从这里找到可以直接抄作业的方案。核心关键词就三个:STM32F103C8T6、程序烧录、调试器选型,全文围绕这三个词展开,不跑题。

先说结论,方便你快速定位:日常开发调试,ST-Link 是性价比最高的选择,便宜、稳定、支持 SWD 调试;J-Link 速度快、功能强,但正版贵、盗版固件容易掉;USB转TTL 适合没有调试器时的应急方案,只能通过串口 ISP 方式烧录,不能在线调试。三种方式各有适用场景,不是谁替代谁的关系。

2. 烧录之前必须搞清楚的底层逻辑

2.1 STM32F103C8T6 的启动模式与烧录入口

很多人烧录失败,根本原因是不理解 STM32 的启动模式。STM32F103C8T6 有两个 BOOT 引脚:BOOT0 和 BOOT1。芯片上电复位时,会采样这两个引脚的电平,决定从哪块存储区域启动。具体对应关系如下:

BOOT0BOOT1启动区域典型用途
0X主 Flash正常运行程序
10系统存储器串口 ISP 烧录
11内置 SRAM调试用,极少使用

这张表是理解三种烧录方式差异的关键。ST-Link 和 J-Link 走的是 SWD 或 JTAG 调试接口,直接访问内核和 Flash 控制器,不需要改 BOOT 引脚,芯片正常从 Flash 启动就行。而 USB转TTL 走的是串口 ISP,必须把 BOOT0 拉高、BOOT1 拉低,让芯片上电后进入系统存储器里的 Bootloader,才能通过串口接收固件。

我刚开始学的时候,用 USB转TTL 烧录,怎么都不成功,后来才发现 BOOT0 忘了拉到 3.3V。这个坑几乎每个人都踩过,所以放在最前面说。

2.2 SWD 与 JTAG 的区别,为什么现在都用 SWD

ST-Link 和 J-Link 都支持两种调试协议:JTAG 和 SWD。JTAG 是老标准,需要 TDI、TDO、TCK、TMS、TRST 五根信号线,占引脚多。SWD 是 ARM 后来推出的串行调试接口,只需要 SWDIO 和 SWCLK 两根线,加上电源和地,一共四根线就能完成烧录和调试。

对于 STM32F103C8T6 这种 48 引脚的小芯片,引脚资源本来就紧张,SWD 的优势非常明显。你只需要接 SWDIO(PA13)、SWCLK(PA14)、GND、3.3V 四根线,剩下的引脚全部可以拿来做项目。JTAG 在 F103 上虽然也能用,但实际项目中我基本没见过谁用 JTAG,除非是调试更复杂的多核芯片。

注意:SWDIO 和 SWCLK 对应的 PA13、PA14 在芯片复位后默认就是调试功能,但如果你在程序里把这两个引脚配置成了普通 GPIO,下次烧录就可能连不上。解决办法是烧录时按住复位键,点击下载后再松开,或者用 ST-Link Utility 的连接设置里把“Connect Under Reset”打开。

2.3 三种烧录方式的本质差异

把三种方式放在一起对比,本质差异就一目了然了:

对比项ST-LinkJ-LinkUSB转TTL
接口协议SWD/JTAGSWD/JTAGUART
需要改BOOT否否是(BOOT0=1)
在线调试支持支持不支持
烧录速度中等快慢
典型价格10-30元正版上千,山寨几十5-10元
适用场景日常开发批量/高速调试应急/无调试器

这张表建议截图保存。选型的时候对着看,基本不会选错。下面我逐个展开,把每种方式的实操细节讲透。

3. ST-Link 烧录实操:最推荐的日常方案

3.1 硬件接线与最小系统板引脚对应

ST-Link 有几种常见形态:一种是独立的 USB 棒,一种是带排针的小板,还有一种是集成在开发板上的。不管哪种,引出的信号线都是一样的:SWDIO、SWCLK、GND、3.3V,有些还带 RST。

接线对应到 STM32F103C8T6 最小系统板:

  • ST-Link 的 SWDIO 接板子的 PA13(有的板子标为 SWDIO)
  • ST-Link 的 SWCLK 接板子的 PA14(标为 SWCLK)
  • ST-Link 的 GND 接板子的 GND
  • ST-Link 的 3.3V 接板子的 3.3V

这里有个细节:最小系统板一般有 4 针的调试接口,丝印通常是“SWD”或者“SWIM”,顺序可能是 GND、SWCLK、SWDIO、3.3V,也可能是 3.3V、SWDIO、SWCLK、GND。不同厂家的板子顺序不一样,接线前一定要看板子背面的丝印或者原理图,不要凭感觉插。我见过有人把 3.3V 和 GND 接反,ST-Link 当场发烫,虽然一般有保护,但心里还是咯噔一下。

提示:如果你的 ST-Link 是那种十几块钱的山寨版,建议只接 SWDIO、SWCLK、GND 三根线,3.3V 不要接。因为有些山寨 ST-Link 的 3.3V 输出能力很弱,反而会引起供电不稳。板子单独用 USB 供电就行。

3.2 软件配置:STM32 ST-LINK Utility 与 Keil 的配合

ST-Link 烧录有两种常用软件路径:一种是独立的 STM32 ST-LINK Utility,适合烧录 hex 文件、读取芯片内容、批量擦除;另一种是直接在 Keil MDK 里配置,写完代码一键下载,开发效率最高。

先说 STM32 ST-LINK Utility 的用法。打开软件,点击 Target -> Connect,如果接线正确,下方状态栏会显示芯片型号和 Flash 大小。连接成功后,File -> Open File 选择编译好的 hex 或 bin 文件,然后 Target -> Program & Verify,等待进度条走完就行。这个软件的好处是直观,能看到芯片里的数据,适合排查“程序到底有没有烧进去”的问题。

再说 Keil 里的配置。打开 Options for Target -> Debug,选择“ST-Link Debugger”,点击 Settings。在 Debug 标签页里,Port 选 SW,Max Clock 可以拉到 4MHz 甚至更高。Flash Download 标签页里,勾选“Reset and Run”,这样下载完程序自动运行,不用手动按复位。Programming Algorithm 里要确认有 STM32F10x Med-density Flash 的算法,如果没有,点 Add 添加。

这里有个常见问题:Keil 里点下载报“No Cortex-M Device found”。排查顺序是:先看 ST-Link 驱动装没装(设备管理器里有没有 STLink 设备),再看接线,再看芯片是不是被读保护了。读保护的问题后面单独讲。

3.3 实测速度与稳定性记录

我用同一块 STM32F103C8T6 最小系统板,烧录一个 20KB 左右的 hex 文件,实测数据如下:

软件接口烧录耗时稳定性
ST-LINK UtilitySWD 4MHz约 3.2 秒很稳
Keil MDKSWD 4MHz约 2.8 秒很稳
Keil MDKSWD 1MHz约 5.1 秒很稳

速度差异主要来自 SWD 时钟频率。4MHz 在 F103 上完全没问题,线短的话拉到 8MHz 也能跑。但如果你的杜邦线比较长(超过 15cm),建议降到 1MHz 或 2MHz,否则容易出现“Cannot access target”的报错。这是信号完整性问题,不是芯片问题。

稳定性方面,ST-Link 是我用得最放心的。连续烧录几十次没有掉过链子,唯一一次失败是因为杜邦线接触不良。所以如果你只买一个调试器,ST-Link 是首选。

3.4 ST-Link 使用中的三个关键注意事项

第一个注意事项:山寨 ST-Link 的固件升级问题。有些便宜的 ST-Link 用的是老固件,Keil 高版本会提示升级。升级本身没问题,但升级过程中如果 USB 松动,可能把调试器刷成砖。我的建议是,如果当前能用,就不要手贱去点升级。

第二个注意事项:目标板供电冲突。如果你的最小系统板已经通过 USB 口供电,ST-Link 的 3.3V 就不要再接了,否则两个电源打架,轻则烧录不稳定,重则损坏芯片。判断方法很简单:板子上的电源灯亮了,就说明已经供电了。

第三个注意事项:读保护解除。如果芯片被设置了读保护(通常是为了防止程序被读出),ST-Link 连接时会提示“Cannot read memory”或者直接连不上。这时候需要在 ST-LINK Utility 里点 Target -> Option Bytes,把 Read Out Protection 改成 Disabled,然后 Apply。注意这个操作会全片擦除,程序会丢,确认之前先备份。

4. J-Link 烧录实操:速度与功能的进阶选择

4.1 J-Link 的版本差异与兼容性坑

J-Link 是 SEGGER 公司的产品,正版价格从几百到几千不等,功能和速度都是顶级的。但国内大部分人用的是山寨 J-Link,也就是俗称的“盗版 J-Link”或者“J-Link OB”。这里必须说清楚:山寨 J-Link 的固件版本和正版有差异,某些新版本的 J-Link 软件会检测并拒绝山寨设备,报“No J-Link found”或者“J-Link firmware too old”。

我手上有两个 J-Link,一个是正版 EDU 版,一个是山寨 V9。正版从来没出过问题,山寨的在 J-Link 软件 V6.88 之后就开始闹脾气,后来降级到 V6.44 才恢复正常。所以如果你用山寨 J-Link,建议固定用一个能用的软件版本,不要盲目追新。

另外,热词里提到的“cw32l010 支持 j-link版本”,说的是国产芯片 CW32L010 对 J-Link 版本的兼容性问题。这个思路同样适用于 STM32F103C8T6:不是所有 J-Link 版本都能识别所有芯片,遇到识别不了的情况,先查 J-Link 软件版本是否支持该芯片,再查接线。

4.2 J-Link 接线与 J-Flash 烧录流程

J-Link 的接线和 ST-Link 类似,也是 SWDIO、SWCLK、GND、3.3V,有些型号还带 RST 和 VTref。接到 STM32F103C8T6 上,同样是 PA13、PA14、GND、3.3V。

J-Link 的烧录软件主要是 J-Flash。打开 J-Flash,File -> Open Project,如果没有现成的工程,就新建一个。Target Device 里选 STM32F103C8,Target Interface 选 SWD,Speed 可以设到 4000kHz 甚至更高。连接成功后,File -> Open Data File 选择 hex 或 bin,然后 Target -> Production Programming,或者直接按 F5。

J-Flash 的一个好处是支持命令行,可以写脚本批量烧录。如果你要做小批量生产,J-Link 配合 J-Flash 的命令行模式,效率比 ST-Link 高很多。实测烧录同样的 20KB 文件,J-Link 在 4MHz 下大约 2.1 秒,比 ST-Link 快 30% 左右。如果拉到 12MHz,能压到 1.5 秒以内。

4.3 J-Link 在 Keil 中的配置要点

在 Keil 里用 J-Link,Options for Target -> Debug 选“J-LINK / J-TRACE Cortex”,Settings 里 Port 选 SW,Max Clock 根据线长调整。Flash Download 里同样要确认有 STM32F10x Med-density 的算法。

这里有个坑:Keil 里 J-Link 的下载算法和 ST-Link 是共用的,但有时候 J-Link 的驱动会覆盖 ST-Link 的驱动,导致两个调试器不能同时用。解决办法是装 J-Link 驱动时选择“不替换现有驱动”,或者用 J-Link 的 DLL 替换工具手动切换。

注意:J-Link 的 VTref 引脚要接目标板的 3.3V,这是 J-Link 检测目标板电压用的。如果不接,J-Link 可能无法识别目标板电平,导致连接失败。这一点和 ST-Link 不同,ST-Link 一般不需要 VTref。

4.4 J-Link 常见报错与解决思路

“No J-Link found”是最常见的报错,原因通常有三个:USB 驱动没装好、J-Link 被其他软件占用、山寨固件被检测。排查顺序:先看设备管理器里有没有 J-Link 设备,再看是不是 Keil 和 J-Flash 同时打开了,最后考虑固件版本问题。

“Cannot connect to target”通常是接线或供电问题。检查 SWDIO、SWCLK 有没有接反,目标板有没有供电,芯片是不是处于复位状态。可以尝试在 J-Flash 里把“Connect Under Reset”打开,或者降低 SWD 速度。

“J-Link firmware too old”就是固件版本问题。山寨 J-Link 不要随便升级固件,升级后可能直接变砖。如果已经升级了,可以尝试用 J-Link 的固件降级工具,或者换一个旧版本的 J-Link 软件。

5. USB转TTL 烧录实操:没有调试器时的应急方案

5.1 USB转TTL 的本质:串口 ISP 不是调试

先纠正一个概念:USB转TTL 是串口通讯工具,它把 USB 信号转换成 TTL 电平的 UART 信号。用它烧录 STM32,走的是芯片内置的 Bootloader,也就是系统存储器里的那段出厂程序。这个 Bootloader 支持通过 UART1(PA9 和 PA10)接收固件,写入 Flash。

所以 USB转TTL 烧录和 ST-Link、J-Link 有本质区别:前者是串口 ISP,后者是 SWD 调试。USB转TTL 不能在线调试,不能设断点,不能看寄存器,只能烧录。它的价值在于:当你手头没有调试器,或者调试器的接口被占用时,还能把程序烧进去。

5.2 BOOT 引脚设置与接线细节

用 USB转TTL 烧录,第一步是把 BOOT0 拉到 3.3V,BOOT1 拉到 GND。最小系统板上一般有跳线帽或者拨码开关,直接改就行。改完之后按一下复位键,芯片就进入 Bootloader 模式了。

接线对应:

  • USB转TTL 的 TX 接板子的 PA10(RX)
  • USB转TTL 的 RX 接板子的 PA9(TX)
  • USB转TTL 的 GND 接板子的 GND
  • USB转TTL 的 3.3V 接板子的 3.3V(如果板子已供电则不接)

注意 TX 和 RX 是交叉接的,这是串口通讯的基本规则。我见过有人 TX 接 TX、RX 接 RX,然后纳闷为什么没反应。记住一句话:发送接接收,接收接发送。

5.3 用 FlyMcu 烧录的完整步骤

烧录软件推荐 FlyMcu,国产工具,界面简单,专门针对 STM32 串口 ISP。打开 FlyMcu,选择串口号(在设备管理器里看 USB转TTL 对应的 COM 口),波特率选 115200 或 57600。然后选择要烧录的 hex 文件,点击“开始编程”。

如果连接成功,下方会显示“开始连接...”,然后进度条走完,提示“编程成功”。如果一直显示“开始连接...”,说明没进入 Bootloader 或者接线有问题。排查顺序:BOOT0 是不是拉高了、TX/RX 是不是接反了、串口号是不是选对了、波特率是不是太高了。

FlyMcu 的烧录速度比 ST-Link 慢不少,同样 20KB 文件,115200 波特率下大约 8-10 秒。如果调到 57600,时间翻倍。所以 USB转TTL 只适合应急,不适合频繁烧录。

5.4 烧录后必须改回 BOOT0 的提醒

这是 USB转TTL 烧录最容易忘的一步:烧录完成后,必须把 BOOT0 改回 GND,然后按复位键,程序才会正常运行。如果 BOOT0 还留在 3.3V,芯片每次上电都进 Bootloader,程序不会跑。我见过有人烧录完发现程序没反应,以为烧录失败,其实是 BOOT0 没改回来。

提示:有些最小系统板把 BOOT0 设计成按键,按下是 3.3V,松开是 GND。这种板子烧录时按住按键,烧录完松开再复位就行,比跳线帽方便。

6. 三种方式实测对比与选型建议

6.1 速度、稳定性、成本三维对比

把三种方式放在同一块 STM32F103C8T6 最小系统板上,烧录同一个 20KB hex 文件,实测数据汇总:

对比维度ST-LinkJ-LinkUSB转TTL
烧录耗时2.8-3.2秒1.5-2.1秒8-10秒
在线调试支持支持不支持
需要改BOOT否否是
硬件成本10-30元正版高,山寨几十5-10元
驱动安装简单稍复杂简单
稳定性高高(正版)中
批量烧录一般强弱

从表里能看出来,J-Link 在速度和批量烧录上有优势,ST-Link 在性价比和易用性上最好,USB转TTL 只在没有调试器时才有价值。

6.2 不同场景下的推荐方案

如果你是学生或者个人爱好者,日常学习 STM32F103C8T6,我推荐 ST-Link。十几块钱,接线简单,Keil 里一键下载,支持调试,完全够用。

如果你在做项目,需要频繁烧录、调试复杂逻辑,或者要做小批量生产,J-Link 更合适。速度快,J-Flash 支持命令行,可以写脚本自动化。

如果你手头只有 USB转TTL,或者调试器临时坏了,那就用串口 ISP 应急。记住改 BOOT0,烧完改回来。

如果你在做智能门锁、智能温度监控调节系统这类 STM32F103C8T6 课程设计,ST-Link 是最稳妥的选择,因为你需要反复调试代码,在线调试功能必不可少。

6.3 国产替代芯片的烧录兼容性提醒

热词里提到了“stm32f103c8t6国产替代”,比如 GD32F103、CW32L010、APM32F103 等。这些芯片在引脚和寄存器层面和 STM32F103C8T6 高度兼容,但烧录时可能有差异。GD32F103 用 ST-Link 烧录一般没问题,但 J-Link 需要选对应的 GD32 器件型号。CW32L010 对 J-Link 版本有要求,前面提过。所以如果你用的是国产替代芯片,烧录前先查一下调试器的支持列表,不要直接套用 STM32 的配置。

7. 烧录失败排查速查表与避坑经验

7.1 常见报错与对应解决方案

报错信息可能原因解决方法
No target connected接线错误、目标板没供电检查SWDIO/SWCLK/GND,确认供电
Cannot access targetSWD速度太快、芯片复位中降低SWD时钟,开Connect Under Reset
No J-Link found驱动问题、山寨固件被检测重装驱动,降级J-Link软件版本
Cannot read memory芯片读保护解除读保护(会全片擦除)
串口ISP连接失败BOOT0没拉高、TX/RX接反改BOOT0,交叉接线
烧录成功但程序不跑BOOT0没改回、复位没按BOOT0接GND,按复位

这张表建议打印出来贴在工位上,遇到问题先查表,能省很多时间。

7.2 我踩过的五个坑与独家经验

第一个坑:杜邦线质量。便宜的杜邦线内部铜丝很细,接触电阻大,SWD 高速通讯时容易出错。我后来换了一批带锁扣的杜邦线,烧录稳定性明显提升。如果你经常遇到随机性的连接失败,先换线试试。

第二个坑:USB 口供电不足。有些电脑的 USB 口输出电流不够,ST-Link 和最小系统板同时供电时,电压被拉低,导致烧录失败。解决办法是用带外部供电的 USB Hub,或者给板子单独供电。

第三个坑:Keil 的下载算法选错。STM32F103C8T6 是中等容量(64KB Flash),要选“STM32F10x Med-density Flash”。如果选成 High-density,烧录会报错。这个细节很多人忽略。

第四个坑:芯片被锁。有些开发板出厂时设置了读保护,ST-Link 连不上。用 ST-LINK Utility 解除读保护后,芯片会全片擦除,然后就能正常烧录了。

第五个坑:J-Link 和 ST-Link 驱动冲突。两个调试器的驱动都装的话,有时候 Keil 会认错设备。我的做法是,常用哪个就装哪个的驱动,另一个用的时候再切换。

7.3 提高烧录成功率的操作习惯

养成几个好习惯,能大幅减少烧录问题。第一,接线前先看板子丝印,确认引脚定义,不要凭记忆。第二,烧录时先连接,确认芯片识别成功,再点下载。第三,烧录完成后,先看软件提示是否成功,再看板子上的运行指示灯。第四,定期检查杜邦线和排针,氧化或松动的及时更换。第五,重要项目烧录前先备份 hex 文件,防止读保护操作把程序擦掉。

这些习惯看起来简单,但真正坚持下来,能帮你省下大量排查时间。我在做智能门锁课程设计的时候,就是因为提前备份了 hex,芯片被误设读保护后,直接重新烧录,没有耽误进度。

8. 关于烧录加密与程序保护的补充

热词里提到了“stm32f103c8t6加密”,这里简单说一下。STM32F103C8T6 支持读保护功能,开启后,通过调试器无法读出 Flash 里的程序。设置方法是在 ST-LINK Utility 的 Option Bytes 里,把 Read Out Protection 设为 Enabled。开启后,程序只能运行,不能被读取。

但要注意,读保护不是绝对安全。有经验的人可以通过某些手段绕过,所以真正重要的程序,还需要配合其他保护措施。另外,开启读保护后,如果要重新烧录,必须先解除保护,而解除保护会全片擦除。所以量产时,一般是先烧录程序,再开读保护,顺序不要搞反。

对于课程设计或者个人项目,读保护一般用不上。但如果你做的是商业产品,这个功能值得了解。

9. 最后分享几个实用小技巧

第一个技巧:ST-Link 可以给最小系统板供电。如果你不想插两根 USB 线,可以把 ST-Link 的 3.3V 接到板子上,板子就不用单独供电了。但前提是 ST-Link 的 3.3V 输出能力足够,正版一般没问题,山寨的要看情况。

第二个技巧:Keil 里可以设置下载后自动复位运行。Options for Target -> Utilities -> Settings -> Flash Download,勾选“Reset and Run”。这样每次下载完,程序自动跑起来,不用手动按复位。

第三个技巧:J-Flash 可以生成烧录脚本。如果你要批量烧录,用 J-Flash 的“Create Command Line Project”功能,生成一个 bat 脚本,插上 J-Link 双击就能烧,效率很高。

第四个技巧:USB转TTL 也可以用来打印调试信息。烧录完成后,把 BOOT0 改回 GND,USB转TTL 的 TX/RX 保持连接,在程序里初始化 UART1,就能通过串口助手看打印信息。这样即使没有 ST-Link,也能做简单的调试。

第五个技巧:如果 SWD 接口被程序占用,可以用“Connect Under Reset”模式。在 ST-LINK Utility 或 Keil 的调试设置里,把 Reset 方式改成“Connect Under Reset”,然后按住板子复位键,点击连接,再松开复位键。这样芯片在复位状态下被连接,即使程序把 SWD 引脚配置成了普通 GPIO,也能连上。

这些技巧都是我在实际项目中反复验证过的,不是网上抄来的。你可以在自己的板子上试一下,有问题欢迎交流。STM32F103C8T6 这颗芯片虽然老,但生命力很强,把烧录这一关过了,后面的开发就顺畅多了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询