☰
ST-LINK Utility 烧录实战:从连接配置到读保护解锁的完整指南
2026/9/29 16:15:13 网站建设 项目流程

1. 为什么还要聊 ST-LINK Utility 这个"老古董"

如果你刚开始接触 STM32,大概率会经历这样一个过程:装好 Keil 或者 IAR,新建工程,点一下 Download 按钮,程序就跑起来了。一切看起来都很顺,直到某天你拿到一块别人给的板子,或者从产线上拿回来一批芯片,发现 Keil 里点下载报了一堆错,或者芯片被读保护锁死了,这时候你才意识到——原来"烧录"这件事,不只是点一个按钮那么简单。

ST-LINK Utility 就是在这个场景下登场的东西。它是 ST 官方早期推出的一款独立烧录工具,配合 ST-LINK 系列调试器使用,主要干三件事:连接目标芯片、烧录固件文件、擦除芯片或扇区。听起来功能很单一,但恰恰因为它的"独立"和"底层",在很多 Keil 搞不定的场合,它反而能救场。

我见过太多新人,Keil 一报错就懵了,不知道问题出在 IDE 配置、调试器固件、芯片状态还是接线。而 ST-LINK Utility 的好处在于,它把"连接"和"烧录"这两件事从 IDE 里剥离出来,让你能单独验证硬件链路是否正常。换句话说,它能帮你判断问题到底出在工具链还是出在芯片本身,这个诊断价值,比它本身的烧录功能还重要。

这篇内容适合谁看?如果你是刚上手 STM32、手里有一块 ST-LINK V2 或者板载 ST-LINK 的开发板、想搞清楚"从连上芯片到把程序写进去"这条链路到底发生了什么,那这篇就是给你写的。我会从驱动安装、连接配置、烧录文件格式、擦除策略一直讲到常见报错的排查思路,尽量把每一步背后的"为什么"也讲清楚,而不是只给你一串操作步骤。

需要提前说明的是,ST-LINK Utility 官方已经停止更新,ST 现在主推的是 STM32CubeProgrammer。但现实中大量教程、老项目、产线工具仍然在用 ST-LINK Utility,而且它的操作逻辑更简单直白,作为理解"烧录"这件事的入门工具非常合适。学会它之后,你再迁移到 CubeProgrammer 几乎是零成本。

2. 连接之前:驱动、硬件与那几个容易被忽略的细节

2.1 ST-LINK 驱动到底装的是什么东西

很多人以为插上 ST-LINK,电脑识别出设备就完事了。其实这里有个关键区分:ST-LINK 本身是一个 USB 设备,它需要驱动才能被系统识别;而它对外提供的 SWD/JTAG 接口,是另一套协议。你装驱动,解决的是"电脑能不能跟 ST-LINK 说话";而 ST-LINK Utility 能不能连上芯片,解决的是"ST-LINK 能不能跟 STM32 说话"。这两件事经常被混为一谈,导致排查方向跑偏。

ST-LINK 的驱动通常随 ST-LINK Utility 安装包一起装好,安装过程中会注册 USB 驱动。装完之后,你可以在设备管理器里看到类似 "STMicroelectronics STLink dongle" 或者 "STLink Virtual COM Port" 的条目。如果这里显示黄色感叹号,那说明驱动没装好,后面所有操作都免谈。

提示:如果你之前装过 Keil 的 ST-LINK 驱动包,或者装过 CubeProgrammer,驱动可能会冲突。表现是设备管理器里能看到设备,但 ST-LINK Utility 就是连不上。这时候建议先在设备管理器里卸载设备并勾选删除驱动,再重新装 ST-LINK Utility 自带的驱动。

2.2 接线:SWD 四根线,少一根都不行

ST-LINK 和 STM32 之间最常用的连接方式是 SWD(Serial Wire Debug),只需要四根线:

引脚名称作用是否必须
1VCC供电参考(3.3V)视情况
2SWDIO数据线必须
3SWCLK时钟线必须
4GND地必须

