
做嵌入式的朋友十有八九都见过这条红得刺眼的报错SWD/JTAG Communication Failure。要是再配上ST-Link点不下连接手边那块STM32F10x八成已经被你写成了“锁死”状态。别急着扔板子也别急着换MCU——绝大多数锁死都是软故障芯片本身好好的只是调试通道被堵死了而已。这篇文章就是专门来讲怎么用ST-Link把这类芯片救回来的。我从硬件接线、驱动安装、ST-LINK Utility连接设置到读保护解除、全片擦除、重新烧录把整套流程捋一遍后面还附了一份SWD/JTAG Communication Failure的排查手册。不管你是刚入坑的新手还是已经被锁死折磨过一两回的“老倒霉蛋”按这个思路走一遍大概率能把芯片从砖头状态拉回正常。如果你正好手里有一块连不上ST-Link、点啥都没反应的STM32F10x那就直接往下看。把手上ST-Link插好我们一步步来。1. 先搞清楚芯片“锁死”到底是怎么回事1.1 锁死的本质不是芯片坏了是调试通道被堵了很多人一听到“锁死”两个字第一反应是芯片烧毁了、板子报废了。其实绝大多数情况下STM32F10x的FLASH和内核都毫发无损真正锁死的是调试访问通道。咱们平时烧录、看变量、仿真靠的是芯片内部的调试访问端口DAP这个模块通过调试接口和外部工具通信。只要供电正常、调试接口没有被彻底禁用DAP就还在工作也就是说理论上有机会强制“喊醒”它。锁死最常见的原因就是读保护也就是RDP选项字节被修改了。STM32的选项字节里有几个专门控制读写保护的位一旦RDP级别被从Level 0改成Level 1调试接口再去访问FLASH就会被拒绝ST-Link连上来直接被挡在门外于是你只能看到SWD/JTAG Communication Failure。这种状态在用户看来就是“芯片不认人了”但它和硬件损坏完全是两回事。再往外扩展一点锁死的本质可以理解成芯片内部的调试接口还在但它前置了一个“门禁”这个门禁可能是读保护、可能是引脚复用、也可能是程序死循环导致总线异常。救砖思路的核心本质上就是想尽办法绕过或关掉这个门禁重新把调试通道打通。理解了这一层后面所有的操作就都有逻辑了。1.2 三种最常见的锁死场景我根据自己遇到过的案例和社群里的高频提问整理了三种最常见的锁死场景你可以对照一下自己属于哪一种。第一种是读保护被打开。很多人在烧录配置里勾选了“编程后设置读保护”或者程序里调用了类似Flash_ReadOutProtection的库函数芯片重启后RDP变成Level 1。表现就是能正常跑程序但ST-Link再也连不进去报SWD/JTAG Communication Failure。这种是最好救的解除方法就是擦除整个FLASH。第二种是SWD引脚被复用了。STM32F10x的SWDIO和SWCLK默认就是PA13和PA14如果你在程序里把这俩引脚配置成了普通GPIO甚至把SWJ调试接口完全关闭代码一跑起来调试口就没了。表现是刚烧完能连上一复位就跑飞再点连接就失败。这种也好救因为调试口只是被程序“占住”了只要让芯片不执行那段程序就行。第三种是时钟配置出问题。很多人玩F103的时候喜欢超频或者把外部晶振倍频参数配到了芯片不支持的范围比如HSE没焊接却偏偏选择了外部时钟启动芯片上电后CPU一直卡在等待时钟就绪的死循环里连主循环都没跑到。这种情况下SWD连接有时会失败有时能连上但状态很怪。1.3 为什么救砖首选SWD而不是JTAGSTM32F10x同时支持SWD和JTAG这两种调试接口但救砖场景下我强烈建议你用SWD。原因很实际SWD只需要两根信号线SWDIO加SWCLK而JTAG至少需要TMS、TCK、TDI、TDO四根加上地线就更多了。线越少出接触问题的概率越低在锁死状态下少一根线就是少一个坑。另外SWD占用的引脚更少这就意味着即使你把PA13和PA14以外的引脚全折腾坏了SWD多半还能用。还有一个细节是如果程序里只关闭了JTAG功能通过AFIO配置把JTAG-DP关了但保留SWD-DPJTAG模式会连不上但SWD依然可以正常连接。我在实际维修中就遇到过这种情况用JTAG死活连不上一切到SWD就直接通了。所以救砖操作可以默认遵循一个原则先用SWD别管别的。2. 动手前的准备硬件选型与SWD接线图2.1 ST-Link开发器怎么选ST-Link是ST官方出的调试烧录器V2和V3都能给STM32F10x救砖。V2版本虽然老但胜在便宜、稳定、资料多市面上几十块钱的版本一大把救砖完全够用。V3版本速度快、接口更丰富但对F1系列来说性能过剩如果你手头已经有V2完全没必要升级。这里要提醒一句市面上的ST-Link V2鱼龙混杂有些山寨版在高写入频率下不太稳定救砖时容易出现“连上了但一读Flash就断开”的情况。如果你遇到了先别怀疑芯片换个原装或者做工好一点的ST-Link再试。另外不同厂家的ST-Link V2在引脚排列上可能有细微差异接线之前一定先看外壳丝印重点确认GND、3.3V、SWDIO、SWCLK四个引脚的位置。如果手头连ST-Link都没有也不建议临时买那些来路不明的下载器。认准ST-Link V2或官方更新的STLINK-V3MINI即可这个投入十几二十块就能搞定以后写STM32都用得上。2.2 SWD接线图详解SWD接线是整场救砖行动里最容易出错、也最容易被忽略的环节。别小看这四根线接错一根轻则连不上重则烧坏调试器甚至目标板的电源部分。先说最基本的四线接法见下面的对照表ST-Link V2引脚作用连接到STM32F10xSWDIO数据线PA13SWCLK时钟线PA14GND公共地GND3.3V可选供电3.3V上面表格里3.3V我特意标注了“可选”这个后面会细说。如果目标板已经由USB或外部电源供电就不要把ST-Link的3.3V接到板子上了两个LDO同时对负载供电容易出现压差和回流问题。反过来如果你拿了一块没接电源的裸板可以用ST-Link的3.3V给它供电但要注意ST-Link V2的3.3V输出能力普遍在100mA以内带一块F103最小系统板勉强够用带带LED、蜂鸣器就悬了。完整救砖场景下我建议把复位线也接上也就是ST-Link的RST引脚接到STM32的NRST复位脚。复位线不是必须的但接上之后可以配合软件做“按下复位键的瞬间连接”这种操作对处理程序死锁的情况很管用。具体怎么用后面排查章节会说。ST-Link V2 STM32F10x常见最小系统板 SWDIO ------------- PA13 SWCLK ------------- PA14 GND ------------- GND 3.3V ----(可选)---- 3.3V RST ----(可选)---- NRST接线时优先用杜邦线但杜邦线有个通病就是插座松。救砖过程中如果老是连不上先用手按住杜邦线接头再试一次很多时候所谓“接触不良”就是这么解决的。2.3 供电与复位线的讲究供电是救砖的第一步电源没弄好后面一切白搭。我见过不少人在板子没通电的情况下折腾半天ST-Link总是报错结果插上USB供电立刻就好了。STM32F10x调试接口本身需要芯片处于上电状态DAP调试模块才能工作如果你不确定板子是否已经供电用万用表量一下3.3V和GND之间有没有电压就行。复位线有个很实用的场景当芯片跑在错误的时钟配置下或者程序把引脚全部占用了点连接时ST-Link会试图给它发调试命令但芯片状态可能不对。如果接好了NRST到ST-Link的RST就可以在ST-LINK Utility里启用复位连接Reset under connect功能让ST-Link在建立连接的瞬间对芯片执行一次硬件复位这比按住芯片复位键再点鼠标要方便得多。别把NRST和BOOT0搞混。NRST是复位脚接到ST-Link的RSTBOOT0是启动模式选择脚接到高电平或低电平来控制芯片从哪里启动两者完全不是一回事。接线时看清楚丝印我见过有人把BOOT0拉高之后还一路拉到了ST-Link的RST上结果怎么都连不上。3. 软件工具链驱动安装与ST-LINK Utility配置3.1 驱动怎么装才不出错ST-Link的官方驱动包叫STSW-LINK007在ST官网上输入STSW-LINK007就能找到这是ST官方发布的Windows驱动安装包。下载的时候注意选择和你系统匹配的版本Win10、Win11一般下载最新的就行。安装时建议先插好ST-Link让系统弹一次“设备无法识别”再运行驱动包安装这样驱动服务会主动扫一遍硬件成功率更高。有一点要特别提醒不要图省事去百度网盘或者某些第三方下载站拉STSW-LINK007很多打包版本要么是老掉牙的旧版要么捆绑了一堆莫名其妙的东西。官方下载需要注册账号可能稍麻烦一点但驱动这东西直接关系到芯片能不能被识别不值得冒风险。装完驱动后插上ST-Link在设备管理器里应该能看到“STMicroelectronics STLink dongle”或者类似的条目。如果显示的是黄色感叹号说明驱动没认上先把USB线换成带数据传输的线再检查是不是插了纯充电线。这个看起来像废话但实际很多人卡在这一步。3.2 官方救砖工具STM32 ST-LINK Utility接下来要安装STM32 ST-LINK Utility。虽然ST现在已经停止维护这个工具官方主推STM32CubeProgrammer但ST-LINK Utility在救砖场景下依然非常好用界面简洁、连接逻辑清晰很多老工程师到现在还在用它。你搜关键词“STM32 ST-LINK Utility下载”就能在ST官网找到对应页面选最新版本安装即可。网上很多教程喜欢让你直接上STM32CubeProgrammer但这款工具功能太全界面反而复杂对锁死状态下只想快速连一下芯片的人来说有点杀鸡用牛刀。ST-LINK Utility的界面就一个主窗口加一排菜单连接、擦除、烧录、改选项字节都很直白更适合照着步骤操作。安装完成后打开软件默认界面左边是芯片内部Flash的内容区右边是日志区。刚打开时右边会有一堆提示信息别慌这是工具自己在枚举调试器。重点是要在顶部菜单的ST-LINK下拉菜单里找到Connect选项。3.3 连接参数的几个关键设置打开ST-LINK Utility后不要直接点连接先看一下ST-LINK菜单里的Firmware Update。如果你的ST-Link是刚买的固件版本可能很旧先升级到最新版再连芯片能避免很多莫名其妙的兼容性问题。升级的时候ST-Link会闪几下灯正常现象。然后选择ST-LINK → Connect这时会弹出连接设置窗口。这里有几个关键参数分别是Port、Mode、Frequency、Target Voltage。Port固定选SWDMode选Normal或Hot Plug都可以Hot Plug适合芯片正在运行程序的情况。Frequency默认可能是1.8MHz救砖时强烈建议先手动降到500kHz以下越低越稳。Target Voltage那里如果正常会显示目标板的电压比如3.28V这个电压显示正常基本说明ST-Link已经和板子通电握手成功了。频率选择是新手最容易忽略的地方。第一次连接把频率降到180kHz甚至更低都不丢人我就是这么干的虽然慢一点但连接成功率会高出一大截。等确认芯片已经被识别再把频率调回1.8MHz或更高进行后续操作。4. 核心实操解锁、擦除、重烧的完整流程4.1 第一步与锁死的芯片建立连接前面设置都完成后点击Connect按钮。如果一切顺利ST-LINK Utility会读取芯片信息界面左侧显示Flash内容、右下角显示存储容量和UID等信息这就算连上了。如果连接失败软件会提示Can not connect to target或者SWD/JTAG Communication Failure别灰心这就是今天要解决的主要矛盾。连接失败时别反复狂点连接那是无效操作只会让调试器更忙。正确做法是先检查接线有没有松然后按住目标板的复位键不松手在按住复位的状态下点Connect点下去的同时放开复位键这样能让ST-Link在芯片刚刚复位的瞬间抢占调试接口成功率会高很多。如果还是失败就试后面排查章节里提到的Hot Plug和BOOT0方案。一旦连上立刻先做一件事读取Option Bytes看一下当前保护状态。菜单在Target → Option Bytes打开后能看到Read Out Protection一栏的当前值。显示Level 1就说明锁死原因是读保护显示Level 0但连不上说明问题出在程序或引脚复用上那就要从BOOT0或者复位时序入手了。4.2 第二步通过Option Bytes解除读保护确认读保护是Level 1之后解除方法就简单了。在Option Bytes窗口里把Read Out Protection从Level 1改成Level 0然后点击Apply按钮。这时候ST-LINK Utility会弹出一个警告框大致意思是“解除读保护会擦除整个Flash是否继续”点击Yes。这个警告不是吓唬人的解除读保护的底层原理就是通过全片擦除来清除选项字节里的保护标志所以Flash里原有的程序、数据都会没了。但别忘了你现在是救砖板子已经锁死了里面的程序本来也没法用了擦掉就擦掉别心疼。等待软件执行“Mass Erase”或者“Option Bytes Programming”操作进度条走完芯片基本就解除了读保护。此时再断开连接重新用ST-LINK Utility连接一次应该就能正常识别并且能看到Flash区全是0xFF说明已经处于空白待烧录状态了。这里说一下经验解除读保护后不要急着烧程序先确认能把芯片识别出来。识别成功说明调试通道已经恢复之后不管是烧录还是继续调试都等于重新回到正常流程。4.3 第三步全片擦除与低级格式化有些芯片或板子读保护已经是Level 0但连上之后Flash里内容乱七八糟或者还有残留的乱码程序在跑。这种情况下建议执行一次“全片擦除”。在ST-LINK Utility里操作路径是Target → Full Chip Erase相当于把整个Flash区域全部擦成0xFF彻底清理干净。为什么叫它“低级格式化”呢是因为这个操作不像普通烧录时按扇区擦除它是直接对整片Flash做mass erase和电脑上低格硬盘的处境有点像不管里面有什么全部清空。我做这步的时候习惯再顺手做一次Verify也就是全部擦除后再读一遍Flash确认所有字节都是0xFF干干净净的再往下走。注意全片擦除会同时清空选项字节吗不会选项字节是单独的区域。但如果你的选项字节里还有别的配置比如看门狗配置、硬件使能之类的擦除不会动它。如果你刚执行过4.2节的解除读保护其实Flash已经被擦过一遍了这一节可以跳过直接烧录。4.4 第四步重新烧录与启动验证芯片解锁后重新烧录就没什么特殊门槛了。在ST-LINK Utility里File → Open File选择你要烧录的hex文件然后按工具栏上的Program按钮或者Target → Program Verify。烧录之前记得确认左下角芯片型号选的是不是ST和你的具体型号别用F103C8T6的程序给F103RCT6烧越界访问会出现校验错误。烧录过程有进度条写完后工具会自动做一遍Verify也就是逐字节校验看到“Verification... OK”就说明程序已经正确写入了。这时候断开连接给板子断电再上电程序应该就能正常跑起来了。烧完别急着做别的先把程序复位一次确认能跑、能连、功能正常再考虑是不是要设置读保护。如果程序里没有特殊要求我建议平时调试阶段保持Level 0就好等到要量产了再评估有没有必要开保护。调试的时候开保护纯属给自己挖坑。5. SWD/JTAG Communication Failure排查手册5.1 报错信息要怎么解读ST-LINK Utility的报错并不复杂核心就是SWD/JTAG Communication Failure这个系列。在热词搜索里大家不是在找这个报错的原因就是在找和这个报错配套的解决办法说明遇到的人是真多。但很多人忽略了报错日志里往往还藏着关键线索。先看整个Connect的日志输出。如果日志显示无法打开ST-Link设备说明是驱动或USB的问题如果日志显示Target voltage异常说明供电或接线有问题如果日志停在“Connection error”然后一堆地址信息那才是芯片侧的通信问题。所以别只盯着最后的红色大字把全部日志复制出来看一遍问题定位会快很多。如果日志里出现类似“No ST-Link detected”这个跟芯片没关系是ST-Link本身没被电脑识别。优先检查驱动、USB线和固件。如果日志里有“Error: SWD error”带一串地址才轮到芯片方面排查。5.2 硬件层面的排查顺序硬件排查有一条固定顺序先供电再接地再信号线最后复位线。一上来就怀疑芯片坏掉的基本都是跳过了这个过程。第一步用万用表确认板子3.3V对GND有没有电压芯片没有电调试接口再特殊也白搭。第二步确认GND是同一根地最好直接从板子电源负极接出来别通过杜邦线绕一大圈。第三步核对SWDIO和SWCLK是不是接反了这两根线接反的概率非常高因为很多板子上PA13和PA14就挨在一起杜邦线一交叉就出问题。第四步检查复位引脚是不是被外部电路强制拉低了如果NRST一直是低电平芯片永远处于复位状态SWD也连不上。还有一个常见问题是“目标板上SWD引脚被其他外设占用”。比如有些板子把PA13和PA14引出后接了传感器或按键外设的低电平把调试信号给拉死了这种情况下就算接线全对也连不上。临时把引脚上的其他飞线全部断开再试连接往往就好了。5.3 软件层面的排查顺序硬件查完没发现问题就到软件层面查。首先确认驱动安装正常设备管理器里ST-Link设备没有黄色感叹号。然后确认有没有其他软件占用ST-Link比如Keil、IAR或者别的烧录工具同时开着就有可能在占用调试器关掉所有IDE只留ST-LINK Utility一个程序再重新连接。接着检查ST-LINK Utility里的连接参数特别是频率。有些板子布线长、干扰大1.8MHz连不上很正常你把频率降到180kHz甚至90kHz多试几次成功率会明显上升。这个被我总结为救砖界“第一玄学”实际上原理很简单低频信号抗干扰能力强容错性高在芯片状态不稳定的时候更容易建立连接。还有一点很多人忽略ST-Link固件版本。老版本固件对F10x系列的支持是逐步完善的如果你的ST-Link从来没升级过固件先做一次Firmware Update可以解决不少旧版本留下的兼容性问题。5.4 屡试不爽的“强制连接”三板斧要是上面的常规排查都试过了芯片还是不给面子就得上杀手锏了。我总结为救砖“三板斧”按顺序使用绝大多数芯片都能救回来。第一板斧Hot Plug模式。在Connect设置窗口把Mode从Normal改成Hot Plug再点Connect。这个模式不会在连接前先将芯片复位而是直接打开调试口对程序死循环、引脚被占用的情况很有效。第二板斧拉高BOOT0。把BOOT0引脚接到3.3VBOOT1保持低电平然后上电这时STM32会从系统存储器启动运行内部的Bootloader绕过了用户Flash里的程序。这种情况下SWD接口有机会正常工作因为用户程序没机会跑起来占用引脚了。连上之后再解除读保护、擦除救回来之后记得把BOOT0拉回低电平。第三板斧硬件复位加持。接好RST线到NRST在连接设置里启用Reset under connect或者按我之前说的“按住复位键点连接、点下的瞬间松复位”手法。这三板斧可以组合使用比如拉高BOOT0再配合Hot Plug我实测下来成功率极高。真要三板斧全上还连不上那就要怀疑芯片是不是已经烧坏了或者引脚物理损伤了。6. 从救砖现场总结的避坑清单6.1 哪些习惯能大幅降低锁死概率救砖救多了你会发现大部分锁死其实是自己“作”出来的。为了少当几回“程序员维修工”这几个习惯值得养成。第一调试期间别设置读保护。不要为了模仿量产流程在调试工程里勾选编程后设置读保护调试阶段最重要的就是能随时连、随时改开了保护只会给自己添堵。第二写代码时给SWD引脚留一条后路。如果能保证正常情况下不占用PA13/PA14就别去碰这两个引脚更不要随意把SWJ调试接口完全关闭。如果非要复用这两个引脚做别的功能也要在代码里做一个延时窗口让上电后有一段时间保持SWD可用。第三使用外部晶振时要小心。HSE起振失败的代码最容易导致芯片上电后卡死如果板子晶振没焊或者引脚接触不良调试连接就会变得极其不稳定。说实话养成好习惯比学会救砖技巧更重要。救砖救得好只是减少损失习惯好才能从根上避免损失。6.2 救活之后一定要做的事芯片救回来不代表结束只能算“抢救成功”。之后别急着当无事发生先做三件事。第一把关键程序备份一下尤其是自己调了很久的初始化代码烧进去之前确认一下能正常跑起来。第二对一下芯片型号和固件版本确认你烧的是符合这款芯片的固件而不是从网上随便下的某个参考例程。第三有条件的话做一次完整的读写测试确认之前锁死没有留下什么隐患。如果你的最终产品需要设置读保护建议在开发全部完成后专门写一个量产烧录步骤明确什么时候设Level 1、什么时候不设。一旦设了保护后面再想通过调试口更新程序就会遇到和锁死一样的阻力。量产阶段设置保护无可厚非但每个做这步的人都应该想清楚以后怎么升级有没有预留IAP通道救活之后还有一个容易被忽略的点把这次锁死的原因记下来。是勾错了配置还是把SWD引脚给复用了记在笔记或代码注释里下次遇到同样问题一眼就能定位而不是再从头折腾一遍。6.3 说实话什么情况下芯片真的救不回来写到这里我得说句实在话SWD/JTAG Communication Failure这个报错不等于芯片一定还能救。绝大多数锁死都救得回来但下面这几种情况即使把ST-Link接得再好也无能为力。第一种芯片已经物理损坏比如引脚被高压击穿、内核因电源反接彻底烧毁这种连供电都可能打嗝折腾没有意义。第二种选项字节被设成了Level 2级别的永久读保护。有些STM32型号支持最高级别的保护一旦设置芯片的调试接口就永远被关闭再也不能通过SWD或JTAG访问Flash。这也是为什么我反复强调量产别手滑把RDP级别调到最高。第三种Flash区域物理损坏这种情况通常伴随写入出错率飙升ST-LINK Utility能识别芯片但擦除或烧录过程中反复报错。遇到这些情况就别在救砖上耗太多时间了直接判断是换芯片还是换板子。救砖的本质是软件层面疏通调试通道如果问题出在硬件物理层那就没有“软解锁”的余地了。我个人的经验是救砖前后心态要稳。芯片锁死之后别狂按连接键先理清接线、供电、频率这三个基础项再按读保护、引脚复用、时钟配置这个顺序去排查。绝大多数情况下问题都能定位到某一个具体环节。等到ST-LINK Utility重新弹出手里的芯片型号时那种感觉比写通一个复杂外设还爽。如果后续你真在救砖过程中碰到了特别奇葩的状况欢迎把这个流程再拿出来对照一遍多半能找到你忽略的那根线。