搞嵌入式开发和硬件量产的人,对“烧录良率”这四个字应该都不陌生。明明在研发样机上怎么烧都能成功,一上产线批量烧录,就时不时冒出来几块板子报错,要么连接不上,要么擦除失败,要么校验不过。烧录这一步一旦掉链子,整条产线都得停在那里等人排查,返工的板子还得单独处理,工时和物料成本都在往上走。我这些年折腾过不少项目,从STM32、ESP32到海思平台、Jetson系列都碰过,踩过的烧录坑不比写代码少。
这篇文章想聊的不是某个芯片怎么烧,而是一个更实际的问题:当烧录良率上不去的时候,该怎么系统排查。适合谁看?如果你在小批量打样阶段,或者正在搭建产线烧录工位,又或是负责客户返修板子的烧录恢复,这篇文章里的排查思路和实操清单应该都能帮上忙。内容不追求把每个芯片手册都抄一遍,只讲我自己验证过有效的排查路径,以及那些只有批量干过才会注意到的细节。
1. 先从“良率”说起:烧录失败到底卡在哪个环节
1.1 三种最常见的失败表现
我习惯先把问题分类,因为不同表现的根因方向完全不一样。第一种是全新的板子,首次烧录就大面积失败。这种失败率肯定不是一两块,而是每批都有,指向的是设计层面的问题:电源纹波大、复位电路参数不对、调试引脚被占、芯片BOOT配置悬空,这类问题在原理图评审阶段就该被发现。
第二种最折磨人:研发阶段好好的,批量阶段偶发失败。比例不一定高,可能只有3%~5%,但每1000片就冒出三五十片,产线根本不敢放量。这类问题的真凶往往是接触不良、线材老化、操作不规范,或者器件来料一致性变差。它的麻烦在于你复现不了,工程师拿到退下来的板子一烧又好了,品控就会觉得是操作工没插紧。
第三种是使用一段时间后返修的板子烧不进去。这种情况要区分芯片是不是已经被保护/加密锁定,还是引脚因为静电损伤导致漏电,又或者是Flash寿命到底没法继续擦写。返修板子和新板子的问题逻辑是不同的,排查时如果混在一起处理,会被带偏。
1.2 烧录链路全貌:一段都不能断
很多人排查烧录失败时习惯直接怀疑芯片或者烧录器,但烧录本身是一条完整链路:主机烧录软件 → USB/网络连接 → 烧录器/调试器 → 调试排线或探针 → 目标板调试接口 → 目标芯片内部BootROM → Flash控制器 → Flash存储阵列。任何一个环节中断或劣化,表象都是“烧录失败”,根因却可能天差地别。
我常把这条链路比作往仓库送货:烧录软件是下单系统,烧录器是运输车,调试排线是公路,电源是汽油,芯片里的BootROM是门卫,Flash是货架。车再好,公路塌了一段也进不去;货到了门口,门卫不认路也白搭。排查烧录良率,本质上不是只修一辆车,而是要把整条运输链路都体检一遍。
1.3 为什么研发阶段发现不了
这是良率问题的核心悖论。研发样机阶段,工程师亲自操作:线材是新的,电源是实验室里的可调电源,电脑系统干净,驱动齐全,手法稳当。即使信号设计有点余量不足,这个环境下也能勉强通过。批量产线则完全相反:操作人员轮换、工装治具几百次插拔、电脑USB口供电不稳、环境温度升高、防静电措施缺失,所有“隐藏劣化”都会在这个阶段集中爆发。
所以排查良率问题的时候,我第一句话永远是:不要只在实验室里复现,去产线现场看操作。很多问题根本不是原理性的,而是工程性的。
2. 硬件链路排查:从接触不良到电气特性异常
2.1 连接器与探针:最常被低估的故障源
排针、排母、牛角座这类连接器,插拔几百次之后,弹片的弹性就开始下降,接触电阻升高,氧化层变厚。研发阶段用一个月,插拔次数有限,问题不明显;产线一天烧几百片,同一套治具一天插拔几百次,劣化速度远超想象。
如果是探针治具,问题更多:针尖积灰导致接触阻值漂移、弹簧压力不足导致压接不实、针床对位偏差导致个别引脚没压到。我遇到过一个很典型的案例:某产线烧录不良集中出现在三个固定工位,换人换料都没用,最后拆开治具发现,那几个工位的探针已经磨损得针尖都平了,接触电阻从几十毫欧涨到十几欧。SWD在十几欧的接触电阻下,信号完全变形,能连上才怪。
建议是:产线治具里的探针和线材必须纳入点检计划,不能等坏了再换。最简单的方法是每周用万用表测一次探针到转接板的通断电阻,发现数值明显上升就换。
2.2 线材:杜邦线、飞线和定制线缆的坑
打样阶段用杜邦线很随性,但批量烧录还指望杜邦线可靠,那就是跟自己过不去。杜邦线的问题在于端子压接不牢,插头松垮,内芯在胶壳里慢慢折断,外观看起来完整,实际上已经断路或者半断路。产线上最怕这种“时通时不通”的线。
飞线的问题是太乱太长。SWD和UART都是低速接口,听起来对线长不敏感,但如果两根线绕在一起几十厘米,信号串扰和寄生电容同样会让烧录失败。至于定制线缆,压接端子没压到位、线序颜色标错、线径太细导致压降大,这些都是我踩过的坑。
我的底线是:产线烧录必须用正规压接的定制线缆,长度越短越好,而且每条线贴标签注明用途和维护日期。宁愿多花点钱,也不要在良率上一块一块地赔。
2.3 信号完整性与地线:SWD和串口的物理底线
SWD协议只有两根信号线(SWDIO和SWCLK),外加电源和地。很多人只关注那两根信号线,地线随便接一下就完事。实际上地线才是信号完整性的根基。
长线加上大寄生电容,SWCLK时钟沿会变圆,上升时间拉长,目标芯片在边缘处采样就容易出错。表现就是:连接成功但擦除到一半报错,或者一校验就Fail。这时候最简单的处置是降低SWD时钟频率。J-Link默认可能跑1MHz甚至更高,换成100kHz~400kHz试试,很多“疑难杂症”当场就好。J-Flash和Keil5里的Debug Settings都可以直接改速度,这个操作我已经用过无数次,每次都能捞回一批板子。
串口烧录的物理底线更基础:电平必须先确认。目标板UART是3.3V逻辑还是5V TTL,和烧录工具能不能匹配,不匹配直接烧芯片或通信失败。TX/RX交叉、GND共地,这两点也是每次必查。ESP32这类芯片用串口烧录时,线材过长也可能导致下载失败,我一般控制在15厘米以内,超过30厘米基本就要降波特率或者换屏蔽线了。
2.4 电源:烧录翻车的隐形杀手
烧录时经常遇到的现象是:单独供电正常,插上烧录器之后反复连接失败。原因很简单,烧录瞬间目标芯片内部Flash控制器要工作,电流需求会突然升高,如果板上的稳压器带载能力不足,或者USB口本身供电就弱,VDD会被拉低,芯片瞬间欠压复位,烧录自然失败。
验证方法很简单,烧录时用示波器盯着目标芯片VDD引脚,看有没有跌落。如果在烧录器启动擦除的瞬间,VDD掉了300mV以上,电源链路一定有问题。产线工位上如果用的是一分多USB Hub供电,大概率会翻车,换成独立电源适配器给目标板供电,成功率立竿见影。
还有上电时序问题。不少烧录器要求先让目标板上电,再建立调试连接,反过来会导致握手失败。ST-Link和J-Link对目标板供电的敏感性还不一样,有的调试器引脚本身就带3.3V输出,结果和目标板电源冲突,两个源互相拉,电流倒灌,轻则连接失败,重则烧芯片。
2.5 复位、BOOT和时钟引脚:芯片侧的“门禁”
很多芯片在烧录前要求特定引脚处于指定状态:STM32需要关注BOOT0和NRST;ESP32需要GPIO0(老型号)或GPIO9(部分新型号)拉低进入下载模式,同时EN引脚保持高电平;海思平台则常要求从串口强制进入烧录模式。这些引脚如果被外部电路上拉/下拉到错误状态,或者被某个外设驱动到错误电平,芯片根本不会进入BootROM的烧录分支。
另外,复位脚如果并了一个过大的电容,上升沿会变得太慢,调试器在“connect under reset”模式下等不到有效的复位窗口,就会报连接失败。外部晶振如果没焊好或者负载电容不匹配,依赖时钟的串口引导也可能失败。这类问题在研发样机用手工焊接时可能碰巧能过,回流焊批量之后反而暴露。
3. 软件与工具配置:最容易忽略的高频原因
3.1 工具链版本、驱动与USB枚举
硬件链路检查完了,再聊软件侧。Keil5烧录失败的报错里,“No target connected”“Cannot access Memory”“Flash Download failed”是出现频率最高的三条。很多时候不是硬件坏了,而是Keil里配置的调试器型号不对,或者下载算法(Flash Algorithm)没有选对。比如STM32F103和STM32F407的Flash算法就不一样,选错算法,J-Link能识别芯片,但写入时必然失败。
还有一个容易被忽略的问题是驱动。换了电脑,ST-Link的驱动没装好,Windows设备管理器里设备带黄色感叹号,Keil就搜不到调试器。Win10/Win11的驱动签名机制也会让某些远古版本的调试器驱动直接被拒载。产线工位最好固定电脑、固定驱动版本,不要轻易升级,更不要开自动更新。
J-Flash和OpenOCD这类工具也有自己的坑。J-Flash的JTAG/SWD设置里,如果接口速度选得太高,配上烂线,就等着看“Cannot connect to target”吧。OpenOCD的脚本里如果reset config配置错了,目标芯片跑飞之后你根本拉不回来。
3.2 接口频率、波特率与连接模式:一个字:稳
调试接口频率不是越高越好,我见过不少人为了“快”把SWD拉到几兆甚至十兆,结果产线一片哀嚎。频率越高,对线材、探针接触电阻、目标板PCB走线质量的要求就越高。量产工位上,我会优先把SWD频率降到1MHz以下,用更长的擦除时间换一次通过率,非常划算。
串口烧录的波特率同理。ESP32默认串口下载波特率115200,很多人贪快设成921600,结果板子布线差一点就下载失败。海思平台串口烧录也是,波特率越高,对时钟精度要求越严,目标板的晶振偏差稍大,握手就失败。
连接模式的选择也影响成败:芯片里已经有程序且可能跑飞、进入了低功耗、或者调试引脚被复用,这时“connect to running target”基本连不上,必须选“connect under reset”。这等于敲门之前先把门卫叫醒,而不是隔着窗户喊话。Keil5、J-Flash、OpenOCD里都有相关选项,建议批量产线一律使用硬件复位连接。
3.3 烧录选项:擦除方式、校验、保护位
烧录选项里藏着很多坑。全片擦除和扇区擦除的区别很重要:扇区擦除只抹掉要写入的区域,其他扇区保留。如果旧固件里有跳转逻辑残留,新固件启动时可能旧的向量表还在前面,程序跑飞。批量产线保险起见用全片擦除,而不是默认的按扇区擦。
校验选项一定开。烧录完成后的read-back verify可以保证写入内容和文件一致,否则“烧录成功”只是幻觉,装到终端机器上跑一个礼拜才出问题,那时候返修成本高得多。
更麻烦的是芯片保护位。STM32如果之前设过RDP(读保护)等级,调试器要么连不上,要么连上了也无法擦除。J-Flash里的unsecure芯片功能可以尝试解除,但如果设了最高等级保护,部分芯片只能通过串口ISP或专用工具复位,或者直接报废。ESP32烧录失败也有“Secure Boot已使能”的情况,需要用esptool的相应命令先处理。这类问题在返修板烧录时出现频率特别高。
3.4 烧录文件本身的问题
看起来最不起眼,其实很常见。hex、bin、S19这几种格式处理逻辑完全不同。hex文件自带地址信息,如果文件本身是从错误的地址导出的,烧进去程序当然跑不起来;bin文件没有地址信息,烧录时必须手动指定起始地址,填错了就是灾难。S19(Motorola s-record)格式主要在部分汽车电子芯片和老平台里用,同样要检查地址记录。
我见过一次产线烧录“良率”暴跌,最后发现不是任何硬件问题,而是烧录文件里混入了一个昨天编译的调试版本,功能残缺,整批产品差点发出去。从那以后,我在产线脚本里强制对烧录文件做MD5校验,没有匹配的MD5直接拒绝烧录,从流程上杜绝烧错版本。
3.5 主机侧干扰:电脑也要纳入排查
批量烧录工位的电脑不能像办公电脑一样随便。USB口供电不稳、Windows自动更新重启、杀毒软件扫描驱动、屏保锁屏导致USB异常断开,这些都可能导致偶发烧录失败。尤其是笔记本,节能策略会在低负载时关掉USB端口供电,烧录器掉线,下次连接就失败。
我的做法是:产线工位用固定台式机或者稳定供电的工控机,关闭自动更新,关闭休眠,USB的“允许计算机关闭此设备以节约电源”这个勾选必须取消。电脑驱动固定版本,烧录软件固定版本,不要随意升级。
4. 批量化生产的系统思维:从偶发失败到隐藏的系统缺陷
4.1 先定义“良率”的口径
聊良率之前,必须先定义良率。一次通过率(FTP,First Time Pass)和最终通过率(UTR,Ultimate Test Rate)是两码事。产线上可以重烧,重烧之后能过到底算不算良品?如果不区分,良率统计就是一本糊涂账,问题也会被掩盖。
我建议批量产线同时统计两个指标:一次通过率和最终通过率。一次通过率反映的是烧录环节的真实健康度,最终通过率反映的是“有没有救回来”。如果一次通过率只有75%但最终通过率98%,说明现场在靠反复重烧硬撑,实际燃烧的是工时时长和操作员耐心,这个问题必须查。
4.2 用数据说话:失败记录里藏着的规律
排查良率问题,第一件事是把失败记录捞出来,不要靠感觉。记录时间、工位、操作员、烧录器序列号、错误码、固件版本,这些字段在产线记录表里越完整越好。
我印象特别深的一个案例:某产线烧录失败率集中在下午两点到四点飙升,上午和晚上都正常。排查硬件、电源都没有结论,最后看记录发现那个时段隔壁车间的紫外线固化炉会启动,电压波动导致该区域电源质量劣化,烧录器偶发握手失败。这是纯粹的数据规律,不记录的话根本发现不了。
4.3 来料一致性与器件批次差异
芯片来料批次差异,是批量良率问题里最难防备的一环。同一颗STM32,不同批次Die的电气特性可能存在细微差异,对烧录电压门槛、时序余量的容忍度不同。研发阶段用的一批芯片刚好好,批量采购的一批芯片刚好差一点,烧录良率就掉下来了。
还有引脚氧化和受潮。长时间存放的芯片引脚发黑,焊接后假焊或虚焊,烧录器时好时坏。产线如果防静电措施不当,芯片在周转过程中被静电打伤,引脚漏电,轻则烧录失败,重则芯片直接报废。来料入库时的抽检和湿度管理,比烧录工位本身更需要关注。
4.4 工装治具与操作规范:人的因素不可忽略
同样一条产线,不同操作员的烧录失败率可能有显著差异。插排线的角度不对、按压时间不够、没有佩戴静电手环,都会造成实际接触不良或静电损伤。
产线如果出现“某个操作员当班时不良率偏高”的情况,先不要急着骂人,检查治具的定位销是否磨损导致操作难度增加,检查SOP示意图是否清晰,检查操作台高度是否反人体工学。管理上把治具调整到“傻瓜式操作也无法插错”的状态,比培训一百遍都有效。
4.5 固件版本管理与可追溯性
把烧错固件也纳入良率问题,是我自己做过最正确的决定之一。很多良率报表只统计“烧录失败”,但“烧录成功但内容错误”同样是质量事故。为了防止这种情况,产线烧录工位必须有版本锁:每个产品型号只能烧录指定文件,文件通过MD5校验,烧录日志自动保存。
可追溯性同样重要,每片板子烧的是什么版本、哪台设备、哪一天,都要能查到。出了客诉才能快速定位是不是烧录环节的问题,才不会让整个批次都背锅。
5. 烧录良率排查SOP:可以直接抄作业的实操清单
5.1 拿到失败板后的标准动作
产线报“又烧不进去”的时候,最忌讳的就是反复点击“烧录”按钮重试。连续失败说明情况在恶化,不如先把现场信息保留下来。
标准动作是这样的:第一步,记录完整错误码和截屏,不同错误码对应完全不同的方向;第二步,记录烧录器型号、软件版本、线材编号、工位编号、操作员;第三步,把失败板单独隔离,不要混入待返修区;第四步,才轮到工程师开始动手查。信息完整,排查才能快。
5.2 最小环境还原法
工程师拿到失败板,第一步不是换芯片,而是先搭一个最小环境:裸板、一条确认是好的线材、一台确认驱动正常的电脑、一个确认是好的烧录器。手工烧录一次。
如果手工能过,说明板子本身大概率没问题,问题出在产线工装、线材、治具或者操作环节。如果手工也过不了,就把板子留下,开始逐项替换。这个方法的最大价值是把“批量问题”和“单板问题”切开,避免生产线停在那儿等结论。
5.3 逐项替换的顺序
如果最小环境也失败,按下面的顺序替换:线材 → 烧录器 → 电脑/软件 → 芯片。没问题,很多人第一步就换芯片,其实是浪费。
线材优先,因为它便宜且最常劣化;烧录器次之,看是不是设备老化;然后单独换一台电脑和烧录软件,排除USB驱动、供电和配置问题;这些都不行,才怀疑芯片本身。如果以上都换过了还是失败,就要怀疑PCB层面的问题:调试引脚上有没有不该有的电容、复位电路是否异常、电源是否不干净。这时候用示波器和万用表做硬件细查。
5.4 不同类型芯片的恢复策略
失败板不等于报废板,不同的芯片有各自的恢复路径。
STM32系列:优先尝试J-Flash的unsecure操作,或者用串口ISP模式全片擦除后重新烧录。Keil5里也可以通过Connect under Reset配合擦除整个Flash来救。如果芯片RDP级别被锁到最高等级,部分系列可以通过内置Bootloader复位,但也有部分只能换芯片。
ESP32系列:用esptool.py先做erase_flash,把整个Flash清空,再重新下载。如果Secure Boot或Flash Encryption已使能,需要先处理安全配置,否则烧录永远失败。C3/S3这类新一代芯片的下载模式引脚不同,硬件检查时要确认拉对引脚。
海思、瑞芯微平台:通常有专用的量产烧录工具和强制升级模式,优先看是否进入了正确的升级模式,串口工具和Network工具都要检查版本匹配。这类平台烧录失败很多是烧录工具版本和芯片Loader不兼容导致。
树莓派、Jetson这类系统级烧录:SD卡或NVMe烧录失败,优先换卡/换盘、检查读卡器质量、重下镜像校验SHA256,不要反复写同一张卡。
5.5 案例复盘:三个真实场景
案例一,某消费电子产线,SWD烧录一次通过率只有92%。排查发现探针治具针尖磨损,接触电阻增大。更换整套探针后,一次通过率回到98.6%。这个故事说明治具点检有多重要。
案例二,STM32F405平台,偶发烧录失败,研发阶段几乎没出现过。排查换线、换工具、换电脑都无效,最后把SWD频率从6MHz降到1MHz,问题消失。信号完整性在批量场景里的容差,远比实验室里测到的更敏感。
案例三,ESP32-S3产线,串口烧录失败率15%。检查发现下载模式引脚没有被可靠拉低,Batch脚本里GPIO0拉低时序太短,芯片还没进入下载模式就开始握手。修正了引脚时序,失败率归零。这类问题在芯片规格书里往往只有一行字,但在产线里能坑你一整周。
最后说一点实际的体会:烧录良率不是越高越好,而是在一个可控范围内保持稳定。与其追求一次性通过率100%,不如建立一个能快速发现异常并回退的机制。数据记录、治具点检、版本锁定,这三件事做好了,烧录良率根本不需要天天盯。