ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

芯片烧录版本管理:量产阶段的可追溯与防呆实践

芯片烧录版本管理:量产阶段的可追溯与防呆实践 1. 烧录版本管理为什么是量产阶段最隐蔽的雷区芯片烧录这个环节单看技术难度并不高——把固件写进芯片校验通过完事。但真正在产线上待过的人都知道烧录工站出批量事故的概率远比SMT贴片、AOI检测这些看起来更复杂的工序要高。原因不复杂贴片偏了AOI能看出来焊接虚了X-Ray能照出来但烧录版本错了芯片外观一模一样功能测试可能也过直到整机装到客户手里才发现某个功能不对——这时候已经发出去几千台了。我见过最典型的一次事故某项目在试产阶段验证的是V1.3固件量产时工程部更新到了V1.4但烧录工站的操作员用的还是桌面上的V1.3烧录工程文件。两条产线同时跑一条用的是新文件一条用的是旧文件混在一起出货。最后是靠客户反馈“为什么有的机器蓝牙名字不一样”才发现的。这个问题的根因不是技术是版本管理流程缺失。烧录程序版本管理要解决的核心问题就三个谁在什么时间把哪个版本的固件烧进了哪一批芯片。听起来简单但要在产线上做到可追溯、防呆、可审计涉及的东西比想象中多得多。它牵扯到固件文件的命名规范、烧录工装的配置管理、MES系统的工单绑定、ERP的物料批次追溯甚至还包括烧录器本身的固件版本和烧录算法版本。这篇文章适合几类人看一是负责产线烧录工站的工艺工程师二是做嵌入式开发需要交付固件给产线的研发人员三是负责MES/ERP系统对接的产品经理四是管品质和追溯体系的QA。不管你是刚接手烧录工站的新人还是想梳理现有流程的老手下面这些内容都是我实际踩过坑之后总结出来的可以直接拿去对照检查。2. 烧录版本管理的整体设计思路2.1 为什么不能靠“文件夹命名”来管版本很多小团队一开始的做法很朴素固件放在共享盘上文件夹名字叫“20240315_正式版_不要删”里面放一个hex文件和一个readme。这种做法在研发阶段勉强能用一旦进入量产就是灾难。原因有几个第一共享盘的权限管理形同虚设谁都能往里扔文件第二文件夹名字可以随便改改了之后没有任何审计记录第三烧录工站的操作员未必知道哪个文件夹是最新的全靠口头通知第四出了问题想追溯“这批货烧的是哪个版本”只能靠翻聊天记录。我并不是说文件夹管理完全不能用而是说它只能作为辅助手段不能作为唯一的版本管理机制。真正可靠的方案是把版本信息嵌入到烧录工程文件本身和MES工单两个层面让烧录动作和版本信息强制绑定。2.2 版本号的命名规则怎么定才不容易乱版本号命名这件事看起来是小事实际上是最容易出问题的地方。我见过用日期命名的、用字母递增的、用Git commit hash的、甚至用“最终版”“最终版2”“最终版真的最终版”的。这些命名方式在研发内部可能没问题但到了产线就会出乱子。我的建议是采用四段式版本号产品代号_主版本.次版本.修订号_构建日期。比如PRJ_A1.2.3_20240315。主版本号在硬件方案变更时递增次版本号在功能增减时递增修订号在bug修复时递增构建日期用于区分同一天多次构建。这个规则的好处是任何人看到版本号就知道这个固件的大致状态不需要去查文档。更重要的是版本号必须写入固件的某个可读取位置。比如在Flash的固定地址存放一个结构体包含版本号、构建时间、Git commit hash。这样即使烧录工程文件被替换了通过读取芯片内的版本信息也能发现问题。STM32系列可以用__attribute__((section(.version)))把版本信息放到指定段nRF51822这类芯片可以在Flash末尾预留一页专门存版本信息。2.3 烧录工程文件的管理策略烧录工程文件比如JFlash的.jflash文件、CCS的.ccxml配置、或者量产烧录器自己的工程文件包含了芯片型号、烧录算法、地址范围、选项字节配置等关键信息。这些文件一旦配错轻则烧录失败重则把芯片锁死。我的做法是烧录工程文件必须纳入Git管理和固件源码放在同一个仓库里。每次固件发布时对应的烧录工程文件也要打Tag。产线使用的烧录工程文件只能从Git仓库的Release页面下载不允许从个人电脑拷贝。下载后要校验SHA256确保文件没有被篡改。对于使用JFlash产线模式的场景可以把烧录工程文件和固件合并成一个.jflash工程固件以相对路径引用。这样只要工程文件正确固件就不会错。但要注意JFlash的工程文件里如果用了绝对路径换一台电脑就会失效所以一定要用相对路径。2.4 MES工单与烧录版本的绑定逻辑MES系统在烧录环节的核心作用是防呆和追溯。防呆的意思是如果工单要求的固件版本和烧录工站实际加载的版本不一致系统应该阻止烧录动作。追溯的意思是每一颗芯片烧录完成后MES要记录工单号、版本号、烧录时间、操作员、烧录结果。实现这个逻辑有几种方式。最简单的是扫码绑定操作员先扫工单条码MES根据工单号查询对应的固件版本然后烧录软件通过API向MES请求当前应该使用的版本号MES返回版本号后烧录软件自动加载对应的固件文件。这种方式对烧录软件的定制化要求较高但防呆效果最好。另一种方式是事后校验烧录完成后操作员扫描芯片上的条码MES读取芯片内的版本信息和工单要求的版本比对不一致就报警。这种方式实现简单但只能在烧录后发现问题不能提前阻止。还有一种折中方案工单与烧录器绑定。每台烧录器在MES中注册一个ID工单下发时指定使用哪台烧录器。烧录器启动时从MES拉取工单信息和对应的固件版本如果本地固件版本不匹配就拒绝启动。这种方式适合烧录器数量不多、工单切换不频繁的场景。3. 核心细节解析与实操要点3.1 固件文件的完整性校验怎么做固件从研发电脑传到产线烧录电脑中间可能经过共享盘、U盘、邮件、甚至微信。每一次传输都可能引入损坏或篡改。所以固件文件必须有完整性校验机制。最基本的做法是SHA256校验。研发发布固件时同时发布一个.sha256文件产线下载后先校验再使用。Windows下可以用certutil -hashfile firmware.hex SHA256Linux下用sha256sum firmware.hex。校验不通过就重新下载不要抱有侥幸心理。更进一步的做法是在固件内部加入CRC校验。烧录器在烧录完成后读取芯片内的固件计算CRC并与预期值比对。JFlash支持在烧录后自动校验但默认只校验写入的数据不校验芯片内实际存储的数据。需要在工程设置里开启“Verify after programming”选项。对于nRF51822这类带SoftDevice的芯片还要注意SoftDevice、Bootloader、Application三部分的版本兼容性。nRF5 SDK的版本管理比较特殊SoftDevice的版本号如S130 v2.0.1和SDK版本号如nRF5 SDK 15.3.0是独立的。烧录时如果SoftDevice版本和Application不匹配芯片可能无法启动。我的做法是在MES工单里同时记录SoftDevice版本和Application版本烧录时分别校验。3.2 烧录器固件和烧录算法版本的管理这是一个经常被忽略的点烧录器本身的固件版本和烧录算法版本也会影响烧录结果。比如J-Link的固件版本从V6升级到V7后某些老芯片的烧录速度会变化甚至出现兼容性问题。再比如某些量产烧录器如Elnec、XELTEK的烧录算法文件需要定期更新以支持新芯片。我的建议是烧录器固件版本和烧录算法版本必须记录在MES的工单里。每次烧录器固件升级或算法更新都要在MES里做变更记录并且用一批试产芯片验证后再用于量产。不要小看这个细节我遇到过因为烧录器固件升级导致某颗MCU的选项字节被意外修改结果芯片上电后直接进入Bootloader模式整批货返工。对于J-Link可以用JLink.exe -CommanderScript执行脚本获取当前固件版本。对于量产烧录器一般厂商会提供版本查询命令。这些信息都应该自动上报到MES而不是靠人工记录。3.3 烧录工站的防呆设计防呆设计的核心思想是让操作员想犯错都犯不了。具体到烧录工站可以从以下几个层面入手。第一层是物理防呆。不同产品的烧录工装使用不同的接口或不同的针脚定义插错就插不进去。比如A产品用6pin的pogo pinB产品用8pin的物理上就不兼容。这一层成本最低但效果有限因为同一产品不同版本的固件可能共用同一个工装。第二层是软件防呆。烧录软件启动时自动读取工单信息加载对应的固件文件。如果操作员手动选择了错误的文件软件弹出警告并拒绝烧录。这一层需要烧录软件支持API对接MES或者至少支持从配置文件读取版本信息。第三层是流程防呆。操作员在烧录前必须扫描工单条码和物料条码MES校验两者匹配后才允许烧录。烧录完成后MES自动记录烧录结果。这一层需要MES和烧录设备的深度集成。第四层是检测防呆。烧录完成后通过功能测试或版本读取来验证烧录结果。比如让芯片进入某个测试模式通过串口输出固件版本号和工单比对。这一层是最可靠的但会增加测试时间。实际产线上我一般建议至少做到第二层和第三层。第一层作为辅助第四层根据产品的重要程度决定是否采用。3.4 版本变更的审批和通知流程固件版本变更不能是研发一个人说了算。每次版本变更都应该走ECN工程变更通知流程通知到产线、品质、采购等相关部门。ECN里要写清楚变更内容、变更原因、影响范围、生效时间、旧版本的处理方式。我见过一个反面案例研发修复了一个bug直接把新固件扔到共享盘在群里发了句“固件更新了大家用新的”。结果产线正在生产的一批货一半用旧固件一半用新固件客户收到后发现有功能差异投诉到品质部。品质部一查发现根本没有ECN记录研发说“我在群里通知了啊”。这种沟通方式在十人以下的小团队可能勉强能用超过二十人的团队必然出问题。ECN流程不需要很复杂一张表格就够了变更编号、变更日期、变更人、变更内容、影响产品、生效批次、旧版本处理、审批人。关键是要留痕并且通知到所有相关方。MES系统可以在工单下发时自动检查是否有未关闭的ECN如果有就阻止工单下发。4. 实操过程与核心环节实现4.1 从研发到产线的固件发布流程一个完整的固件发布流程应该包含以下步骤。第一步研发在Git仓库上打TagTag名称就是版本号。比如PRJ_A1.2.3。Tag对应的commit必须是通过所有测试的commit。第二步CI系统如Jenkins、GitLab CI自动构建固件生成hex/bin文件和对应的SHA256文件。构建产物上传到制品库如Nexus、Artifactory并记录构建日志。第三步研发在ECN系统里提交变更通知附上版本号、变更内容、测试报告。ECN审批通过后制品库里的固件才被标记为“可发布”。第四步产线工程师从制品库下载固件和烧录工程文件校验SHA256后导入到烧录工站的电脑上。导入时要记录导入时间、导入人、文件哈希值。第五步MES系统更新工单模板把新版本号关联到对应的产品工单上。新工单下发时自动使用新版本。这个流程看起来繁琐但每一步都有其必要性。我实际推行的时候最大的阻力来自研发——他们觉得“我改个bug还要走这么多流程”。我的应对方式是把流程自动化。CI构建和制品上传全自动ECN审批走电子流产线导入用脚本一键完成。研发只需要打Tag和填ECN其他都是自动的。这样推行下去阻力就小很多。4.2 JFlash产线模式的配置要点JFlash是SEGGER提供的烧录工具支持产线模式Production Programming。产线模式的特点是操作员只需要点击“Start”按钮不需要选择文件、不需要配置参数。所有的配置都预先写在工程文件里。配置JFlash产线模式的关键步骤创建工程文件时选择正确的芯片型号和烧录算法。烧录算法文件.FLM必须和芯片型号严格匹配。比如STM32F103C8和STM32F103CB的Flash算法可能不同选错了会导致烧录失败或数据错误。在“Production”选项卡里设置“Program”、“Verify”、“Secure”等选项。对于量产一般建议开启“Program”和“Verify”关闭“Secure”除非有特殊需求。设置“Exit behavior”为“Exit after programming”这样烧录完成后JFlash会自动退出方便产线自动化脚本调用。如果使用J-Link Pro或J-Link Ultra可以开启“Production Programming”模式支持多路烧录。但要注意多路烧录时每路的速度会下降需要根据产线节拍调整。工程文件保存时固件路径使用相对路径。比如.\firmware\PRJ_A1.2.3.hex。这样整个工程文件夹可以打包拷贝到任何电脑上使用。在JFlash的安装目录下有一个JLinkDevices.xml文件里面定义了芯片的烧录算法。如果使用的是非官方支持的芯片需要手动添加算法文件。这个文件也要纳入版本管理。我实际使用JFlash产线模式时遇到过一个坑JFlash的工程文件里如果勾选了“Erase sectors before programming”而芯片的某些扇区被写保护了烧录会失败。解决方法是先在工程里取消勾选或者用J-Link Commander手动解除写保护。这个细节在JFlash的文档里没有明确说明是我踩坑之后才搞明白的。4.3 CCS烧录DSP程序的版本管理CCSCode Composer Studio是TI的DSP开发环境烧录DSP程序的方式和ARM芯片不太一样。DSP一般通过JTAG或Emulator烧录烧录文件是.out文件COFF格式或.hex文件。CCS的烧录配置保存在.ccxml文件里这个文件定义了目标芯片型号、连接方式、时钟频率等。和JFlash一样.ccxml文件也要纳入版本管理。DSP烧录的一个特殊之处是DSP的固件可能包含多个核心的程序。比如C6678有8个核每个核跑不同的程序。烧录时需要分别加载每个核的.out文件。如果版本管理没做好可能出现核0跑了V1.2核1跑了V1.1的情况。这种问题在功能测试时很难发现因为每个核单独看都是正常的。我的做法是在CCS工程里创建一个“多核烧录配置”把所有核的.out文件路径写在一个配置文件里。烧录时CCS自动按顺序加载。这个配置文件也要纳入Git管理和.out文件一起发布。另外DSP的烧录速度比较慢尤其是通过JTAG烧录大容量程序时。产线节拍紧张的话可以考虑使用量产烧录器如XDS560v2或者预先烧录好Flash再贴片。但无论哪种方式版本管理的逻辑是一样的。4.4 MES工单与烧录数据的对接实现MES和烧录设备的对接方式取决于烧录设备的开放程度。J-Link提供了J-Link SDK和J-Link Commander可以通过命令行或API控制烧录过程。量产烧录器一般也提供SDK或命令行工具。一个典型的对接流程是这样的操作员在MES终端扫描工单条码MES查询工单信息获取产品型号、固件版本、烧录器ID。MES通过API向烧录工站发送指令包含固件文件路径和校验值。烧录工站的客户端软件接收指令校验固件文件的SHA256确认无误后启动烧录器。烧录器执行烧录烧录完成后读取芯片内的版本信息和工单要求的版本比对。比对通过后客户端软件向MES上报烧录结果包含工单号、芯片条码、版本号、烧录时间、操作员、烧录结果。MES记录数据并更新工单状态。这个流程的关键是第4步的版本比对。如果只比对烧录文件不比对芯片内实际存储的版本就无法发现“烧录文件正确但烧录过程出错”的情况。比如烧录过程中断电芯片内可能只有部分数据被写入但烧录器可能误报成功。读取芯片内的版本信息可以避免这个问题。对于nRF51822这类支持OTA的芯片还可以通过蓝牙读取芯片内的版本信息实现无线校验。但产线环境蓝牙干扰较大一般还是用有线方式。5. 常见问题与排查技巧实录5.1 烧录版本不匹配的典型症状和排查路径烧录版本不匹配的症状有很多种我整理了一个速查表症状可能原因排查方法芯片功能正常但版本号不对烧录工程文件指向了旧固件检查JFlash/CCS工程文件里的固件路径芯片无法启动SoftDevice和Application版本不匹配读取芯片内SoftDevice版本和SDK版本比对部分芯片功能异常烧录过程中断电或接触不良读取芯片内固件的CRC和预期值比对烧录成功但测试失败选项字节配置错误检查烧录工程里的选项字节设置同一批货版本不一致多条产线用了不同版本的烧录文件检查每条产线的烧录工程文件哈希值排查版本问题的第一步永远是读取芯片内的版本信息。如果固件里没有存版本信息那就只能靠烧录记录来追溯。这也是为什么我一直强调固件里必须存版本号。5.2 烧录工站常见的操作失误和预防措施操作失误是烧录事故的主要原因之一。我见过的事故包括选错固件文件、插错工装、烧录中途拔线、烧录完成后忘记标记、把未烧录的芯片混入已烧录的批次。这些问题的预防措施如下选错固件文件烧录软件启动时自动加载工单对应的固件操作员无法手动选择。如果必须手动选择软件要显示固件版本号和哈希值让操作员核对。插错工装不同产品的工装使用不同的颜色或标签物理接口不兼容。烧录软件检测到芯片ID不匹配时拒绝烧录。烧录中途拔线烧录软件检测到连接断开时报警并记录异常。操作员需要重新烧录并确认结果。忘记标记烧录完成后自动打标如激光打码或贴标签或者用油性笔在芯片上画点。自动打标更可靠但成本较高。混料烧录工站和未烧录工站物理隔离使用不同的容器如红色箱子和蓝色箱子。MES记录每颗芯片的烧录状态出货前扫描校验。5.3 版本回滚和紧急变更的处理有时候新版本固件上线后发现严重bug需要紧急回滚到旧版本。这时候版本管理流程就面临考验如果旧版本的烧录工程文件已经被覆盖了回滚就会很麻烦。我的做法是制品库里保留所有历史版本的固件和烧录工程文件并且每个版本都有完整的元数据版本号、构建时间、Git commit、测试报告。回滚时只需要在MES里把工单关联的版本号改回旧版本产线重新下载旧版本的烧录工程文件即可。紧急变更的处理流程和正常变更类似但可以简化审批环节。比如ECN可以先口头通知事后补审批。但无论如何变更记录必须留痕否则出了问题无法追溯。我经历过一次紧急回滚某产品的新固件修复了一个bug但引入了一个更严重的bug导致芯片在低温下无法启动。发现问题的当天下午我们决定回滚。因为制品库里保留了旧版本产线在2小时内就完成了切换。如果没有版本管理这个回滚可能需要一两天。5.4 烧录数据追溯的审计要点品质审计时审核员通常会检查以下内容每一批出货的芯片能否追溯到烧录时的固件版本、烧录器ID、操作员、烧录时间。固件版本变更是否有ECN记录ECN是否经过审批。烧录工站的烧录工程文件是否和制品库里的版本一致。烧录器固件版本和烧录算法版本是否有记录。是否有烧录失败的芯片处理记录。这些审计要点看起来繁琐但如果MES系统设计得当大部分数据都是自动采集的不需要人工记录。关键是要在MES实施初期就把这些字段设计进去后期补录会很痛苦。我在实际项目中总结了一个经验MES的烧录数据表至少要包含以下字段工单号、产品型号、固件版本、SoftDevice版本如有、烧录器ID、烧录器固件版本、烧录算法版本、芯片条码、烧录时间、操作员、烧录结果、校验结果、异常代码。这些字段覆盖了审计的绝大部分要求。6. 工具选型与系统集成建议6.1 烧录工具的选择标准选择烧录工具时除了烧录速度和稳定性还要考虑版本管理的支持程度。我一般从以下几个维度评估评估维度说明权重版本管理支持是否支持从配置文件读取固件路径是否支持API对接MES高防呆能力是否支持芯片ID校验、版本校验、烧录后校验高多路烧录是否支持同时烧录多颗芯片速度如何中脚本支持是否支持命令行调用方便自动化集成高芯片支持范围是否支持项目用到的所有芯片型号高成本授权费用、硬件费用中J-Link的优势是脚本支持好、芯片支持范围广缺点是产线模式需要额外配置。量产烧录器如Elnec、XELTEK的优势是速度快、防呆功能强缺点是脚本支持参差不齐有些型号的API文档不完善。对于nRF51822这类芯片还可以考虑使用Nordic官方的nRF Connect Programmer它支持命令行模式和版本校验。但nRF Connect Programmer的产线模式功能相对简单适合小批量生产。6.2 MES系统的选型考量MES系统的选型是一个大话题这里只讨论和烧录版本管理相关的部分。核心要求是支持工单与固件版本的绑定、支持烧录数据采集、支持版本变更的审批流程。如果团队规模不大可以考虑开源的MES方案。但开源MES的质量参差不齐有些项目文档不全有些项目已经停止维护。我的建议是如果团队有开发能力可以基于开源MES做二次开发如果没有还是选择商业MES但要在合同里明确烧录版本管理的需求。商业MES里有些产品对电子制造行业的烧录环节支持较好有些则偏重流程管理。选型时要重点考察是否支持设备数据采集SDC、是否支持工单与BOM的绑定、是否支持版本变更的ECN流程。6.3 ERP与MES在烧录环节的协同ERP和MES在烧录环节的分工一般是ERP负责工单的下发和物料的管理MES负责工单的执行和数据采集。烧录版本信息通常存在MES里但ERP的工单里也应该记录固件版本号以便追溯。ERP和MES的集成方式有几种数据库直连、API对接、中间件。数据库直连最简单但耦合度高API对接最灵活但开发量大中间件适合异构系统。我的建议是如果ERP和MES是同一家供应商用数据库直连如果不是用API对接。一个常见的坑是ERP的工单里没有固件版本字段导致MES无法从ERP获取版本信息。解决方法是在ERP的物料主数据里增加“固件版本”属性工单下发时自动带出。或者在MES里单独维护产品与固件版本的对应关系工单下发时从MES查询。6.4 本地化部署与数据安全有些团队出于数据安全的考虑选择本地化部署MES和ERP。本地化部署的好处是数据可控缺点是维护成本高、升级麻烦。如果选择本地化部署烧录数据的备份策略要特别注意。我建议至少每天备份一次烧录数据备份文件保留至少一年。另外烧录工站的电脑要定期检查磁盘空间和系统日志。我遇到过因为C盘满了导致烧录软件无法写入日志进而无法烧录的情况。这种问题在产线停线时才发现影响很大。7. 我踩过的坑和实际经验总结烧录版本管理这件事说到底是流程问题而不是技术问题。技术方案再先进如果流程没人执行照样出事故。我见过太多团队花大价钱买了MES结果产线操作员还是用U盘拷贝固件MES只是个摆设。我的经验是先跑通流程再上系统。先用最简单的工具比如共享盘加Excel记录把版本管理的流程跑起来让所有人都习惯“烧录前查版本、烧录后记版本”的操作。等流程稳定了再上MES系统做自动化。这样推行的阻力最小效果也最好。另一个经验是版本管理要从研发抓起。如果研发发布固件时就没有版本号、没有变更记录产线的版本管理就是空中楼阁。我一般会要求研发在固件里嵌入版本信息并且在Git仓库里打Tag。这个要求一开始会被研发抵触但一旦出了事故大家就会明白它的价值。还有一个细节烧录工站的电脑要锁定。操作员只能用指定的烧录软件不能安装其他程序不能访问共享盘不能插U盘。这样可以避免操作员“自己找固件”的情况。电脑的USB口可以用物理锁锁住或者用组策略禁用。最后分享一个实用技巧在烧录工站的显眼位置贴一张版本对照表列出当前工单号、产品型号、固件版本、烧录工程文件路径。操作员每次换工单时核对一遍。这张表由MES自动生成并打印不需要人工填写。这个小小的措施能避免很多“拿错文件”的事故。烧录版本管理没有一劳永逸的方案它需要随着产品线的变化、团队的成长、系统的升级不断调整。但只要坚持“可追溯、防呆、留痕”这三个原则就不会出大问题。
返回列表