ARTICLE DETAIL

资讯详情

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

ST-Link固件升级后无法检测目标芯片?SWD连接与读保护排查指南

ST-Link固件升级后无法检测目标芯片?SWD连接与读保护排查指南 升级固件这种事放在平时根本不会多想点一下Firmware Update等进度条走完调试器就继续干活了。但偏偏有时候进度条走完厄运就来了——ST-Link 从此不再认目标芯片。错误提示要么是 No target connected要么是 Can not connect to target!甚至干脆直接报 Target not found。标题里那行英文 ST-Link stops detecting target after firmware upgrade我在论坛里见过不下几十次几乎每天都有新人踩进同一个坑。这问题表面上像是调试器坏了实际上多数情况下是升级动作打破了原有环境里的某个平衡。这篇文章我就把整个排查思路完整拆开从硬件连接到驱动工具从读保护到复位电路一步一步说清楚希望能让你在最短时间内重新烧录代码。1. 先搞清楚故障到底出在哪一环1.1 固件升级为什么会引发连锁反应很多人一遇到升级后连不上目标第一反应就是调试器被升级升坏了。我一开始也这么想过但拆开分析后会发现ST-Link 固件升级这件事本身是一个多方联动的操作出问题的环节远不止调试器自己。升级动作发生的时候ST-Link 内部固件被改写同时它和 PC 端的驱动、以及和目标板之间的通信握手逻辑都会被刷新。也就是说升级后调试器等于是带着一套新脾气重新上线。如果此时 PC 上的驱动版本太旧或者 ST-Link Utility 的版本和调试器固件不匹配双方握手就会失败表现就是调试器能被系统识别但连不上目标芯片。另一个非常常见的连锁反应是升级前你能连上目标不代表目标芯片本身是健康的。可能目标程序早就把 SWD 引脚复用成了普通 IO或者芯片早就进入了读保护状态只是因为旧固件的连接逻辑比较宽松才能勉勉强强连上。固件一升级通信时序更严格原来的问题就彻底暴露了。所以排查的第一步不是急着刷固件而是先确认连不上到底发生在哪一层。调试器是否被 PC 识别是否能和 PC 通信目标板是否供电SWD 四根线是否通到了芯片引脚把这个链路分层问题就清晰多了。1.2 先给故障分个类别一上来就乱试按照我自己的经验升级后无法检测目标大概可以归成三类。第一类是调试器自身出问题比如升级过程 USB 被拔掉、断电导致固件写入不完整这时候调试器在设备管理器里可能变成未知设备或者干脆没有任何反应。第二类是 PC 端环境出问题驱动没匹配上、ST-Link Utility 版本太老、或者换了个 USB 口之后供电不足。第三类是目标板侧出问题SWD 接线断开、目标板没上电、芯片进了读保护、复位电路异常这些都会被升级这个动作点燃。这三大类要怎么快速区分我习惯的做法是先插上 ST-Link打开设备管理器看端口和 USB 设备。如果能看到 STMicroelectronics STLink Virtual COM Port 和 STMicroelectronics STLink dongle 这类条目说明调试器和 PC 的通信链路是好的问题大概率出在目标板或工具链版本上。如果设备管理器里压根找不到 ST-Link或者设备名前带黄色感叹号那就要先处理驱动和调试器固件本身。把这一步做完排查范围瞬间缩小一半。2. 硬件连接排查SWD 四根线才是命根子2.1 升级之后最先要检查的是线不是软件我知道这话听起来太基础了但请你信我我处理过至少二十个升级后连不上的案例其中有三四个都是因为线的问题。升级前调试器一直插着没动升级完可能为了测别的板子把线拔了重新插结果没插紧或者插歪了一排引脚然后怎么折腾软件都没用。SWD 调试只需要四根线SWDIO、SWCLK、VCC 和 GND。SWDIO 就是数据线对应芯片上的 PA13SWCLK 是时钟线对应 PA14VCC 不是给目标板供电的而是用来检测目标板电平的参考电压GND 就是共地线。换句话说ST-Link 通过 VCC 感知目标板的工作电压然后自动调整 IO 电平标准。如果 VCC 没接ST-Link 就不知道目标板电压是多少自然无法建立稳定通信。这个设计有点像两个人打电话GND 是电话线VCC 是告诉对方我这边是 3.3V 还是 5V的语音提示缺了它两边各说各话。检查的时候用万用表二极管档从 ST-Link 的 20Pin 座子逐针测到目标板排针是最稳妥的。不需要下电直接在连接状态下测通断即可重点确认 SWDIO、SWCLK、VCC、GND 四路没有虚焊、没有氧化、没有断路。插针氧化导致接触不良这种问题在潮湿环境里尤其常见拔插几次后氧化层被磨掉故障自己就消失了——这种情况我也确实遇过。2.2 20Pin 座子上的 SWDIO、SWCLK、VCC、GND 到底在哪ST-Link V2 那个 2.54mm 间距的 20Pin 座子是新手最容易搞混的。虽然市面上很多 ST-Link 外壳上会印有引脚名称但字通常很小而且不同克隆版本的丝印位置还不一样。我用的 ST-Link V2 标准定义是这样的Pin1 是 VCC也叫 VAPPPin2 是 SWDIOPin4 是 SWCLKPin3、Pin5 等都是 GNDPin10 是 NRST。也就是说四根线对应的针脚分别是 1、2、4 和任意一个 GND。注意我说的是 ST 官方定义的排布。市面上一些非官方版本的 ST-Link V2引脚顺序不一定完全一致尤其是那种只引出 4Pin 或 6Pin 的转接小板丝印更不可靠。最靠谱的做法是拿万用表蜂鸣档一支表笔点在目标板排针的 VCC 上另一支去扫 20Pin 座子的各个针脚响了那个就是 VCC。这个习惯值得养成毕竟烧一次板子比多花五分钟测线贵多了。还有一个容易被忽略的细节20Pin 座子上的 Pin7 是缺针的也就是 KEY 防呆位用来帮助你确认方向。你只要找到这个缺针的一侧整个座子的方向就有了参照插线时就不会把 SWDIO 和 SWCLK 搞反。2.3 线序、接触不良和电压不匹配的坑SWD 线序接反也是升级后连接失败的常见原因。很多人的调试线是自己压的杜邦线颜色还不统一插的时候全凭感觉。如果 SWDIO 和 SWCLK 对调了ST-Link 完全无法和芯片握手如果 VCC 接到了 GND 上轻则连接失败重则可能把调试器或者目标板的电平检测电路烧坏。所以每次接线后我习惯先目视确认一下颜色顺序再上电测试。虽然老手常说SWD 就四根线怎么会错但我见过把 SWCLK 接到 GND 上导致 MCU 复位的奇葩案例。电压不匹配的问题在升级后也容易暴露。ST-Link 的 VCC 脚只检测电平不输出功率目标板必须自己供电。有些开发板上的 VCC 排针和板载 LDO 输出连在一起如果这个 LDO 有问题输出只有 1.8V 甚至更低ST-Link 检测到电压异常时会直接拒绝连接。所以排查时最好量一下目标板排针上的电压是不是真正达到了标称的 3.3V 或 5V。要是目标板通过 USB 供电换一个供电口或者外接稳压电源往往就能解决。3. 驱动与工具链升级的不只是调试器固件3.1 设备管理器是你最该先看的体检报告每次有人跟我说 ST-Link 连不上目标我的第一个问题永远是设备管理器里 ST-Link 是什么状态。这一步能排除大量无效操作。在 Windows 上插上 ST-Link 后打开设备管理器展开通用串行总线设备和端口两个分类正常情况应该看到 STMicroelectronics STLink dongle 和 STMicroelectronics STLink Virtual COM Port。如果这两个条目都在且没有黄色感叹号说明驱动没问题调试器本体也没坏问题集中在工具链版本和目标板上。如果设备管理器显示 STM32 ST-Link 或者其他带感叹号的未知设备驱动的兼容性就要打问号了。尤其是老版本的 ST-Link 驱动碰上新版本的固件经常出现枚举失败。解决办法很直接去 ST 官网下载最新的 ST-Link 驱动安装包覆盖安装。装完之后重启一下电脑再插一次调试器Windows 会重新枚举设备。这一步操作门槛极低但确实能救回不少调试器。有些特别老的 ST-Link V1 克隆版在升级固件后可能不再被新版驱动识别。设备管理器里显示的不是 STLink 设备而是 USB Serial 之类的东西这种情况基本上可以判断是克隆版固件不兼容。没别的办法只能找一个旧版本的驱动或旧版本的 ST-Link Utility 试试或者干脆换一个官方版调试器。3.2 ST-Link Utility 的版本要和固件匹配ST-Link 固件升级通常是通过 ST-Link Utility 或 STM32CubeProgrammer 的 Firmware Upgrade 功能做的。但你升级完固件之后如果继续用旧版的 ST-Link Utility 去连接目标很可能会遇到版本不兼容的报错。老版本的 Utility 不认识新固件的通信协议自然无法正常发起连接。解决方法就是把工具软件也一起升到最新版。ST 官网现在主推的是 STM32CubeProgrammer它已经把调试、烧录、固件升级、选项字节操作全部集成在一起了。老款的 ST-Link Utility 还在维护但功能更新基本停了。我在实际工作中已经全面切到 STM32CubeProgrammer连接选择 ST-LINK然后点 Connect如果固件版本和工具版本不匹配软件会弹窗提示你升级固件或者切换连接模式。这里有个细节STM32CubeProgrammer 连接前会先读一次芯片 ID如果芯片处于读保护状态它可能会卡在读取阶段。这时候需要在设置里把 Mode 改成 Hot Plug 或 Connect Under Reset。3.3 固件能不能降级这是个现实问题很多人排查到最后发现是固件本身的问题就想把 ST-Link 固件降回旧版本。ST-Link 的固件升级机制老实说对降级并不友好。官方工具只在特定条件下允许降级尤其是 ST-Link/V2 的老批次一旦升到新版固件想刷回旧版本非常困难。ST-Link/V3 则更严格官方基本堵死了降级通道。但不能降级不等于无解。如果新固件让你无法连接某些旧型号芯片可以先检查是不是连接参数变了。比如 STM32F1 系列芯片新版固件默认的 SWD 频率可能更高某些板子上的线质量撑不住高速率导致连接失败。解决办法是在 STM32CubeProgrammer 里把 SWD 频率往低调从 4MHz 降到 1.8MHz 甚至 480kHz很多顽固的连接问题就这么消失了。这个技巧在升级后尤其管用因为新固件往往提高了默认连接速率而你的硬件环境还停留在旧时代的水平。4. 目标芯片状态读保护是最大的隐形杀手4.1 读保护RDP为什么会挡在连接之前在我处理的升级后连接失败案例里读保护排得上号。STM32 的读保护RDP分等级 0、1、2。默认是等级 0完全开放。等级 1 下调试器无法通过 SWD 接口读取 Flash 和 SRAM连接时表现就是找不到目标芯片或者连接超时。等级 2 就是永久锁死任何调试手段都无法解除芯片基本只能扔了。问题在于很多旧项目在出厂之前会故意把 RDP 等级设成 1防止别人读出固件。升级固件之前可能因为调试器旧固件兼容性好还能连上升级后严格校验立刻露馅。还有一种情况是目标程序自己写入选项字节把读保护开启了只是你并不知道。要确认是不是这个原因可以把目标板断电然后按住复位键再点连接有时候能读到芯片信息但提示读保护已启用。ST-Link Utility 对这种状态有专门提示会弹出一个对话框告诉你 RDP 等级和解除方式。RDP 等级 1 的解除其实不复杂但代价是整片 Flash 会被擦除。如果你不是在做逆向或者破解别人固件而是自己开发调试那就无所谓直接解除就行。4.2 用 ST-Link Utility 解除读保护的标准操作以 STM32CubeProgrammer 为例连接失败时可以试试 Connect Under Reset 模式这个模式下调试器会先拉低复位脚再尝试连接能绕过大部分 SWD 复用和读保护的障碍。连上之后如果提示 RDP Level 1软件会有选择项让你将 RDP 切回 Level 0。确认执行后工具会自动对芯片做一次 Mass Erase全片擦除把读保护和 Flash 内容一起清掉。如果是老款的 ST-Link Utility操作路径在 Target - Option Bytes找到 RDP 那一栏把 Level 1 改成 Level 0软件会提示擦除芯片确认即可。整个过程大概十几秒。解除之后如果还是连不上就得看复位电路了。这里我要特别提醒一下升级固件后出现读保护提示不代表是升级本身开启的很可能是芯片原本就处于保护状态只是之前你一直用旧环境没暴露。所以判断这类问题的时候不要纠结于为什么升级前能连而要接受现实直接解除保护继续干活。数据被擦掉固然难受但总比调试器彻底废掉强。4.3 复位电路与 Boot 模式对连接的影响很多人在这一环节会卡很久。芯片本身的复位电路设计不规范比如复位引脚上的电容用得太大导致复位脚电平慢半拍某些固件版本的 ST-Link 在 Connect Under Reset 时反而连不上。我把这个过程理解成调试器想按住芯片的脑袋结果芯片脑袋上垫了块厚海绵按下去还没到底就把手松开了。排查复位电路最快的方法是找一根杜邦线一头接 ST-Link 的 NRST 引脚另一头接到目标板复位脚。如果是 20Pin 座子用 Pin10如果是单独的 4Pin 排针通常也会单独引出一个 NRST。连接好之后在工具里选 Connect Under Reset 模式很多疑难杂症就消失了。这个方法不只是排查日常给只跑了正常程序的芯片烧录时也建议直接用能避免大量的无法连接报错。Boot 模式也是隐藏变量。STM32 的 BOOT0 引脚电平决定芯片从 Flash 启动还是从系统存储器启动。如果目标程序把 SWD 引脚完全占用BOOT0 拉高就能让芯片从系统存储器启动绕开用户程序这时候 SWD 连接往往就恢复正常了。很多开发板上 BOOT0 有跳线拨到 1 的位置再上电然后连接调试器十有八九能连上。这个方法配合读保护解除基本上能解决所有软件层面的连接问题。5. 完整的修复流程照着做就行5.1 第一步先确认 ST-Link 自身是否健康不要急着接目标板。先把 ST-Link 单独插到电脑上打开 STM32CubeProgrammer 或者 ST-Link Utility 的固件升级界面。如果软件能正常识别到调试器并显示当前固件版本说明调试器本体是完好的。如果软件提示 ST-Link is busy 或者根本没有设备那就是调试器固件刷写中断导致半砖状态。这时候先重新拔插 USB换一个 USB 口不要通过 USB Hub直接插主板后面的口。还不行的话给 ST-Link 断电十分钟再试有些临时性的固件异常状态能自己恢复。如果你的 ST-Link 支持固件恢复模式通常在 PCB 上有个焊盘或者按钮短接后插入 USB 会进入 DFU 模式设备管理器里会出现一个叫 STM32 BOOTLOADER 的设备。这时重新打开固件升级工具就能刷回完整的固件。克隆版 ST-Link 不一定有这个功能那我只能建议直接换硬件毕竟折腾一个半砖调试器的时间成本够你写完一个模块了。5.2 第二步最小化硬件连接排除一切干扰确认调试器健康后把目标板的外围电路尽量摘掉。不需要断开所有外设但至少要确保 SWD 四根线直接从 ST-Link 引到目标芯片的引脚中间不要接转接板、不要用长杜邦线飞线。如果目标板上有板载调试器比如 NUCLEO 板上的 ST-Link注意跳线帽有没有拆掉有时板载和外接调试器会互相干扰。实测下来线长超过 20 厘米时SWD 信号质量会明显下降尤其当 SWCLK 频率超过 1MHz 时长线就是天然的低通滤波器上升沿变缓芯片采不到有效时钟。解决方案是把频率调低或者换更短更粗的线。目标板电源方面确保 VCC 引脚上的电压稳定在目标芯片工作范围内。以 STM32F103 为例3.3V 供电如果量到只有 2.8V芯片本身可能都处于欠压复位状态连接自然失败。5.3 第三步软件侧的三板斧硬件和电压都没问题的话软件侧按顺序做三件事。第一件把 STM32CubeProgrammer 更新到最新版打开后配置连接参数接口选 SWD速率先选最低的档位Frequency 设置为 1.8MHz 或 480kHz。第二件Mode 选项试试 Normal、Hot Plug 和 Connect Under Reset 三种模式每换一种就点一次 Connect。第三件如果还是失败把目标板断电按住目标板的复位键不放然后点 Connect等软件开始连接时再松开复位键这算手动版的 Connect Under Reset。这三板斧看着简单但能解决大约七成的问题。它们的核心思想是降低通信速率避开芯片当前运行状态可能造成的干扰利用复位时序强行建立通信握手。不要嫌麻烦调试的过程就是不断试错排除的过程。5.4 第四步读保护解除的标准操作流程如果第二、三步都不行就要考虑读保护了。在 STM32CubeProgrammer 中切换到 Option Bytes 标签页查看 RDP 等级。如果显示 Level 1直接在界面上把 RDP 设置从 1 改为 0然后点击 Apply。工具会弹出一个警告框提示这条操作会擦除整个 Flash确认后等待完成即可。擦除完成后软件会重新连接芯片这时就能看到正常的芯片 ID 和 Flash 大小。这里有个容易翻车的点如果芯片的 RDP 等级已经到了 Level 2那么任何调试接口操作都会被拒绝连解除的入口都没有。这种芯片俗称锁死。如果你手头有可以临时替代的芯片建议直接换。千万别想着用什么特殊手段去破解不仅成功率低还会踩到硬件安全边界不说连官方都不支持。最好的预防方式是在量产固件里只用 Level 1或者干脆出厂时留出调试接口。5.5 第五步固件重刷与最终验证读保护解除后重新用 STM32CubeProgrammer 下载用户程序。下载前可以先做一次 Full Chip Erase确保 Flash 是干净状态。然后用标准速率 4MHz 连接如果还失败再降回低速率。成功擦除、烧录、校验之后把 BOOT0 跳线恢复到 0目标板断电再上电程序应该能正常运行。最后再做一次回归测试拔掉 ST-Link重新插上确认连接依然正常。为什么要做这一步因为有些板子上的电源和地接触不良调试器插着的时候能通过 VCC 反馈勉强稳定电平拔掉之后再插就不行了。这一步能帮你提前发现接触不良问题免得下次出问题又花半天找原因。6. 常见问题速查表与我的避坑经验现象可能原因解决思路设备管理器找不到 ST-LinkUSB 枚举失败、固件刷写中断换 USB 口重新插拔尝试 DFU 恢复设备管理器显示未知设备带感叹号驱动不匹配重新安装最新 ST-Link 驱动重启电脑工具提示 No target connectedSWD 接线错误、目标板没供电用万用表量线序和电压确认 SWDIO、SWCLK、VCC、GND工具提示 Target not found 但硬件看似正常读保护、SWD 引脚被复用、复位异常用 Connect Under Reset 模式尝试解除 RDP连接成功但烧录中途失败速率太高、线太长、目标板供电不稳降低 SWD 速率换短线外接稳定电源升级固件后旧工程连不上新固件通信时序更严格升级 STM32CubeProgrammer调低连接频率排查流程全走下来我还有一个自己的习惯准备一根专门的、只用于 SWD 连接的短杜邦线束四根线用红、黄、绿、黑四种颜色区分红色 VCC黄色 SWDIO绿色 SWCLK黑色 GND并且用热缩管把四个端子固定成一体。这样每次接线不会乱排查时一眼就知道哪根线对应哪个信号省掉了大量无效时间。另外一个小技巧在给板子烧录任何可能会把 SWD 引脚禁用的测试程序之前先确保你手头有一个能进入 Connect Under Reset 模式的工具链。这个动作能避免自己把自己锁在门外。而且如果做产品量产建议在出厂前把 RDP 等级调到 Level 1但对仍在开发调试阶段的板子保持 Level 0 就好别过早保护否则每次连接都可能自找麻烦。我个人在来回踩过这些坑之后最大的感悟是ST-Link 升级后连接失败百分之八十不是调试器坏了而是我们对调试环境的理解太乐观。固件升级不可怕可怕的是升级后没人提醒你重新审视整个链路。从硬件接线到驱动版本从目标芯片保护状态到复位时序每一环节都可能藏雷。按着这篇文章里的顺序一步步排查大多数问题都能在半小时内定位并解决。下次再遇到 ST-Link stops detecting target after firmware upgrade先深呼吸然后从 20Pin 座子上的四根线查起吧。
返回列表