ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

STM32F103C8T6程序烧录全攻略:ST-Link、J-Link与USB转TTL选型指南

STM32F103C8T6程序烧录全攻略:ST-Link、J-Link与USB转TTL选型指南 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 的区别为什么现在都用 SWDST-Link 和 J-Link 都支持两种调试协议JTAG 和 SWD。JTAG 是老标准需要 TDI、TDO、TCK、TMS、TRST 五根信号线占引脚多。SWD 是 ARM 后来推出的串行调试接口只需要 SWDIO 和 SWCLK 两根线加上电源和地一共四根线就能完成烧录和调试。对于 STM32F103C8T6 这种 48 引脚的小芯片引脚资源本来就紧张SWD 的优势非常明显。你只需要接 SWDIOPA13、SWCLKPA14、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否否是BOOT01在线调试支持支持不支持烧录速度中等快慢典型价格10-30元正版上千山寨几十5-10元适用场景日常开发批量/高速调试应急/无调试器这张表建议截图保存。选型的时候对着看基本不会选错。下面我逐个展开把每种方式的实操细节讲透。3. ST-Link 烧录实操最推荐的日常方案3.1 硬件接线与最小系统板引脚对应ST-Link 有几种常见形态一种是独立的 USB 棒一种是带排针的小板还有一种是集成在开发板上的。不管哪种引出的信号线都是一样的SWDIO、SWCLK、GND、3.3V有些还带 RST。接线对应到 STM32F103C8T6 最小系统板ST-Link 的 SWDIO 接板子的 PA13有的板子标为 SWDIOST-Link 的 SWCLK 接板子的 PA14标为 SWCLKST-Link 的 GND 接板子的 GNDST-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 选 SWMax 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-FlashFile - Open Project如果没有现成的工程就新建一个。Target Device 里选 STM32F103C8Target Interface 选 SWDSpeed 可以设到 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-LinkOptions for Target - Debug 选“J-LINK / J-TRACE Cortex”Settings 里 Port 选 SWMax 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 支持通过 UART1PA9 和 PA10接收固件写入 Flash。所以 USB转TTL 烧录和 ST-Link、J-Link 有本质区别前者是串口 ISP后者是 SWD 调试。USB转TTL 不能在线调试不能设断点不能看寄存器只能烧录。它的价值在于当你手头没有调试器或者调试器的接口被占用时还能把程序烧进去。5.2 BOOT 引脚设置与接线细节用 USB转TTL 烧录第一步是把 BOOT0 拉到 3.3VBOOT1 拉到 GND。最小系统板上一般有跳线帽或者拨码开关直接改就行。改完之后按一下复位键芯片就进入 Bootloader 模式了。接线对应USB转TTL 的 TX 接板子的 PA10RXUSB转TTL 的 RX 接板子的 PA9TXUSB转TTL 的 GND 接板子的 GNDUSB转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 ResetNo 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 改回 GNDUSB转TTL 的 TX/RX 保持连接在程序里初始化 UART1就能通过串口助手看打印信息。这样即使没有 ST-Link也能做简单的调试。第五个技巧如果 SWD 接口被程序占用可以用“Connect Under Reset”模式。在 ST-LINK Utility 或 Keil 的调试设置里把 Reset 方式改成“Connect Under Reset”然后按住板子复位键点击连接再松开复位键。这样芯片在复位状态下被连接即使程序把 SWD 引脚配置成了普通 GPIO也能连上。这些技巧都是我在实际项目中反复验证过的不是网上抄来的。你可以在自己的板子上试一下有问题欢迎交流。STM32F103C8T6 这颗芯片虽然老但生命力很强把烧录这一关过了后面的开发就顺畅多了。
返回列表