这里有几个新人最容易踩的坑。第一,VCC 这根线到底接不接。如果你的目标板已经独立供电,那 ST-LINK 的 VCC 可以不接,但 GND 必须共地。如果目标板没供电,你可以用 ST-LINK 的 3.3V 给板子供电,但要注意 ST-LINK 的供电能力有限,带不动功耗大的板子。第二,SWDIO 和 SWCLK 不要接反,接反了通常表现为连不上或者时好时坏。第三,线不要太长,SWD 是高速信号,杜邦线超过 20 厘米就容易出问题,我实测过用 30 厘米的杜邦线,连接成功率明显下降。

还有一个隐蔽的坑:有些开发板把 SWD 接口做成了 20 针的 JTAG 座,你需要用转接板或者按引脚定义单独引线。这时候一定要对照板子的原理图确认 SWDIO、SWCLK、GND 的位置,不要凭感觉插。

2.3 目标芯片的供电与复位状态

ST-LINK Utility 连接芯片时,芯片必须处于可调试状态。如果芯片跑飞了、进了低功耗模式、或者被读保护锁死,都可能连不上。这时候可以尝试两个办法:一是按住复位键再点连接,让芯片在复位状态下被识别;二是把 BOOT0 拉高,让芯片从系统存储器启动,绕过用户程序。

另外,如果目标板上有外部看门狗或者电源管理芯片,可能会在连接过程中干扰。我遇到过一次,板子上有个电源监控芯片,上电后延迟 200ms 才释放复位,导致 ST-LINK Utility 连接超时。后来在连接设置里把复位模式改成 "Connect Under Reset" 就解决了。

3. 连接配置:Target 菜单里那几个选项到底在干什么

3.1 连接模式:Normal 与 Connect Under Reset 的区别

打开 ST-LINK Utility,点 Target -> Connect,默认用的是 Normal 模式。这个模式的逻辑是:ST-LINK 直接通过 SWD 发送连接请求,芯片正常响应就建立连接。它适用于芯片运行正常、没有进入特殊状态的情况。

而 Connect Under Reset 模式,是让 ST-LINK 先拉住芯片的复位引脚,让芯片保持在复位状态,然后建立连接,连接成功后再释放复位。这个模式专门对付那些"程序跑飞导致 SWD 被占用"或者"芯片一上电就进低功耗"的情况。你可以这样理解:Normal 是敲门等人开,Connect Under Reset 是趁人还没反应过来先把门推开。

实际操作中,如果你用 Normal 连不上,第一件事就是换 Connect Under Reset 试试。这个切换能解决大概一半的"连不上"问题。

3.2 复位方式:硬件复位与软件复位的选择

在连接设置里还有一个 Reset Mode 选项,通常有 Hardware Reset 和 Software Reset 两种。硬件复位是通过 ST-LINK 的复位引脚直接拉低芯片的 NRST,软件复位是通过 SWD 协议发送复位命令。

区别在于:硬件复位需要你的 ST-LINK 复位引脚和芯片 NRST 连上。很多简易的 ST-LINK V2 只引出了 SWDIO、SWCLK、GND、VCC 四根线,没有复位线,这时候你只能选 Software Reset。而 Software Reset 在芯片完全死机的情况下可能无效,因为它依赖芯片内部的调试逻辑还能响应。

我的建议是:如果你的 ST-LINK 有复位引脚,尽量接上,并且优先用 Hardware Reset。这样连接成功率最高,尤其是在芯片状态不确定的时候。

3.3 时钟频率:不是越快越好

ST-LINK Utility 里可以设置 SWD 的时钟频率,默认一般是 4MHz 或者 1.8MHz。很多人觉得频率越高烧录越快,就拉到最高。但实际上,时钟频率受限于接线质量、线长、芯片型号。线长较长或者接线质量差的时候,高频会导致通信错误,表现为连接不稳定或者烧录校验失败。

我一般的做法是:先用默认频率连接,如果稳定就不动;如果出现连接断续或者烧录报错,就把频率降到 1MHz 甚至更低再试。烧录一个几十 KB 的固件,4MHz 和 1MHz 的差距也就一两秒,没必要为了这点速度牺牲稳定性。

4. 烧录文件:Hex、Bin、ELF 到底该选哪个

4.1 三种文件格式的本质区别

