做嵌入式这些年,烧录这个环节经常被当成“插上就能用”的小事。结果产线一跑起来,烧录良率掉到九成以下,大家才急着到处找原因。更麻烦的是,烧录失败往往不是单一因素,而是好几个环节叠加出来的问题。很多工程师一上来就怀疑芯片本身,批量退料、找原厂FAE,折腾一圈之后发现,问题其实出在自己这边——线太长、供电不足、型号选错、文件格式不对、甚至烧录器固件版本太低。
这篇文章我想从实际排查的角度,把烧录良率相关的关键环节系统地捋一遍。不管你是用J-Link、ST-Link、OpenOCD烧STM32,用esptool烧ESP32,还是用Flash Download Tools、CCS、Vivado、海思烧录工具处理不同的目标平台,底层逻辑其实是通的:硬件链路、通信握手、工具配置、芯片状态、批量工装,这五大块是绝大多数烧录问题的源头。
1. 烧录良率问题,先别怪芯片
先说一个我踩过很多次的坑。烧录失败率突然升高的时候,我第一反应也曾经是“这批芯片是不是有问题”。后来做了几次交叉验证才发现,真正因为芯片本身损坏导致烧录失败的,比例非常低。更大的问题在烧录环境和操作细节上,尤其是硬件链路的稳定性。
1.1 烧录失败的大头往往在硬件链路
烧录的本质是调试器/烧录器通过协议(SWD、JTAG、UART、SPI等)和目标芯片通信,把程序写进Flash/RAM。这个过程对信号质量的要求比很多人想象的高。芯片上电瞬间、Flash擦写瞬间,电流都会有一个明显的尖峰,如果供电线太细、接触电阻偏大,电压就会跌落,烧录器一侧可能还在正常通信,芯片已经因为欠压复位置位了,表现出来就是烧录中途报错、校验失败、甚至“擦除成功但写入失败”。
我见过最典型的一个案例:产线用排针转接线做SWD烧录,线束长度将近半米,GND只连了一根杜邦线。结果就是烧录一次成功一次失败,没有任何规律。后来把GND改成两根并联,线长压到15厘米以内,问题立刻消失。别小看这种简单改动,在批量产线上,它可能就是那5%到10%良率差距的来源。
还有一类问题是接触不良。烧录座的探针用久了会氧化、磨损,或者目标板的测试点氧化,造成偶发性接触电阻变大。这种问题最难受,因为它不是100%失败,而是时好时坏,容易让人误判为“干扰”“芯片批次问题”。我现在的做法是:一旦出现间歇性烧录失败,先用万用表量一下探针到芯片引脚的导通电阻,超过0.5欧姆就要警惕了,定期清洁和更换探针是产线管理里必须写进点检表的步骤。
1.2 供电与地线的细节决定成败
很多人烧录的时候不单独供电,指望烧录器通过调试线给目标板供电。这在小功率场景下没问题,但如果目标板上还有传感器、LED、甚至电机驱动之类的外设,电流需求一上来,烧录器那点输出能力根本扛不住。
这里有两个建议:
- 烧录时尽量用独立的稳定电源给目标板供电,不要在烧录过程中让调试器同时扮演电源角色。
- 如果必须由烧录器供电,确认烧录器说明的电流上限,并且关掉目标板上不必要的负载。
地线连续性也是老生常谈但总被忽略。烧录器、目标板、示波器、逻辑分析仪这些设备如果接在不同的插座上,地电位可能不一致,轻则通信不稳定,重则烧坏接口。我吃过一次亏之后,在实验室和产线都强制要求“所有调试设备共地”,这个原则比什么高级配置都管用。
2. 连接握手和通信参数:很多问题从第一步就埋下了
烧录工具首先要和目标芯片建立连接,这个过程一般叫“连接握手”或“IDCODE读取”。工具通过JTAG/SWD协议读取芯片的ID、状态,然后才能执行擦除、编程、校验。这一步失败的原因,很多时候和工具配置直接相关。
2.1 “连不上设备”最常见的三个信号
我总结了三个高频现象,分别对应不同的原因:
- 完全检测不到目标:现象是烧录工具不断报“Cannot connect to target”或者“No target connected”。优先检查目标板供电、复位引脚状态、调试接口接线是否接反、芯片是否处于低功耗模式。STM32如果开启了读保护,SWD也会连不上,这个我后面单说。
- 能读到ID但不稳定:读到的ID有时候对有时候错,比如明明是STM32F103却偶尔读出0xFFFFFFFF。这种大概率是信号质量问题,或者SWDIO/SWCLK线之间串扰。降低烧录时钟频率、缩短线长,是首选解法。
- 能连接但擦除/编程时报错:这种通常不是连接问题,而是后续的Flash算法、地址、电源稳定性问题。比如擦除大扇区时电流过大导致电压跌落。
一个小技巧:先用烧录工具自带的命令行做一次纯连接测试,比如J-Link的“jlink.exe -device STM32F103C8 -if SWD -speed 4000 -autoconnect 1”,看能不能稳定读到ID。这一步能快速把“硬件链路问题”和“配置问题”切分开。
2.2 时钟速率和线缆长度怎么搭配
SWD和JTAG的时钟速率不是越高越好。速率越高,对线缆质量、接触电阻、布局干扰越敏感。产线上用几块钱的排线,速度拉满,结果失败率飙升,这种情况我见得太多了。
实话说,没有绝对精确的公式,但我自己的经验值是:
- 线长小于10厘米,SWD时钟可以跑4MHz以上。
- 线长10到20厘米,建议降到1MHz到2MHz。
- 线长超过20厘米,老老实实降到500kHz以下,甚至100kHz。
有人觉得降速会拖慢产线节拍,其实算一笔账就清楚了。一次烧录本身可能只要几秒到几十秒,速度慢一点,多花的时间是毫秒级到百毫秒级的;但一次失败带来的返工、排查、记录,至少浪费几分钟。两相比较,降速反而划算。这也是为什么我在产线配置里,宁可用更保守的时序,也要保证一次成功率。
3. 工具链配置和固件文件:文件对了,烧录就成功一半
硬件没问题、连接也稳定,剩下就要看工具链配置和固件文件了。这一块是纯软件层面的坑,但反而是很多工程师容易忽略的地方,因为它的出错方式很隐蔽——不是“连不上”,而是“烧进去跑不起来”或者“烧录成功但校验失败”。
3.1 芯片型号、Flash大小、IDCODE这三件事
第一,目标芯片型号必须选对。很多调试器允许手动选型号,选错了有时候也能连上,但烧录算法可能用的是另一颗芯片的Flash驱动,轻则FAIL,重则把Flash内容写坏(少见但存在)。第二,Flash大小不能配错。比如芯片实际只有64KB Flash,你在工具里配成128KB,烧录超过64KB的数据时,工具会报地址越界或写入失败。第三,IDCODE校验。有些工具支持在连接后自动校验IDCODE,这个功能在产线上强烈建议打开,可以自动拦截放错料的批次。
我自己遇到过一种情况:同一块板子,有时候J-Link能连上,有时候连不上,换了电脑也一样。后来发现是板子上一颗芯片的IDCODE和工具里手动指定的型号不一致——物料批次换了丝印相近的型号。模块化思维很重要:把型号选择视为烧录配方的一部分,和固件文件、烧录地址、校验方式一起管理起来,而不是依赖每个操作员手工选择。
3.2 Hex、Bin、ELF、S19:格式选错了也白搭
烧录文件的格式看着简单,实际坑很多。我用一张表总结一下常见的区别:
| 格式 | 特点 | 适用场景 |
|---|---|---|
| Hex(Intel HEX) | 文本格式,带地址信息,可以烧录到指定地址 | 通用MCU烧录,J-Flash、ST-Link、SmartFlash等 |
| Bin | 纯二进制,不带地址,烧录时必须手动指定起始地址 | 固件升级、产线镜像烧录,需特别注意偏移 |
| ELF | 编译产物,包含符号表和加载地址,工具能自动解析 | 调试器在线调试、IDE直接烧录 |
| S19/SREC(Motorola S-record) | 文本格式,早期Bootloader常用,地址和长度都记录在内 | 老平台Bootloader、DSP、某些汽车电子方案 |
重点说Bin文件。它本身没有地址信息,如果你在工具里选的起始地址和生成固件时的链接地址不一致,程序即使烧进去也跑不起来。很多“烧录成功但板子不工作”的案例,根因就是Bin文件烧录地址错了。处理办法:如果用J-Flash这类工具,加载Bin文件时一定要核对“Download File”页面里的地址参数是否和编译工程的FLASH起始地址一致。
另外,Motorola S19格式在传统车载、工业方案里还在大量使用,热词里有人提到“S19固件烧录记录分解”,其实就是S19每行记录都包含地址、长度、数据、校验,格式本身自描述,很适合做Bootloader升级。如果你做的是产线烧录,最好固件发布时同时产出Hex和Bin两种格式,Hex给通用烧录器用,Bin给Bootloader或网络升级用,避免现场临时转换出错。
3.3 下载算法与校验选项
对于ARM Cortex-M系列,烧录器需要一套Flash下载算法(FLM文件)来执行擦除和编程。工具里选择的Device实际上就绑定了对应的FLM。问题是,有时用户自己建了工程,Device选了个接近的型号,或者手动指定了FLM,结果遇到“Erase failed”“Program failed”这类问题。
我的经验是:尽量使用官方工具链推荐的Device列表(比如Keil的Pack、STM32CubeProgrammer的数据库),不要手动乱指FLM。如果你用的是OpenOCD做批量烧录,脚本里指定target时要和芯片型号严格对应,比如stm32f1x、stm32f4x这些cmd文件不要张冠李戴。OpenOCD的好处是脚本化、可控性强、成本低,但配置成本也高,适合有一定调试基础的团队。
校验选项方面,我建议产线强制开启“烧录后校验”或者“Read Back”功能。虽然这会多花一点时间,但能拦截绝大部分烧录不良。有一种情况很隐蔽:芯片Flash内部有坏块(老芯片或拆机料容易有),擦除和编程可能报告成功,但读回的数据不一致。开了校验,这类芯片就会被拦住,不会流到下一道工序。
4. 芯片状态和生命周期:锁死的芯片不是坏芯片
有些芯片拿过来就是“连不上”的状态,但这不代表它坏了。芯片内部的保护选项、调试端口配置、以及物料批次差异,都会影响烧录成功率。
4.1 读保护/写保护与全片擦除
STM32和很多Cortex-M芯片都有一级读保护(RDP)、二级读保护等选项。一旦芯片被设置了读保护,外部调试器默认无法连上,后续烧录也会被拒绝。解决方法是执行“全片擦除”(Mass Erase)或“解除保护”。但要注意,二级读保护在某些芯片上是不可逆的,一旦打开,芯片基本等于废弃。所以产线上的烧录配方里一定要明确:不要在预烧录阶段开启二级保护,要开也是在最后阶段由特定工位操作。
ESP32也有类似情况,eFuse里可以烧断某些安全位,烧断后JTAG/串口下载可能被禁用。这东西一旦烧断也是不可逆的,批量生产时千万要确认eFuse配置是最终版本再量产。
还有一个相关但容易忽略的点:有些芯片默认从调试接口的某个引脚启动时会有特殊行为。比如STM32F405的SWD引脚如果被代码复用为普通GPIO,那调试接口就废了。遇到这种情况,可以通过拉高BOOT0引脚,让芯片从系统存储器启动,从而绕过应用代码,再擦除Flash或调整选项字节。我印象里热词里有人专门提到“STM32F405 SW脚配置错误重新烧录”,就是这个场景的典型。
4.2 预烧录批次和新批次差异
批量采购的芯片有时会带有原厂预烧录的Bootloader,甚至已经设置了保护位。尤其是无线SoC、蓝牙芯片、Wi-Fi模组这一类,出厂可能自带固件和不同的烧录口状态。换供应商或者换批次之后,原先好好的烧录工位突然大面积失败,先别急着怀疑操作员,很可能是这批芯片的初始状态变了。
排查方法很简单:随机抽几颗新批次芯片,看它们默认能不能被烧录工具识别,读一下IDCODE、Option Bytes和Flash内容。把新批次芯片的初始状态和旧批次做对比,如果差异明显,要么让供应商出出厂配置报告,要么调整烧录流程做“解锁+全片擦除”预处理。
5. 产线批量烧录场景的良率提升
上面聊的更多是单台设备调试时的烧录问题。到了量产阶段,烧录良率还和工装、流程、数据管理密切相关。这一节聊聊我从产线管理角度总结的一些经验。
5.1 治具与探针:重复定位精度直接影响一次通过率
批量烧录时,板子通常放在烧录治具里,通过探针和烧录器相连。治具的重复定位精度如果不够,每次压合时的接触压力、接触位置都会有偏差,导致接触电阻不稳定。别觉得这是机械问题就和烧录无关——我见过一个项目,烧录良率从98%掉到90%,最后查下来是治具的定位销磨损了,每次放板子都有零点几毫米的偏移。
建议产线定期做三件事:
- 用标准样板测试每次压合后的连接电阻,记录数据,超过阈值就换探针。
- 检查治具压合结构,看弹簧探针的回弹是否正常。
- 对烧录座进行寿命管理,比如设定压合次数上限,到数就保养或更换。
5.2 多通道并行烧录的同步问题
很多产线为了提高效率,一台PC拖多个烧录器,同时烧多块板。这里有个隐藏问题:多个烧录器同时工作时的电流冲击、USB带宽竞争、甚至电脑电源的稳定性。USB接口供电不足时,多通道烧录会偶发失败。我自己遇到过4通道同时烧录,只有2号通道经常失败,最后发现是那个USB HUB供电不行,换个带外部供电的HUB就好了。
另外,并行烧录建议所有通道使用相同的烧录配置和固件版本,避免因为操作员手动改了某个通道的参数导致批量不良。更稳妥的做法是做一个烧录主控脚本,每条命令都带哈希校验,或者用产线烧录软件统一管理。产线上任何“人工记忆参数”的行为都是良率杀手。
5.3 一次成功率 vs 返修成本
量产阶段,任何一个烧录失败都可能带来连锁成本:记录、返修、重新烧录、甚至拆机。所以我的原则是“抓一次成功率”,而不是“抓烧录速度”。节拍快但不良多,整体效率并不高。可以通过几个不起眼的动作提升一次成功率:
- 烧录前自动检测目标芯片ID和空片状态,不符合预期直接报警。
- 烧录后立即校验,校验不过的板子自动标记,不在产线上反复试烧。
- 记录每一块板的烧录次数、烧录时间、错误码,方便做趋势分析。
如果烧录失败的板子反复出现在同一个工位,大概率是那个工位的治具或线缆问题,而不是芯片问题。
6. 从现象到根因:几个真实排查案例
相比抽象的原理,具体案例可能更能帮你建立排查感觉。我从日常工作中挑了三个比较典型的场景,分别对应串口下载、SWD下载、以及重型工具链烧录,每个都有代表性。
6.1 ESP32 串口自动下载失败排查
ESP32的串口下载依赖EN引脚(复位)和IO0引脚(Boot模式)的时序配合。正常的自动下载流程是:拉低IO0 -> 拉低EN复位 -> 释放EN -> 芯片进入下载模式。如果用的是官方板卡和标准USB转串口芯片,一般没问题;但自己做硬件时,很容易在RTS/DTR信号控制上出纰漏。
有一次排查ESP32-C3烧录失败,表现是esptool能检测到串口,但一直卡在“Connecting…”,进不了下载模式。查了一圈,发现是板子上的EN引脚RC复位电路时间常数太长,自动下载电路拉低EN的时间不够,芯片还没来得及复位,IO0时序就错了。解决办法是在EN引脚上调整RC参数(减小电容值),或者把自动下载电路的那两个三极管/MOSFET逻辑重新梳理。这个问题在ESP32-S3、C3、C6上都可能遇到,排查时可以先用esptool manual reset模式人肉配合按键应付,再回头找硬件原因。
另一个ESP32常见坑是Flash电压。某些模组工作在1.8V Flash电压,而烧录工具默认按3.3V判断,会导致擦除或写入失败。使用Flash Download Tools或esptool时,如果目标板是特殊电压设计,要确认命令参数和板级配置一致。
6.2 STM32 SWD连接超时排查
SWD连不上的经典戏码,我拿一次实际经历说。客户反馈一块定制板(STM32F407)在产线烧录时,ST-Link偶尔报“Error: Flash Download failed - Target DLL has been cancelled”,而且是30%左右的概率。一开始怀疑是芯片问题,换了批次也一样。后来用示波器去抓SWDIO和SWCLK波形,发现时钟高电平有明显的毛刺,再追下去,发现SWCLK走线旁边有一根高频PWM线,耦合非常严重。
处理方式是:把SWCLK、SWDIO在PCB上包地,并且把烧录线换成屏蔽线,同时把SWD速率从4MHz降到1MHz。从那以后,这个板子的烧录一次成功率基本稳定在99%以上。
还有一次是因为BOOT0引脚悬空造成的。板子设计时BOOT0直接悬空,理论上内部下拉可以保证从Flash启动,但产线上部分板子受干扰会意外进入系统存储器模式,应用代码不运行,调试器虽然能连上,但烧录后测试就是不过。后来硬件上把BOOT0加了10k下拉电阻,并在产线烧录流程里增加了“烧录后读IDCODE+运行状态确认”,问题才彻底解决。
6.3 DSP与FPGA烧录的特殊注意事项
DSP和FPGA的烧录方式跟ARM系列不太一样,这里也值得单独提醒。CCS烧录DSP时,如果目标芯片是C6748这类带AIS引导的器件,串口烧录一般依赖Boot引脚配置。很多人烧录失败是因为Boot Mode没设置在“UART Boot”或“SPI Boot”,或者没先擦除EEPROM/SPI Flash。此时排查要围绕“芯片到底从哪个介质启动”展开,别盲目反复烧录。
FPGA在Vivado里的烧录流程,重点要区分“SRAM配置”和“Flash配置”。SRAM配置是一次性的,掉电就没;Flash配置才是真正固化。如果你在Vivado里只选了Program Device,烧完了觉得“已经固化”,那是误解。必须使用Program Configuration Memory Device,选择对应的Flash型号,并且设置好地址和镜像格式(比如SPIx4、BPI等)。FPGA的Flash型号选错往往不会立刻报错,而是烧录完上电没反应,这个坑很典型。
同样,海思等机顶盒/视频处理平台的烧录,要看芯片的启动模式引脚和对应烧录工具版本,稍有不对就会“识别不到芯片”或“下载到一半失败”。这种平台级烧录的排查思路其实和其他平台一样:先确认串口/网口/USB能否枚举,再确认启动模式,最后确认烧录工具和固件格式。
7. 一个可以抄作业的烧录排查清单
最后分享一个我实际贴在工位上的排查清单,希望能帮你快速收敛问题范围。排查烧录问题最怕的是东一榔头西一棒子,按照顺序排查,大多数问题能在十分钟内定位。
7.1 排查顺序速查表
| 步骤 | 检查内容 | 常见处理方法 |
|---|---|---|
| 1 | 目标板供电电压、电流、稳定性 | 示波器抓上电波形,检查独立供电 |
| 2 | GND连接、烧录线长度、接触电阻 | 缩短线长、双GND并联、清洁/更换探针 |
| 3 | 芯片ID是否能稳定读取 | 降低烧录时钟、更换USB口/HUB |
| 4 | 芯片是否有读保护/写保护 | 执行全片擦除/解锁,确认保护等级 |
| 5 | BOOT引脚、复位电路状态 | 检查BOOT0/EN/复位引脚电平 |
| 6 | 烧录文件格式和起始地址 | 核对Hex/Bin地址、链接脚本、下载偏移 |
| 7 | 烧录算法/FLM/Device型号 | 使用官方工具链默认配置 |
| 8 | 校验选项 | 开启写后读回校验,防止使用坏块 |
| 9 | 治具、探针、操作手法 | 压合检查、定期点检、规范操作SOP |
| 10 | 批次差异和物料变更 | 查原厂出厂配置、换批次交叉验证 |
这个表不是一层不变的,你可以根据自己产品的特点调整优先级,但核心思路是:先链路、后配置、再芯片状态,最后才是批次和物料。不要一开始就怀疑人生,先去量电压。
7.2 数据记录与趋势分析
排查完只是解决当下问题,更长久的事情是把每次烧录的结果记录成数据。我建议至少记录以下字段:烧录工位、操作员、烧录时间、芯片型号、固件版本、烧录器序列号、错误码、失败原因。用Excel甚至MES系统都行,关键是坚持记录。
有了数据之后,你会发现一些很有意思的规律。比如某条产线在下午时段失败率更高,可能是电压波动;某个烧录器序列号出问题的概率显著高于其他,说明这台设备该维护了;某一批固件发布后失败率上升,可能是固件配置项变了。这种趋势分析比单纯“坏了就修”高效得多,也更容易说服管理层投入资源改善产线基础设施。
烧录这事,看着是个小环节,但它卡住了,产线就得停。我的体会是,烧录良率其实是硬件设计、工具配置、产线管理三者的综合体现。不一定需要多昂贵的设备,把该拧的螺丝拧紧、该看的波形看清、该记的数据记全,良率自然会给你正向反馈。最后再多说一句,任何一个看起来“玄学”的烧录问题,背后基本都能找到具体的物理原因或配置原因,关键是我们愿不愿意一层层剥开去看。