做嵌入式的朋友估计都有过这种体验:板子设计调试都顺顺当当,一到量产线就出事,而且大多出在烧录这一关。烧录良率从99%滑到95%,听起来只是几个百分点,但一条产线一天跑下来,就是成百上千片板子的损耗,没人敢不当回事。我前后跟过不少量产项目,从消费电子到工控板卡都碰过烧录问题,踩过的坑加起来能写一本小册子。这篇就按我的实际排查顺序,把烧录良率上不去时最该查的几个环节完整梳理一遍。重点聊芯片级固件烧录,ST、ESP32、NXP这些平台都会提到,系统级整机镜像烧录(树莓派、Jetson那种)我会顺带说几句差异,不会展开太多。
1. 物理连接:先怀疑触点和线缆,别急着怀疑芯片
1.1 批量产线上,探针接触不良是头号嫌疑
量产烧录和实验室里拿杜邦线点一下完全不是一回事。产线上的板子几乎都要压在针床治具上,靠探针去接触PCB上的测试点。探针和焊盘之间是一种窄带金属-金属接触,接触电阻会随着探针磨损、表面氧化、脏污附着逐渐变大。刚上线的治具烧录一百片没问题,用三个月后开始偶发失败,这种情况我见过太多次。最麻烦的表现是“偶尔连上、烧到一半校验失败、报错信息不固定”,因为它不是必现,很容易让人怀疑是程序或者芯片不稳定,实际上问题就出在某一根探针上。
处理这个问题的思路是从治具本身下手。第一,探针要定期清洁,用无尘布蘸无水酒精擦针尖,把积累的氧化层和异物去掉;第二,检查针尖压痕,如果明显磨平或者有烧蚀痕迹,赶紧换;第三,测量整个回路的接触电阻,从调试器端到芯片端,正常应该在1Ω以内,超过这个数就要警惕。另外,PCB上的烧录测试点如果用的是喷锡工艺,长期暴露在空气中容易氧化,量产前期良率正常、放一段时间后开始下降,先怀疑测试点氧化。设计上最好给烧录位预留镀金焊盘,成本多不了几毛钱,但能省掉大量治具相关的麻烦。
我还记得有个项目,良率从99%掉到93%,排查了两天才发现是针床上一根探针的弹簧疲劳,压下去的时候有一根接触不到焊盘。更换探针后当天的良率就恢复到99.6%。所以遇到批量性烧录失败,第一件事永远是检查物理连接,而不是去怀疑芯片本身。
1.2 SWD接口的接线细节,决定八成故障
SWD接口有两根核心信号线:SWDIO(数据)和SWCLK(时钟),加上GND就够完成通信。但在量产场景下,建议把RESET也一起接上。原因很简单,如果目标板之前已经烧过程序,或者某些引脚状态不确定,调试器在连接时需要复位一下才能握手成功。很多调试工具都有“连接时复位”的功能,不接RESET线,这个功能就是空谈。
还有一个细节是VCC线。J-Link、ST-Link这类调试器通过VCC线检测目标电压,如果板子自己供电,VCC接上没坏处;但接的时候要看调试器是不是也在给目标板供电,两边同时供电容易形成电流倒灌或者电压互相拉扯。产线上我一般建议统一规则:目标板自供电,调试器只接SWDIO、SWCLK、GND、RESET四根,VCC根据调试器是否需要目标电压检测来决定是否连接。
接线顺序同样有讲究。先接GND,再接信号线;拔的时候反过来,先拔信号线,最后拔GND。原因是热插拔时如果信号线先接触而地还没接,调试器接口容易被静电打坏。这个细节在实验室里无所谓,量产线上一天插拔几百次,影响就出来了。把操作顺序写进SOP,能减少不少接口损坏的情况。
1.3 供电方式冲突,容易引发“怪毛病”
调试器供电和目标板电源同时上的情况很容易出怪毛病。现象一般是这样的:单独用调试器供电能连上,单独用目标板电源也能连上,两根线都插上反而连不上或者烧录不稳定。原因是两路电源之间形成低阻抗回路,电压被拉偏,或者调试器的过流保护被触发。
排查方法也简单:烧录时只保留一路供电,把另一路的供电路径断开试试。另外还要注意目标板的电源带载能力。烧录时电流会比平时大,如果电源模块余量不足,会在烧录瞬间出现电压跌落,导致芯片复位。我建议产线上必备一台示波器,烧录失败时盯着VDD波形看,如果烧录瞬间有明显的电压跌落,问题基本就锁定了电源环节。
2. 电源与信号完整性:烧录瞬间最考验电源
2.1 烧录瞬态电流和电压跌落,为什么会被忽视
很多人觉得芯片烧录就是个通信过程,电流很小,电源随便给一下就行。这里有个误区:烧录内部Flash或者外部SPI Flash时,芯片内部会启动电荷泵来产生写入所需的高压,瞬时电流比正常运行大不少,而且持续时间极短,万用表根本量不出来,只有示波器能看到。如果板子的去耦电容放得太远或者容量不足,电源模块带载能力又弱,烧录瞬间VDD就会塌一下。CPU一旦检测到掉电,立刻复位,烧录自然就失败了。
典型症状是:偶尔失败、失败批次没有规律、换工位后成功率不同。很多人反复去查调试器配置和固件,最后发现是电源问题。我处理过一起这样的案例,板子用电池供电,烧录时总是校验失败,后来在烧录测试点附近补了一个100uF的电容,问题直接消失。产线治具上如果空间允许,也可以预留一个220uF的电解电容位,专门吸收烧录瞬态电流。这一点在做治具设计时最容易忽略,但带来的收益很实在。
另一个容易被忽视的点是VDD去耦电容的位置。原则很简单:离芯片电源引脚越近越好。有的Layout为了布线方便,把去耦电容放得比较远,实验室小批量烧录没问题,一到量产就暴露了。如果PCB已经定型,可以在测试治具上想办法补救;但如果还在设计阶段,强烈建议检查每个电源引脚的本地去耦电容,这是基本功。
2.2 复位电路、BOOT引脚和启动模式的三重坑
复位电路是烧录稳定性的一个隐藏变量。很多板子为了抗干扰,把复位电容设计得比较大,导致上电后复位引脚电平缓慢爬升,调试器在复位没有完全释放的窗口尝试连接,自然是失败。解决方法有两种:一是把复位电容减小到合理范围,一般100nF以下;二是在烧录工具里打开“Connect Under Reset”模式,用硬件复位的方式抓住连接窗口。
BOOT引脚的坑更隐蔽。以STM32为例,BOOT0脚悬空时,在噪声环境下可能被干扰到高电平,芯片上电后进入系统存储器引导,这时候SWD调试口是无法正常连接Flash的。所以量产板的BOOT0最好通过电阻明确固定到低电平,不要让它悬空。ESP32那边的道理类似,只是方向相反:进入下载模式需要GPIO0拉低,如果GPIO0被外部设备上拉或者悬空干扰,串口烧录一样会失败。所以遇到特定板型烧录失败率偏高时,先确认这些启动引脚的电平状态,再排查别的。
2.3 电平匹配和SWCLK线长,高频段的老问题
调试接口的电平必须和目标板一致。3.3V的板子碰到5V电平的调试器,轻则握手失败,重则打坏IO。现在主流调试器大多是3.3V,但依然有部分转接板或并口工具是5V逻辑,混用前先确认电平。调试器上有电平选择跳线的,按目标板电压设置就好。
线缆长度对SWCLK信号的影响也很大。SWCLK是时钟线,频率越高,对线缆的寄生电容和电感越敏感。量产治具里如果调试器到芯片之间的走线超过50cm,SWCLK又跑到4MHz以上,经常会出现偶发握手失败的怪问题。处理方式是降低烧录速度,比如从4MHz降到2MHz或者1MHz,这个操作几乎能消除所有线缆引起的时序问题。还有一种有效手段:在靠近调试器端给SWCLK和SWDIO各串一个33Ω左右的电阻,能明显抑制振铃,提升信号完整性。
这里说个经验:接口速度的上限由线缆质量和连接确定性决定,从低速起步、确认稳定后再逐步提速,比一上来就追求最高速度要靠谱得多。批量线上烧录一片板子差个一两秒,远不如一个小时内不出现一次失败更划算。
3. 烧录器与工具链:软件配置错误比硬件还常见
3.1 驱动失效、固件太老和多设备冲突
Windows下烧录失败,先去设备管理器看调试器是否正常枚举。我遇到过几次这样的情况:前一天烧录还好好的,第二天全工位失败,最后发现是系统自动更新把USB驱动顶掉了。重新安装对应调试器的USB驱动就好,这个排查只要两分钟,但很多人会忽略。
调试器自身的固件版本也是个坑。J-Link这类工具通过固件来识别目标芯片,芯片型号太新、调试器固件太老,连接时会提示未知设备或者无法识别,解决办法是升级调试器固件。但这里有个现实问题:很多人在用的J-Link是兼容版或者非官方渠道来的,官方升级工具有可能把固件锁死甚至变砖。所以升级之前先确认手里设备的来源和可回退方案,别为了支持一颗新芯片把整个产线的烧录器都搞废。ST-Link的情况相对好一些,ST官方工具会强制升级,但如果升级过程中USB拔了,ST-Link也会进入一个不识别状态,需要用ST-Link Utility的恢复模式重新刷引导。
还有一个容易踩的坑是多个烧录器同时插在电脑上。有些调试软件不做设备选择,抓到第一个就动手,结果连到了错误的烧录器上,烧录自然失败。量产排线时建议给每个烧录器固定编号,软件里显式指定使用哪个调试器,避免串台。
3.2 IDE和量产工具里的三个经典配置陷阱
第一个是芯片型号选择错误。Keil的Options里Device选错了,哪怕只是同系列的尾缀差异,烧录算法可能完全不同,报错信息却很模糊。很多项目从F1移植到F4,工程文件改了编译选项,烧录配置没跟着改,就会出现这类问题。
第二个是Flash算法选错。Keil的Flash Download里,编程算法列表要和实际芯片的Flash类型匹配。选错算法的表现一般是:能连上芯片,但一擦除或者一写入就报错,错误信息里经常出现“No Algorithm found”或者“Invalid target address”。更换芯片批次或者切换工程时,务必检查算法列表。如果板子带有外部SPI Flash,还需要单独添加对应的外部Flash算法,否则外部固件烧不进去。
第三个是目标电压检测相关的设置。部分调试工具带目标电压检测,如果VCC线没接,软件会提示目标电压检测失败。这个提示本身不算致命,但如果你误以为芯片没上电,就会走弯路。量产工具比如J-Flash里,Target Voltage检测是有开关的,配合上文说的VCC接线规则一起确认,避免误判。
3.3 接口速度、复位模式和命令行量产实操
量产环境不建议用IDE图形界面去点点点。一方面效率低,另一方面不同操作员点出来的结果可能不一样,难以标准化。更推荐用命令行方式烧录,把参数固化到脚本里,交给产线系统调用,每次执行的是完全一样的流程。
以ST平台为例,STM32CubeProgrammer命令行烧录基本格式是:
STM32_Programmer_CLI -c port=SWD mode=UR -d app.hex -v -rst这个命令的含义是:通过SWD接口连接,使用Under Reset模式,下载app.hex,烧录后校验并复位运行。其中mode=UR对应“连接时复位”,如果目标板复位电路有干扰,这个参数很关键。
ESP32平台用esptool,命令大概是:
python esptool.py --port COM3 --chip esp32 --baud 460800 write_flash -z 0x10000 app.bin这里要注意两个参数:一是地址偏移要跟固件构建时的分区表对应,写错位置会导致固件烧进去但跑不起来;二是波特率不是越高越好,产线上如果出现偶发失败,先把--baud降到115200试一下,稳定后再评估提速。
J-Flash也有命令行模式,可以加载项目配置、烧录、校验、退出一气呵成。命令行是好事,但前提是参数本身要正确。投产前用命令行手工跑一遍完整的烧录、校验、复位流程,确认一切正常后再固化到产线系统里,这一步永远不能省。命令行烧录的好处是方便对接MES系统,每一步的结果都能通过返回码反馈给上位机,真正做到可追溯。
4. 目标芯片自身的状态:很多失败是被前一次操作坑的
4.1 读保护(RDP)与芯片锁死
芯片“锁死”这个词吓住了不少人,其实大部分所谓锁死是读保护(RDP)造成的。STM32系列开启RDP后,调试口对Flash的读写会被限制,等级越高限制越强。现象就是连不上、烧不进去,或者提示“Device is protected”。产线上出现这种情况,通常是因为返修板、二手板,或者板子上跑的程序悄悄修改了选项字节。
解除RDP的办法依平台而定。STM32可以通过STM32CubeProgrammer或者ST-Link Utility执行全片擦除,解除保护的同时清空Flash内容。这里要特别注意:解除保护的过程会做一次mass erase,产品里原有的数据会全部消失。所以返修流程里要提前做好程序重新烧录的准备。如果是NXP的平台,解除保护和擦除方式又有差异,有的是用Flash Loader做全擦,有的要用专用工具。总之,遇到锁死芯片,第一件事是确认平台,再查对应的解除方式,不要拿一个平台的思路生搬硬套到另一个平台。
产线管理上,最好的策略是预防。新芯片出厂默认不加密,量产程序里除非有明确安全需求,不要主动开启RDP。有些产品功能验证时需要开读保护,建议把“开保护”这个动作放到功能测试通过之后,而不是放在烧录阶段,避免给产线制造额外的返修障碍。
4.2 启动模式、低功耗和调试口复用
有些板子带电池,程序跑起来之后会进入低功耗模式。如果设备已经停在停止模式或待机模式,调试器连接会失败,因为CPU已经停了主时钟,SWD模块也不工作了。这种状态下,靠普通的连接方式基本无解,需要用复位操作把CPU拉回来。产线现场最简单的做法是:连接时按住复位键,在调试器开始握手瞬间释放复位,让CPU在调试器连接完成之前一直处于复位状态。Keil里的“Connect under Reset”、J-Flash里的“Reset under JTAG/SWD”都是干这个的。
调试口复用的问题在量产返修时也经常遇到。第一次烧录成功,程序跑起来了,第二次想再烧就连不上。原因多半是固件启动时把SWD的两个引脚(STM32上是PA13/PA14)配置成了普通GPIO,或者进入了低功耗模式导致调试口失效。产品如果不需要二次烧录,这种做法无所谓;但如果量产时还要烧录MAC地址、序列号、校准数据,就千万不要在启动代码里复用调试引脚,务必保留调试口的功能。
万一已经出现这种问题,解决办法也是Connect Under Reset。原理是:在复位信号保持有效的窗口里,CPU不执行用户代码,调试器趁机完成握手,然后你还需要在复位释放的瞬间把调试口接管过来,操作起来有一定难度,建议提前演练,不要等到产线等着出货才去研究。
4.3 串口型芯片和系统级烧录的差异
前面讲的都是基于SWD/JTAG的调试口烧录,但整个烧录生态里还有两拨很常见的情况值得单独说。
第一拨是串口下载模式的芯片,典型代表是ESP32系列。ESP32要进入下载模式,必须让GPIO0在复位时保持低电平。很多开发板上设计了自动下载电路,通过串口的DTR/RTS信号自动控制GPIO0和EN引脚,不需要手动按键。但自动下载电路的逻辑在不同芯片版本、不同串口工具上表现并不一致,有些组合下会偶发失败。如果批量烧录失败率高,先确认串口工具的DTR/RTS电平逻辑是否和模组的自动下载电路匹配,其次降低串口波特率,把460800降到115200或更低,稳定效果立竿见影。
国产芯片平台,比如海思、全志这类,通常有各自专用的烧录工具和协议,排查思路基本一致,但工具链细节差别很大。换平台的时候不要沿用上一家的经验去硬套,先看官方烧录工具的日志和报错含义,往往能少走很多弯路。
第二拨是系统级整机烧录,比如树莓派、Jetson这类把完整系统镜像写入SD卡或eMMC的场景。它的问题重心跟芯片级烧录完全不同,更多集中在存储介质本身的质量、镜像文件完整性、写入工具是否正确。如果你发现系统烧录良率波动,优先检查SD卡/eMMC的来源一致性,再验证镜像的哈希值,最后排查写入工具的版本。这类问题跟芯片级烧录共享的排查逻辑是“先怀疑最基础的环节”,但具体手段差异很大。
另外提一句Motorola S-record(S19)格式的情况。S19是文本格式的固件记录,常用于NXP等车规平台。它和Intel HEX一样带地址字段,但地址位数和记录的格式有差异。烧录工具选择时要注意地址格式是否匹配,否则可能出现“烧录成功但固件跑到错误位置”的怪现象,校验能过,运行却异常。遇到这种问题,先核对工具的地址解析方式是否与S19文件格式一致。
5. 产线环境与流程管理:良率问题最后拼的是细节
5.1 ESD、温湿度对烧录的隐形影响
静电对烧录的影响非常隐性,但破坏力极大。冬天或者干燥地区,操作人员身上静电几千伏很正常。摸一下板子,静电从调试口接口串进去,可能直接导致握手失败,甚至把调试器端口打坏。所以烧录工位必须有防静电接地线,操作员要戴防静电腕带,桌面铺防静电垫,这是基本配置。有些产线会忽视治具本身的静电问题,塑料治具在摩擦过程中会起电,也需要用防静电材料或者定期做防静电处理。
温湿度的影响在于两头。湿度过低,静电问题加剧;湿度过高,探针和焊盘表面容易氧化,接触电阻变大。一般把产线环境湿度控制在40%-70%问题不大。这个数字听起来不起眼,但在一些没有空调的产线上,冬夏两季的烧录良率差异确实会体现出来。环境因素排查优先级低于接触和电源,但绝不能忽略。
5.2 治具设计与探针维护,别等良率掉了才查
针床治具是批量烧录的关键设备,但它不是装好就能用一辈子的。探针在焊盘上反复扎,针尖会磨损,弹簧行程会衰减,这些都会导致接触电阻漂移。建议制定探针点检制度,每周查看一次针尖状态,每月做一次接触电阻测试。接触电阻正常的回路应该在1Ω以内,如果出现明显上升,说明探针或者焊盘有问题,该换就换。
治具的压合力度也要关注。压得太轻,探针和焊盘接触不可靠;压得太重,焊盘会被压出凹坑甚至损伤。用测压计定期校验压合力,确保各探针的压力均衡。如果治具上用了转接板或者内部排线,这些连接器同样是老化隐患,排查时不要只盯着探针前端。
我有个习惯:治具每次保养后,都在点检表上记录日期、操作人、更换配件,同时记录保养后一周的良率数据。这样做的价值在于,当良率波动时,能快速判断是治具老化引起的,还是芯片批次变化引起的,不至于每次从头开始排查。
5.3 数据记录与工位差异分析
烧录数据如果不记录,排查良率问题就像盲人摸象。每条产线、每个工位最好单独记录烧录结果,而且记录要具体到失败阶段:是连接失败、擦除失败、写入失败,还是校验失败。不同失败阶段指向的问题完全不同。连接失败多与接触、电源、芯片状态有关;擦除失败多与Flash算法、芯片保护有关;写入失败多与电源稳定性、接口配置有关;校验失败多与线缆、速度、固件完整度有关。
有了数据后,分析逻辑就清晰了。如果只有某一个工位良率低,问题大概率在该工位的治具、探针、调试器上,优先做物理层排查。如果所有工位良率同时下降,则更可能是芯片批次、固件版本、环境突变这类共性因素。把按工位统计良率这个动作放到日常管理中,能省掉大量排查时间。
5.4 烧录问题速查表:现象、原因、优先级
把常见烧录失败现象和排查优先级整理成一个速查表,方便产线现场快速定位。
| 现象 | 最常见原因 | 排查优先级 |
|---|---|---|
| 连不上芯片,提示No target | 探针接触不良、线缆断开、芯片没上电 | 先查物理连接,再看供电 |
| 连接正常,一擦除就报错 | Flash算法选错、RDP保护 | 检查烧录配置和算法列表 |
| 烧录到一半失败,错误随机 | 电源瞬态跌落、SWCLK线长或速率过高 | 示波器看VDD波形,降低速度 |
| 校验失败 | 线缆干扰、固件文件损坏、地址偏移错误 | 降低速度,核对固件地址和哈希 |
| 第一次能烧,第二次连不上 | 调试口被固件复用、RDP被开启 | 用Connect Under Reset,查固件启动代码 |
| 特定工位批量失败 | 探针老化、该工位治具损坏 | 重点排查该工位治具和设备 |
| 全工位同时失败 | 调试器驱动问题、芯片批次变化 | 查共用驱动和设备,查批次信息 |
| 串口芯片偶发失败 | 下载模式引脚状态不对、波特率过高 | 确认GPIO0电平,降低波特率 |
这个表是经验沉淀,不是理论推导。现场出现烧录良率波动时,按表格从上往下过一遍,大多数问题能在十分钟内定位。
最后分享一点个人体会。烧录良率上不去的时候,最容易犯的错是直接怀疑芯片或者固件。我统计过自己处理过的案例,超过八成的问题出在接触、电源、配置这些外围环节,芯片本身反倒是最后才需要怀疑的对象。排查顺序永远是:先从物理连接查起,再看电源波形,然后检查工具链配置,最后才轮到芯片状态和产线管理。产线上常备一台示波器,遇到问题先看SWCLK/SWDIO波形和VDD跌落,就不会做无头苍蝇。另外,排查过程记得做记录,哪怕只是日期、现象、处理方法三行字,积累一段时间后回头看,那些记录就是最宝贵的排障数据库。