ST-LINK Utility 支持烧录的文件格式主要有 .hex、.bin 和 .elf。很多新人拿到文件就直接打开烧,根本不关心格式,结果烧进去不运行,又找不到原因。其实这三种格式的区别很关键:

格式是否含地址信息是否含调试信息典型来源
.hex含不含Keil、IAR 输出
.bin不含不含手动转换、部分工具输出
.elf含含编译器直接输出

关键点在于.bin 文件不包含地址信息。也就是说,ST-LINK Utility 打开 .bin 文件时,你必须手动指定烧录的起始地址。如果你不指定,它默认从 0x08000000 开始烧,对于大多数 STM32 应用这是对的,但如果你的程序是从别的地址开始的(比如带 Bootloader 的升级方案),就会烧错位置。

而 .hex 和 .elf 文件内部记录了每个数据段应该放在哪个地址,ST-LINK Utility 会自动解析,不需要你手动填地址。所以优先用 .hex 或 .elf,能省掉地址填错的坑。

4.2 打开文件后先别急着烧:检查地址范围

不管你用什么格式,打开文件之后,ST-LINK Utility 会显示文件的大小和地址范围。这时候一定要看一眼,确认地址范围落在芯片的 Flash 区域内。比如 STM32F103C8T6 的 Flash 是 64KB,地址范围是 0x08000000 到 0x0800FFFF。如果你打开的文件地址范围超出了这个区间,烧录会报错或者烧进去不运行。

我遇到过一个典型案例:有人用 Keil 编译了一个工程,输出文件地址范围是 0x08000000 到 0x0801FFFF,也就是 128KB,但他的芯片只有 64KB Flash。结果烧录时报错,他以为是工具问题,其实是芯片容量不够。这种情况要么换芯片,要么优化代码减小体积。

4.3 校验选项:多花几秒,省掉一堆麻烦

ST-LINK Utility 在烧录时有一个 "Verify after download" 选项,建议勾上。它的作用是在烧录完成后,把芯片里的数据和文件内容逐字节比对,确认烧录无误。多花的时间通常也就一两秒,但能帮你排除掉因为通信干扰导致的烧录错误。

我见过有人为了省时间不勾校验,结果烧进去的程序偶尔跑飞,查了半天才发现是烧录时某几个字节写错了。这种问题如果不开校验,几乎不可能定位。

5. 擦除策略:全片擦除、扇区擦除与读保护解锁

5.1 什么时候需要擦除

烧录之前要不要擦除,取决于你的操作场景。如果你只是更新程序,而且新程序和旧程序占用的地址范围完全重叠,ST-LINK Utility 在烧录时会自动覆盖对应区域,理论上不擦也能烧。但现实中我建议每次烧录前都擦除,原因有两个:一是旧程序可能有残留数据在新程序范围之外,导致运行时出现奇怪行为;二是擦除后烧录能保证 Flash 状态干净,避免因为 Flash 未擦除导致的写入失败。

STM32 的 Flash 有个特性:只能把 1 写成 0,不能把 0 写成 1。擦除操作就是把整个扇区恢复成全 1 状态。如果你不擦除直接写,而目标地址之前已经被写过(有 0),那写入就会失败或者数据错误。所以擦除是保证写入成功的前提。

5.2 全片擦除与扇区擦除的取舍

ST-LINK Utility 提供两种擦除方式:Erase Chip(全片擦除)和 Erase Sectors(扇区擦除)。

全片擦除是把整个 Flash 清空,操作简单,耗时取决于芯片容量,一般几秒到十几秒。扇区擦除是让你选择擦除哪些扇区,适合只想更新部分区域的场景,比如你有 Bootloader 在 0x08000000 开始的扇区,应用程序在后面的扇区,升级时只想擦除应用程序区域,保留 Bootloader。

我的经验是:开发阶段直接用全片擦除,省心。到了量产或者带 Bootloader 的升级场景,再用扇区擦除。因为扇区擦除需要你清楚知道每个扇区的地址范围,填错了可能把 Bootloader 擦掉,那就得不偿失了。

5.3 读保护:芯片被锁死后的解锁流程

