做嵌入式开发的朋友应该都见过这个场景:手里的 ST-Link/V2 调试器用得好好的,某天打开 ST 官方升级工具 STLinkUpgrade,想看看有没有新固件,结果界面弹出来,Upgrade按钮是灰色的,怎么点都没反应。更让人纳闷的是,设备明明已经连接到电脑,驱动也装过,甚至之前还升级成功过,这一次突然就置灰了。
这个问题的本质不复杂,但坑点极多。我前前后后在各种环境里踩过不同类型的原因,有的 30 秒解决,有的折腾了一下午。这篇文章就把我遇到过的所有“Upgrade 按钮置灰”的情况做一个完整梳理,从工具判定逻辑到驱动问题、版本比对机制、连接状态、山寨硬件、供电与线材,逐层拆开讲,尽量让每个人都能照着自己的情况快速定位。
1. 按钮置灰的本质:STLinkUpgrade 的升级判定逻辑
先搞清楚一个基本问题:STLinkUpgrade 到底在什么条件下才允许你点Upgrade?
这款工具的全称是 ST-Link Upgrade(官方固件升级工具,配套软件包编号 STSW-LINK007),主要用来给 ST-Link、ST-Link/V2、ST-Link/V3 以及开发板板载的 ST-Link 调试器升级固件。它不是一个常驻软件,打开就是一个很简洁的窗口:上面显示当前连接的设备信息,中间是Current Version和Upgradable Version两个版本号,下面一个Upgrade按钮,一个Refresh按钮。
当你看到按钮置灰的时候,说明当前界面状态下,工具判定“没有可以执行升级的条件”。这个判定不是单一条件,而是多层叠加。
1.1 灰色按钮背后的三层判定
我把它的逻辑拆成三层,方便理解:
第一层是设备枚举层。STLinkUpgrade 打开时通过 USB 枚举来寻找 ST-Link。如果系统里根本没有被正确识别的 ST-Link 设备,界面会显示 “No ST-Link detected”,此时Upgrade和Refresh之外的按钮基本全是灰色。这一层最常出问题的不是设备坏了,而是驱动没装好,或者设备被其他进程占用。
第二层是版本比对层。工具成功识别设备后,会读取设备当前的固件版本号,然后与内置/在线获取的最新版本号做比较。如果当前版本已经等于或高于最新版本,按钮同样置灰。这一层是设计使然,说明"不需要升级"。
第三层是设备模式层。ST-Link 在做固件升级时,需要切到 DFU(Device Firmware Upgrade)模式。如果设备还停留在正常的调试模式(比如正被 Keil、IAR、STM32CubeIDE 占用着 SWD 口),工具无法获得独占访问权,也会表现为按钮不可点。
这三层任何一个环节不满足,最终呈现的都是同一个现象:Upgrade灰色。所以排查时候不要只盯着一个原因看,从上到下逐层过一遍,反而是最快的。
1.2 版本号显示里藏着关键信息
STLinkUpgrade 窗口里有两行版本号,这两行信息是判断问题在哪一层的最直接依据。
Current Version: 当前 ST-Link 固件版本,比如V2.J40.M28。其中V2是硬件版本(V2 对应 ST-Link/V2,V3 对应 ST-Link/V3),J40是固件主版本号,M28通常是附加信息。Upgradable Version: 工具获取到的可用升级版本。如果这里显示Up To Date,说明已经是最新版本,按钮灰色是正常的,不用再折腾。
如果你的窗口里Current Version根本读不出来(显示Unknown或者空),那问题基本在驱动层或者设备层;如果能读出Current Version,而Upgradable Version也有具体版本号,按钮还是灰的,就要怀疑设备模式层的问题。
2. 驱动识别异常:我见过最多的置灰原因
先说结论:在我经手的置灰案例里,驱动识别异常占了至少一半。
ST-Link 的驱动比较特殊,它不是一个普通的串口驱动或者 HID 驱动,而是 ST 自定义的 USB 驱动。正常安装之后,设备管理器里会看到 “ST-Link Debug” 或者 “STM32 STLink dongle” 这类设备名。但很多情况下,你在设备管理器里看到的可能是带黄色感叹号的 “Unknown Device” 或者 “USB Serial Converter”,甚至干脆没有反应。
2.1 为什么驱动会莫名丢失或异常
驱动丢失的情况通常发生在几个场景:
- 电脑换了 USB 口,尤其是从 USB 2.0 换到 USB 3.0 或者反过来,Windows 有时会重新枚举设备,如果驱动签名缓存有问题,就会识别异常。
- 系统更新了大版本(比如 Win10 升 Win11,或者 Win11 的某个大补丁),USB 设备驱动缓存被重置。
- 之前装过 STM32CubeProgrammer、Keil 等工具,这些工具自带旧版 ST-Link 驱动,新老驱动相互覆盖,导致版本混乱。
- 使用了一些“驱动管理软件”自动更新驱动,结果把 ST 自定义驱动替换成了微软的通用串口驱动。
2.2 正确的卸载重装姿势
这个问题最有效的解决方式是干净地重装驱动,而不是反复“更新驱动”。
先打开设备管理器,找到异常设备(名字里带感叹号,或者叫 Unknown Device),右键卸载设备。注意,卸载时勾选“删除此设备的驱动程序软件”,这一步很关键,否则 Windows 会保留旧的驱动缓存,下次插入时又自动装上错误版本。
卸载完成后,先别急着重装,去 ST 官网下载最新的 ST-Link 驱动安装包,软件包编号是STSW-LINK009。这个包体积不大,解压后是一个dpinst_amd64.exe(64 位系统)或dpinst_x86.exe(32 位系统)的安装程序,右键管理员身份运行即可。
装完之后,把 ST-Link 拔掉重新插入,看设备管理器里是否出现正常的 “ST-Link Debug” 设备名。这一步不要跳过,因为驱动安装程序完成了,不代表系统一定正确加载了。
2.3 装完驱动的确认方法
设备管理器里看到 “ST-Link Debug” 只能说明驱动加载成功,但不能说明 STLinkUpgrade 一定能识别。还有一个更直接的确认方法:打开 STLinkUpgrade,看窗口顶部会不会显示设备序列号。
如果能显示序列号和当前版本,说明驱动层和枚举层都通过了。如果设备管理器正常但这里显示No ST-Link detected,多半是设备被其他进程占用,或者 USB 枚举不稳定,拔插一次再试。
我自己的习惯是重装驱动后必做两件事:一是拔插一次 USB,二是打开 STM32CubeProgrammer 的固件升级界面看一眼(这个工具也内置了升级功能),双保险确认驱动链路通了再回来用 STLinkUpgrade。
3. 固件版本比对机制:新固件反而点不了的情况
驱动没问题,设备也能识别,但Upgrade依然灰色,这时候该看版本号区域了。
STLinkUpgrade 的版本比对逻辑:工具启动后,会从两个来源获取版本信息——设备本身的当前固件版本,以及 ST 服务器上的最新固件版本。当工具判定Current Version >= Upgradable Version时,Upgrade按钮就是灰色的。
3.1 工具如何拿到两个版本号
“Upgradable Version” 的获取方式在不同的 STLinkUpgrade 版本里不一样。早期版本是把已知的最新版本号写死在程序里;新版工具则会联网从 ST 服务器拉取。这意味着一个很实际的问题:如果电脑网络无法访问 ST 的更新服务器,可能拉不到最新版本信息,导致比对失败,按钮置灰。
在国内网络环境下,偶尔会遇到访问 ST 服务器响应慢或者失败的情况。如果你发现Upgradable Version区域是空的、显示Unknown或者一直转圈,可以先检查网络,或者换个网络环境试试。
顺带说一句,ST 官方服务器偶尔也会因为负载高而响应慢,但这通常不会持续太久。网络波动导致的“拉不到版本”一般过一阵子自己就好了,不必反复重装驱动。
3.2 当前版本高于在线版本的怪现象
还有一种比较少见的场景:Current Version显示的版本号比Upgradable Version还高。这种情况多见于使用非官方渠道获取的固件包手动刷过 ST-Link,或者你的 ST-Link 是较新出厂批次,自带固件版本高于工具内置的“已知最新版本”。
这种情况下按钮置灰是正常的,它代表“没有比你更新的版本”。不用担心,也不建议强行刷低版本,官方工具本来就不支持降级,硬刷反而可能弄坏设备。
3.3 版本号显示异常的处理思路
如果Current Version显示Unknown,但设备管理器里设备正常,这说明工具能枚举到设备,但无法通过 USB 正确读取固件版本号。这种情况我会优先尝试下面几步:
- 拔掉 ST-Link,完全退出 STLinkUpgrade,重新插上再打开工具。
- 换一个 USB 口,尤其是从 USB Hub 换到主板直出接口。
- 如果设备是板载 ST-Link(比如 NUCLEO、DISCOVERY 开发板),确认板子跳线有没有被改过,部分板子的 ST-Link 部分可以通过跳线断开与目标 MCU 的连接,跳线设置不对会影响固件读取。
以上都试过还是Unknown,再考虑刷驱动或者换一台电脑交叉测试——如果换电脑能正常读出版本,那问题大概率在系统 USB 环境上;如果换电脑也一样,那设备本身的状态就要打个问号了。
4. 连接状态与升级模式:USB 枚举只是第一步
我见过不少朋友卡在这一层,特征很典型:设备管理器正常,STLinkUpgrade 能识别设备,显示当前版本号,Upgrade按钮依然是灰色。
这就涉及前面提到的第三层判定:设备模式。ST-Link 在正常调试模式下,USB 接口是一个复合设备,除了调试口还有虚拟串口(VCP),但 STLinkUpgrade 进行固件升级时,需要把设备切到 DFU 模式。如果设备处于调试模式且被其他软件占用,升级工具就无法获得独占访问权。
4.1 为什么需要进入 bootloader 状态
打个比方:ST-Link 正常运行的时候,固件就像一套完整的操作系统,负责处理调试协议。升级固件时,你需要先把这套系统停下来,然后让设备进入一个最简化的引导程序——也就是 bootloader(对应 DFU 模式),由它来接收新固件并写入 Flash。
STLinkUpgrade 点击Upgrade后,本身会尝试把设备切到 DFU 模式,但这个切换动作需要设备处于“空闲”状态。如果此时 Keil、IAR、STM32CubeIDE 正占用着这个 ST-Link 做调试,或者后台有程序在读写目标芯片,切换就会失败,反映到界面上就是按钮不可点。
4.2 ST-Link 与目标板连接异常的影响
另一个容易忽略的点是:ST-Link 通过排线和目标板连接时,如果目标板供电异常(比如目标板没上电、SWD 接口的复位引脚没接对),部分型号的 ST-Link 在自我检测阶段会卡住,导致无法正常响应升级工具。
这种情况在独立版 ST-Link/V2 上尤其常见。解决方法是:升级前把 ST-Link 和目标板断开,只保留 ST-Link 和电脑之间的 USB 连接,让 ST-Link 处于“空载”状态。板载 ST-Link 则不需要断开目标 MCU,因为硬件上已经隔离好了,但最好把 IDE 的调试会话关掉。
4.3 操作时序:先插线还是先开软件
操作顺序看着简单,但确实会影响结果。我试过几种方式,最稳定的是这样:
- 完全关闭所有可能占用 ST-Link 的软件(Keil、IAR、STM32CubeIDE、串口助手等)。
- 把 ST-Link 插到电脑 USB 口,等待系统完成设备枚举(设备管理器里出现设备,或者听到 USB 插入提示音)。
- 等待 2-3 秒,再打开 STLinkUpgrade。
- 点击
Refresh按钮,观察设备信息是否正常加载。
如果按照这个顺序操作依然置灰,再试一招:拔掉 USB,按住 ST-Link 的复位键(部分 ST-Link/V2 有实体按键)不放,插入 USB,保持 2 秒后松开复位键,再打开 STLinkUpgrade。这个操作能强制设备以 bootloader 状态枚举,通常能解决工具在切换模式时的卡顿问题。
5. 冷门但真实存在的坑:山寨、多实例与供电
如果上面四层都排查过了,按钮还是灰色,那就要看看这些更“隐蔽”的原因了。它们不常见,但一旦碰到,会浪费大量时间,因为表现和普通置灰完全一样。
5.1 克隆 ST-Link 与正品的差异
市面上的 ST-Link/V2 有大量克隆版,价格只有正品的几分之一。这些克隆版用的方案各不相同:有的是用 STM32F103C8 直接模拟,有的是用剪脚原装芯片,有的甚至用的是专用 ASIC。多数克隆版在正常调试场景下能正常工作,但在 STLinkUpgrade 里表现就参差不齐了。
有些克隆版可以正常升级,有些则永远点不了Upgrade——因为 ST 官方工具会校验设备的身份信息,克隆设备要么无法返回正确的 ID,要么固件版本被固化伪装成老版本,导致工具判定设备不符合升级条件。
怎么判断是不是克隆版?看两点:一是价格(明显低于市场价的要留心),二是看 STLinkUpgrade 里读出来的版本号——如果显示V2.J24这种非常老的版本,但又声称是“全新原装”,基本可以断定是克隆版。这类设备我建议不要强行升级,能用就行,因为升级失败的概率极高,变砖后没有恢复手段。
5.2 多进程占用和系统兼容
新版 STLinkUpgrade 对设备的访问是独占的。有些后台程序不会在任务栏显示,但默默占用了 ST-Link 的 USB 接口。常见的有:各种串口监视工具、RGB 外设控制软件(部分软件会扫描所有 USB 设备)、杀毒软件的外设隔离功能。
排查方式很简单:打开任务管理器,把明显和开发相关的进程关掉,尤其是 Java、Python 脚本里调用了 pyserial 或者 pyusb 的进程。如果实在找不到占用者,可以试着重启电脑然后第一时间打开 STLinkUpgrade——这时候系统最“干净”,如果按钮可点了,那就逐个启动其他软件排查是谁抢占了设备。
系统兼容性方面,老版本 STLinkUpgrade 在 Win11 上偶尔会出现界面显示异常或按钮点击无响应的问题。如果你用的是很老的版本(比如 2016 年之前的),建议直接从 ST 官网下载最新版STSW-LINK007,换新版工具后再试。新版对 Win10/Win11 的兼容性好得多,界面也有变化。
5.3 USB 供电不足与线材问题
最后一个容易被忽视的坑是供电和线材。
ST-Link/V2 正常工作电流不高,但如果通过前置 USB Hub 或者质量很差的延长线连接,可能会因为线路压降导致设备供电不稳。供电不稳的早期表现就是 USB 设备间歇性识别、STLinkUpgrade 里版本号时有时无、Refresh之后按钮状态变化异常。
我的建议很直接:升级固件这种关键操作,直接把 ST-Link 插到电脑主板的 USB 口上,不要经过任何 Hub 和延长线。如果你非要用延长线,选短线、粗线、带屏蔽的。这里要特别说一下:有些 USB 线只支持充电不支持数据传输,插上去设备管理器有反应但永远无法完成枚举,这种线材问题排查起来非常折磨人。
另外,笔记本用户要注意:部分笔记本在电池供电模式下会对 USB 口做限流,外设多的时候可能出现供电不足。如果 ST-Link 在插电模式下能正常识别、拔电源后置灰,这就是供电策略导致的,把电源插上就能解决,不用怀疑设备坏了。
6. 我的固定排查流程和最后的经验总结
踩了这么多次坑之后,我总结出一套固定的排查顺序,遇到Upgrade置灰直接照着走,一般能在 10 分钟内定位问题。分享出来供参考:
- 关掉所有 IDE 和调试工具,确认没有进程占用 ST-Link。
- 换一根确认能传输数据的 USB 线,插到主板直出的 USB 口。
- 打开 STLinkUpgrade,点
Refresh,看能不能识别设备。 - 设备管理器检查设备状态,有异常就卸载重装 STSW-LINK009 驱动。
- 看版本号区域,是不是
Up To Date,是的话就不用折腾了。 - 以上都不行,换个电脑交叉测试,排除设备自身故障。
另外想提醒一个心态问题:ST-Link 固件不是越新越好,能用就别折腾。如果你的 ST-Link 现在调试正常,只是手痒想升级,结果发现按钮置灰,那大概率是“你已经是最新版”而已。这种情况下完全不用管它,继续用就行。
如果确实需要升级但按钮怎么都点不了,而且你的设备又比较老旧,可以试一下 STM32CubeProgrammer 自带的固件升级功能——路径在Help菜单下的Firmware upgrades选项,它处理问题的逻辑和 STLinkUpgrade 略有不同,有时候能救回一些 STLinkUpgrade 识别不了的设备。
我之前遇到过一台老的 ST-Link/V2,STLinkUpgrade 里怎么都点不了升级,换用 STM32CubeProgrammer 却成功升级了。所以这个备用方案值得记在笔记里,说不定哪天就帮上忙了。