这是 ST-LINK Utility 最有价值的功能之一。STM32 有一个读保护(Read Out Protection,简称 RDP)机制,开启后芯片内部的 Flash 不能被外部调试器读取,防止代码被抄。但如果你拿到一块开了读保护的芯片,想重新烧录自己的程序,就会连不上或者烧不进去。

解锁流程是这样的:在 ST-LINK Utility 里点 Target -> Option Bytes,找到 Read Out Protection 选项,把它从 "Enabled" 改成 "Disabled",然后点 Apply。这时候工具会提示你解锁会触发全片擦除,因为这是安全机制的要求——防止有人通过解锁读取原有代码。确认之后,芯片会被擦除,读保护解除,你就可以正常烧录了。

注意:解锁读保护会丢失芯片内所有原有程序,操作前确认你不需要保留原内容。另外,有些芯片在解锁后需要断电重新上电才能正常连接。

我遇到过一种情况:芯片开了读保护,用 Normal 模式连不上,用 Connect Under Reset 也连不上。后来发现需要在连接设置里把复位方式改成 Hardware Reset,并且 ST-LINK 的复位线必须接上,才能进入解锁流程。所以如果你要处理读保护芯片,提前把复位线接好,能省很多事。

6. 那些年我们踩过的连接与烧录报错

6.1 "No target connected":从现象到根因的排查链路

这个报错是新人遇到最多的。它的字面意思是"没有连接目标",但背后的原因可能有很多种。我一般按下面的顺序排查:

第一步,看设备管理器。确认 ST-LINK 被系统识别,没有黄色感叹号。如果这里就有问题,后面不用查了,先解决驱动。

第二步,看接线。确认 SWDIO、SWCLK、GND 三根线接对且接触良好。可以用万用表量一下通断,排除杜邦线内部断裂的情况。我遇到过好几次是杜邦线看着插好了,实际内部断了。

第三步,看供电。确认目标板有电,且电压在芯片工作范围内。如果目标板由 ST-LINK 供电,量一下 ST-LINK 的 3.3V 输出是否正常。

第四步,换连接模式。Normal 连不上就换 Connect Under Reset,Software Reset 不行就换 Hardware Reset。

第五步,降时钟频率。把 SWD 频率降到 1MHz 甚至 500kHz 再试。

第六步,检查芯片状态。如果以上都不行,可能是芯片进了读保护或者低功耗模式,需要按前面说的解锁流程处理。

这个排查顺序的逻辑是从外到内、从简单到复杂:先排除电脑和驱动问题,再排除线缆和供电问题,最后才怀疑芯片本身。按这个顺序走,大部分问题能在前三步解决。

6.2 "Cannot access memory" 与 Flash 写保护

这个报错通常出现在烧录阶段,意思是工具能连上芯片,但无法写入指定地址。常见原因是Flash 写保护(Write Protection)被开启了。STM32 的 Option Bytes 里可以对每个扇区单独设置写保护,开启后该扇区不能被写入。

解决办法同样是进 Option Bytes,把对应的写保护取消,然后 Apply。注意取消写保护也会触发擦除,所以操作前确认数据不需要保留。

还有一种可能是你烧录的地址超出了芯片 Flash 范围,比如往 0x08010000 写数据,但芯片只有 64KB Flash。这种情况工具会报 "Cannot access memory",因为那个地址根本不存在。

6.3 Keil 能烧但 ST-LINK Utility 连不上,反过来也一样

这种"一边行一边不行"的情况特别让人抓狂。根本原因通常是两者的连接参数不一样。Keil 在下载时会用自己的连接配置,可能用了 Connect Under Reset,也可能用了不同的时钟频率。而 ST-LINK Utility 默认用 Normal 模式,参数不匹配就连不上。

解决办法很简单:把 ST-LINK Utility 的连接参数调成和 Keil 一致。具体来说,看看 Keil 的 Debug 设置里用的什么复位模式、什么频率,然后在 ST-LINK Utility 里对应设置。我一般会把 ST-LINK Utility 设成 Connect Under Reset + Hardware Reset + 1MHz,这个组合兼容性最好。

反过来,如果 ST-LINK Utility 能连但 Keil 烧录失败,那问题可能在 Keil 的 Flash 算法配置或者工程设置上,跟 ST-LINK Utility 无关。这时候可以用 ST-LINK Utility 烧一个已知能跑的 hex 文件,确认硬件链路没问题,再去查 Keil 的配置。

7. 从 ST-LINK Utility 迁移到 STM32CubeProgrammer 的注意事项

虽然这篇主要讲 ST-LINK Utility,但现实是 ST 已经主推 STM32CubeProgrammer,新项目和新芯片的支持都在那边。所以最后聊聊迁移的事。

两者的核心逻辑是一样的:连接、烧录、擦除。区别在于 CubeProgrammer 界面更现代,支持更多芯片和更多协议(比如 UART、USB DFU),而且命令行工具更完善,适合集成到自动化流程里。

迁移时最容易出问题的地方是连接配置的默认值不同。CubeProgrammer 默认可能用 Normal 模式,而你在 ST-LINK Utility 里习惯用 Connect Under Reset,换过去之后发现连不上,其实是模式没改。另外 CubeProgrammer 的擦除选项叫 "Full chip erase",位置和 ST-LINK Utility 不一样,第一次用容易找不到。

我的建议是:如果你只是做简单的烧录和擦除,ST-LINK Utility 完全够用,没必要急着换。但如果你要用到 OTA 升级、批量烧录、或者新出的 STM32 系列,那就尽早熟悉 CubeProgrammer。两者可以共存,装在不同目录就行,驱动是共用的。

提示:CubeProgrammer 的命令行版本(STM32_Programmer_CLI)非常适合做批量烧录脚本,支持 -c 连接、-w 写文件、-e 擦除、-v 校验等参数,配合批处理或者 Shell 脚本能实现一键烧录。这个在产线或者测试环节非常实用。

8. 一些让烧录更稳的个人习惯

聊了这么多操作和排查,最后分享几个我自己养成的习惯,都是踩坑之后总结出来的。

第一,固定一套接线和连接参数。我给自己常用的 ST-LINK 和开发板配了一套固定的杜邦线,长度控制在 15 厘米以内,连接参数固定为 Connect Under Reset + Hardware Reset + 1MHz。这样每次连接的成功率都很稳定,不用每次都试来试去。

第二,烧录前先读一下芯片信息。ST-LINK Utility 连上之后,Target -> Option Bytes 里能看到芯片型号、Flash 大小、读保护状态。花几秒钟确认一下,能避免很多"烧错芯片"的低级错误。我就见过有人把 F103 的程序烧到 F407 上,然后纳闷为什么不跑。

第三,保留一份"已知能跑"的 hex 文件。当你怀疑是硬件问题还是软件问题时,用这份文件烧进去测试。如果它能跑,说明硬件链路没问题,问题在你的程序;如果它也不跑,那就要查硬件了。这个技巧能帮你快速定位问题方向。

第四,读保护芯片单独放。开了读保护的芯片和普通芯片混在一起,很容易在批量烧录时搞混。我一般会把它们分开放,并且贴上标签,处理的时候集中解锁,避免在正常烧录流程中突然遇到连不上而浪费时间。

第五,记录每次报错和解决办法。嵌入式开发遇到的问题往往有重复性,今天遇到的 "No target connected" 可能下个月又遇到。我习惯用一个文本文件记录报错信息、排查过程和最终解决办法,积累下来就是自己的排查手册。这个习惯在带新人的时候特别有用,直接把记录给他们,比口头讲一遍高效得多。

烧录这件事,说简单也简单,说复杂也复杂。简单在于它本质上就是把数据写进 Flash;复杂在于连接链路涉及驱动、硬件、协议、芯片状态多个环节,任何一个环节出问题都会表现为"连不上"或"烧不进"。ST-LINK Utility 作为一个轻量工具,最大的价值就是帮你把这条链路拆开,让你能一段一段地验证。把它的连接、烧录、擦除三个核心功能用熟,再配合一套自己的排查习惯,嵌入式开发里关于"烧录"的绝大多数问题,你都能自己搞定。

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

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

立即咨询