ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

STM32量产烧录脚本实战:用ST-LINK Utility命令行实现自动批量烧录

STM32量产烧录脚本实战:用ST-LINK Utility命令行实现自动批量烧录 第一次被安排做产品量产的时候我还在用Keil傻乎乎地点Download按钮。一块板子点一次一天点几百次点到最后手指头都条件反射了还担心漏烧、烧错固件版本。后来我发现ST-LINK Utility自带命令行工具ST-LINK_CLI.exe配合Windows批处理脚本可以把整个STM32烧录流程变成放板子、按回车、换板子的标准动作。这篇文章就聊聊我踩过的坑和最终沉淀下来的量产烧录脚本——整个过程拆开来看其实不复杂5分钟能跑通一个最小可用版本后面直接套用到产线也不心虚。我默认你是做STM32开发的手里有ST-LINK或者兼容调试器熟悉基本的SWD接线。如果你想解决几十块板子怎么快速烧录怎么保证每片芯片都校验通过怎么让产线工人也敢操作烧录这类问题这篇内容应该能帮到你。1. 量产烧录这件事为什么值得做一套批处理很多工程师在样品阶段根本不会考虑批量烧录的问题毕竟手头三五块板子Keil点几下就完事。但到了小批量生产哪怕只有二三十块板痛点立刻就出来了。1.1 手工烧录的三个痛点第一个痛点是重复劳动带来的疲劳和误操作。你连续烧录十几块板子之后很难保证每一次都盯着烧录进度条走完有时候点击下载之前忘了切换工程烧进去的还是上一个版本的固件这种错误最坑——板子外观完全正常功能却不符预期排查半天才发现烧错固件。第二个痛点是过程不可追踪。手工烧录没有日志今天烧了多少块、烧的是哪个版本、哪几块校验失败全靠脑子记或者纸上画正字。一旦换人操作、隔天继续信息就断了出了质量追溯问题根本没法查。第三个痛点是校验环节容易被跳过。Keil下载完成默认显示Flash Load finished但很多人没注意到它并不总是执行完整CRC校验。量产环境下连接接触不良、芯片异常、供电波动都可能让数据没写对如果不主动校验问题板子就流到下一道工序了。1.2 为什么选ST-LINK Utility而不是Keil或J-Flash能烧录STM32的工具不少但量产场景下我的选择顺序是能用命令行、免费、稳定、好部署。Keil的ULINK或ST-LINK调试器当然能烧但它的图形界面完全是给开发调试准备的每个工程文件、每块芯片都要手动交互无法做到一键循环烧录。而且Keil授权贵产线电脑不能都装一堆开发工具。J-Flash是Segger家的好东西J-Link的烧录速度也确实快但它需要J-Link硬件配套授权费用不低对于纯STM32场景性价比不佳。如果你公司只有ST-LINK设备没必要为了量产多买一套J-Link。OpenOCD是开源方案命令行能力很强但Windows下的驱动配置、脚本编写对产线维护人员不友好适合懂Linux的技术人员折腾。ST-LINK Utility是ST官方免费工具界面里就内置了命令行CLI支持SWD连接、Flash写入、校验、运行程序参数简洁一条命令就能完成整个烧录动作。对国内大多数用STM32做产品的团队来说这是上手成本最低、落地最快的量产烧录方案。2. 环境准备先把命令行烧录跑通刚接触这个方案的人最容易卡在第一步——不知道怎么从图形界面工具跳到命令行。其实ST-LINK Utility安装完之后命令行工具就在安装目录里躺着叫ST-LINK_CLI.exe。2.1 安装与版本选择去ST官网搜STM32 ST-LINK Utility下载安装包。安装时注意新版工具会同时安装ST-LINK USB驱动如果你的Windows之前装过其他版本的ST-LINK驱动建议先卸载旧驱动再装新版避免设备管理器里出现黄色感叹号。另外ST-LINK Utility不支持64位的命令行路径问题不大但安装路径默认在Program Files (x86)下面写脚本时要注意这个路径。我习惯把版本固定在2.x的稳定版本不追最新。量产工具追求的是稳定ST-LINK Utility这种老牌工具更新频率不高版本太新反而可能带来驱动兼容问题。装完后打开安装目录检查一下这几个文件是否存在ST-LINK Utility\ST-LINK Utility\ST-LINK_CLI.exeST-LINK Utility\ST-LINK Utility\ST-LINK Utility.exe如果能看到这两个文件环境就没问题了。2.2 手工执行一次完整的命令行烧录先用USB连接ST-LINK和电脑再连接目标板然后打开cmd窗口切换到ST-LINK Utility安装目录执行一次最简单的烧录命令ST-LINK_CLI.exe -c SWD UR FREQ4000 -p D:\firmware\app_v1.2.0.hex -V -Run -NoPrompt逐段解释一下这条命令的含义量产改脚本的时候你会反复跟这些参数打交道。-c SWD UR FREQ4000是连接参数。SWD表示使用SWD协议这是STM32默认的调试/烧录接口占用SWDIO和SWCLK两根线比JTAG省引脚。UR是Under Reset意思是连接时把目标芯片拉进复位状态再通信对于已经跑着程序、可能禁用了调试口的芯片特别重要——如果程序里意外关掉了SWD引脚复用不拉复位根本连不上。FREQ4000表示SWD时钟频率4MHz我习惯量产时用这个频率稳定性和速度比较均衡。如果目标板走线很长、环境干扰大可以降到2000甚至1000。-p 固件文件路径就是写入Flash。注意如果你的工程里既有Bootloader又有App可以生成一个包含多个地址段的联合hex文件路径用引号包起来防止文件夹名带空格导致解析出错。-V是Verify烧录完成后自动回读Flash内容并和源文件比对。量产场景强烈建议开启接触不良或者芯片异常时这一步能兜住大部分质量风险。-Run是烧录完自动运行程序它会复位并运行用户代码对产线来说少一个手工复位动作效率更高。-NoPrompt是关闭命令行交互确认弹窗没有这个参数时烧录完可能卡在某个确认提示上批处理循环就会中断。执行完如果终端输出类似Programming completed successfully或者包含Verification... OK字样说明整个链路已经跑通。2.3 hex、bin、srec烧录文件到底该准备哪种ST-LINK CLI支持多种固件格式我最常用的是hex和bin。新手最容易栽的坑是烧hex不需要指定地址烧bin必须指定地址。hex文件内部每一行都带有地址信息命令行直接写-p xxx.hex就行它会自动把数据放到正确位置。而bin是原始二进制数据没有地址信息你得告诉工具从哪里开始放比如-p xxx.bin 0x08000000。这个地址取决于芯片Flash起始地址STM32大多数型号是0x08000000但也有少部分型号或者你挂在外部Flash上时要改。如果你的固件包含Bootloader和App两部分推荐在Keil或IAR里直接把两个区域的代码合并生成一个hex文件烧录时一条命令全解决。如果你需要在产线上顺便擦除整个芯片可以在命令行加擦除选项但日常量产我倾向于只擦固件占用的扇区减少Flash擦写次数。srec.s19/.s28也是带地址格式和hex类似偶尔遇到从其他平台转过来的固件会用到。至于ST-LINK Utility的.stldr加载器文件那是给外部SPI NOR Flash用的普通MCU量产用不上。3. 批处理脚本的完整设计与实现命令行手动执行通了接下来就是把这套动作封装成bat脚本让它变成一个傻瓜式的工具。写脚本之前想清楚你需要它做什么自动申请管理员权限、检测ST-LINK和固件是否就位、执行烧录、判断成败、写日志、支持连续循环操作、失败时重试或退出。3.1 基础版脚本固定固件一键烧录先给一个最小可用版本适合单板调试或者产量很小的场景echo off rem 检查管理员权限不是管理员就自动提权 net session nul 21 if %errorlevel% neq 0 ( echo 正在申请管理员权限... powershell -Command Start-Process %~f0 -Verb RunAs exit /b ) set CLIC:\Program Files (x86)\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility\ST-LINK_CLI.exe set FIRMWARED:\firmware\app_v1.2.0.hex if not exist %CLI% ( echo [ERROR] 找不到 ST-LINK_CLI.exe请检查安装路径。 pause exit /b 1 ) if not exist %FIRMWARE% ( echo [ERROR] 找不到固件文件 %FIRMWARE% pause exit /b 1 ) echo 开始烧录... %CLI% -c SWD UR FREQ4000 -p %FIRMWARE% -V -Run -NoPrompt if %errorlevel% equ 0 ( echo [OK] 烧录成功 ) else ( echo [FAIL] 烧录失败错误码%errorlevel% ) pause这段脚本的核心逻辑就三步提权、检查、执行。提权那段用了net session命令判断当前是否有管理员权限如果没有就用powershell带RunAs重新启动脚本。为什么要管理员权限因为ST-LINK的USB驱动访问在某些Windows版本下需要更高权限而且产线电脑经常有域策略限制提前提权能省掉后面莫名其妙的权限报错。检查路径和固件这一步千万别省。产线操作员不会去改脚本一旦固件路径变了或者文件被误删没有这个判断命令行会刷一堆看不懂的英文然后闪退体验极差。执行那行就是前面手动验证过的命令。%errorlevel%是Windows批处理里获取上一条命令返回码的内置变量ST-LINK_CLI正常返回0失败返回非0。这里注意要在命令执行完立刻获取中间不要插入其他命令否则值就被覆盖了。3.2 进阶版脚本循环烧录、日志记录、失败重试量产场景下单个烧录按钮还不够工人需要不断换板子、重复烧录。所以脚本要带一个循环烧完一块自动回到等待状态并且把每次烧录结果记录下来echo off rem rem STM32 量产烧录脚本 V1.0 rem 适用单ST-LINK、人工换板、按键触发烧录 rem net session nul 21 if %errorlevel% neq 0 ( powershell -Command Start-Process %~f0 -Verb RunAs exit /b ) set CLIC:\Program Files (x86)\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility\ST-LINK_CLI.exe set FIRMWARED:\firmware\app_v1.2.0.hex set LOGD:\firmware\burn_log.txt if not exist %CLI% ( echo [ERROR] 找不到 ST-LINK_CLI.exe pause exit /b 1 ) if not exist %FIRMWARE% ( echo [ERROR] 找不到固件文件 %FIRMWARE% pause exit /b 1 ) echo echo STM32 量产烧录脚本 echo 固件%FIRMWARE% echo 启动时间%date% %time% echo :loop cls echo. echo 请将待烧录板卡连接到ST-LINK然后按任意键开始烧录... echo 输入Q后回车可退出脚本 echo. set key set /p key按任意键烧录Q退出 if /i %key%Q goto :end echo [%date% %time%] 开始烧录... %LOG% %CLI% -c SWD UR FREQ4000 -p %FIRMWARE% -V -Run -NoPrompt set BURN_RC%errorlevel% if %BURN_RC% equ 0 ( echo. echo [OK] 烧录成功请更换下一块板卡。 echo [%date% %time%] 结果SUCCESS %LOG% ) else ( echo. echo [FAIL] 烧录失败错误码%BURN_RC% echo [%date% %time%] 结果FAIL errorlevel%BURN_RC% %LOG% echo 请检查连接后按任意键重试或输入Q退出。 set retry set /p retry按任意键重试Q退出 if /i %retry%Q goto :end ) goto :loop :end echo. echo 批处理结束日志已写入 %LOG% pause说几个我在实际使用中觉得最重要的细节。日志记录一定要带时间戳。%date% %time%能输出当前日期时间但format和系统区域设置有关中文Windows一般是2025/06/18 周三 14:30:25.55这种格式够用了。如果你想用日期做日志文件名比如burn_log_20250618.txt可以这样取set LOGD:\firmware\burn_log_%date:~0,4%%date:~5,2%%date:~8,2%.txt但注意这个写法依赖日期格式换到英文系统要改偏移量。失败重试的逻辑很关键。量产现场经常碰到ST-LINK夹子没夹好、杜邦线松了、目标板供电没开这类问题如果没有重试机制工人就只能关掉窗口重新双击脚本麻烦且容易误操作。我这里的做法是失败后留在原地等操作员重新调整连接后按任意键再烧一次。注意循环里用了cls清屏让操作员每次看到的是干净的界面。如果不想清屏想保留历史烧录记录可以把cls删掉但是窗口会越来越长看实际情况取舍。3.3 脚本里的坑路径、返回值、弹窗确认写批处理看起来简单但有几个坑是只有跑到产线现场才体会得到的。第一个坑是ST-LINK_CLI.exe的输出信息默认是英文失败时打印的内容比较长操作员看不懂。没关系我们只要靠%errorlevel%判断成功失败就够了不需要人工读英文。但有一种情况比较隐蔽-NoPrompt在某些老版本工具里不支持命令会卡在确认弹窗上。遇到这种情况轻则脚本停在那里重则烧录一半卡死。解决办法是升级ST-LINK Utility版本或者用-NoPrompt参数前先用ST-LINK_CLI.exe -h看一眼帮助确认当前版本支持哪些参数。第二个坑是路径带空格。放在Program Files下的CLI路径一定带空格所以引用时务必加双引号。固件路径如果放在带空格的目录下同样要加引号。我见过有人把固件放在D盘根目录结果换电脑后路径变了脚本直接报错所以脚本里专门加了文件存在性检查。第三个坑是权限问题。有些产线电脑装了安全软件直接用net session判断管理员权限可能弹出UAC框操作员如果点掉脚本后续访问驱动就会失败。我现在的做法是脚本开头先申请管理员权限UAC弹窗让操作员点是然后才开始干活流程上可控很多。第四个坑是防火墙或者杀毒软件拦截。命令行工具去访问USB设备有些安全软件会弹出拦截提示多的时候一天弹几次特别影响效率。量产机建议把ST-LINK Utility目录加入杀毒软件白名单这属于很容易被忽略但影响很大的细节。3.4 高级玩法一拖多、指定ST-LINK序列号如果你一条产线有多台工位每台电脑一个ST-LINK那脚本完全不用改反正每台只连一个设备。但如果出现一台电脑同时接两个ST-LINK的情况比如调试工位临时兼职烧录就得指定序列号了。ST-LINK Utility界面里可以看到每个ST-LINK的序列号命令行可以用-h 序列号指定用哪一台%CLI% -c SWD UR -h 0x00420021 -p %FIRMWARE% -V -Run -NoPrompt这个场景适合在研发调试座位上临时顶岗不干扰正常调试任务。真正的量产工位我建议还是一台电脑一个ST-LINK问题排查最简单。还有一种玩法是把脚本参数化用%1接收外部传入的固件路径这样同一条批处理可以烧不同固件。比如if %1 ( echo 用法burn.bat [固件文件路径] exit /b 1 ) set FIRMWARE%~1这样你用burn.bat D:\firmware\app_v2.0.0.hex就能烧指定固件版本切换不用天天改脚本。我自己在公司内部就是这么维护的不同产品线各发一个bat快捷方式参数不同而已。4. 量产烧录常见问题与排查实录脚本写得再好最终还是要面对真实硬件。这几年我积累了不少烧录失败排查经验很多问题在产线上一出现就能定位。下面的流水账是给各位一个排查思路照顺序走一遍大部分问题都能解决。4.1 连接层面的故障No ST-LINK detected这个报错是最常见的意思是电脑根本没识别到ST-LINK。先打开设备管理器找通用串行总线设备或者通用串行总线控制器看有没有带感叹号的设备。有感叹号多半是驱动问题重装ST-LINK驱动。设备管理器里一切正常但还是报No ST-LINK detected那就换一根USB线试试。别看这是土办法ST-LINK的USB线在量产工位上经常被拉来拉去内部断芯的表象就是时好时坏。注意ST-LINK用的是标准Micro USB或Type-C线但有些线只能充电不能传数据这种线插上去百分百识别不了。如果以上都查过没问题把ST-LINK拔下来插到另一台电脑试试。ST-LINK本身有升级固件的功能如果固件版本极老新版Utility可能不识别。老款ST-LINK/V2可以通过ST官方工具升级固件ST-LINK/V3一般没这个问题。4.2 烧录中断、连接超时目标板连接不稳能识别到ST-LINK但一执行-c SWD就报Connection error这种情况90%是SWD四根线的问题。SWDIO、SWCLK、GND三根是必须的有些板子不接NRST也能烧但接上NRST会更稳尤其当芯片跑着低功耗模式或者调试引脚被复用的时候。常见的连接问题有杜邦线太长导致信号质量差、SWCLK频率太高、目标板和ST-LINK供电不共地。产线建议直接用带探针的烧录夹具比手工捏杜邦线稳定太多。如果非得用杜邦线长度压到10cm以内SWD频率从4000降到2000或1000试试。目标板供电也要检查。如果目标板是电池供电或者外部电源供电一定要确保ST-LINK和目标板共地。如果目标是脱机供电也可以在烧录时用ST-LINK的3.3V输出给板子供电但注意ST-LINK的输出电流有限不能带大功耗负载否则电压一掉烧录就失败。4.3 校验失败verify error和读保护问题烧录命令返回错误但看着像烧了一半的情况多半是verify error。这个错误跟前面连接不稳可能有关系但更常见的坑是芯片本身处于读保护状态。很多从市场上回收的芯片或旧开发板内部flash被设置过RDP读保护这时候ST-LINK能连上但读不出内容校验必然失败。解决办法是用ST-LINK Utility图形界面或命令行关闭读保护。但注意解除读保护会擦除整个Flash所以别指望先备份再解除。量产烧录前如果发现目标芯片有读保护直接解除后重新烧录即可。这个操作可以通过ST-LINK Utility的Option Bytes界面里找到RDP选项把它从Level 1改成Level 0工具会提示将擦除芯片确认即可。还有一种是写保护。STM32的Option Bytes里可以对某些扇区设置写保护如果固件想写的区域被保护了烧录会报错。这种情况下同样要进Option Bytes把写保护关掉。这里提醒一句如果你量产固件本身带保护功能比如把RDP设成了Level 1那么第二次想烧录就必须先解除这个流程要写进作业指导书不然工人们会卡在为什么我这块板子烧不进。4.4 烧录成功但程序不工作boot引脚和复位电路有时候烧录一切正常校验也过了但板子不跑程序。不要慌先看Boot引脚。STM32的BOOT0引脚决定了启动来源如果BOOT0被拉高芯片会进入系统存储器Bootloader而不是用户Flash程序当然不跑。量产板子BOOT0一般通过10K电阻下拉到地如果悬浮或者设计失误就会出现这种吊诡问题。复位电路也值得检查。有些板子复位电容设计得特别大比如10uF烧录完成后的复位信号有可能无法可靠复位芯片导致程序没跑起来。用示波器抓一下NRST引脚的波形或者手动按一下复位键看看程序跑不跑基本就能定位。还有一种情况是芯片的Option Bytes配置异常比如看门狗没关但程序里初始化太慢上电没来得及喂狗就被复位了。这个跟烧录关系不大但在产线表现为烧完不亮灯排查时容易被带上弯路。5. 一些量产工艺上的补充经验脚本和硬件都跑通以后你会发现真正的量产难点其实不在烧录本身而在流程的严谨性和可维护性。下面这些经验是我后来慢慢补上的效果非常明显。5.1 固件文件的版本管理产线烧录最怕烧错版本。我见过某次产线用了昨天的测试固件烧了两百片板子最后全部返工。从那以后我强制所有量产固件文件名带版本号和日期比如app_v1.2.0_20250618.hex脚本里固定引用这个文件同时在脚本启动时打印固件名称和SHA256哈希值方便核对。批处理里计算SHA256很简单for /f %%i in (certutil -hashfile %FIRMWARE% SHA256 ^| findstr /r [0-9a-f]) do set SHA%%i echo 当前固件SHA256%SHA%把这个值打印出来和编译产物比对基本能杜绝固件被误替换的问题。文件服务器或网盘同步出错导致固件损坏的情况也能提前发现。5.2 与产线配合防呆设计与人工确认产线工人不关心固件版本和技术细节他们需要的是哪个灯亮说明什么。我改造过脚本在烧录成功时用msg命令弹个提示框同时让蜂鸣器响一声。你可以用以下几种方式增强反馈用color 2F和color 4F改变窗口颜色绿底代表成功红底代表失败用echo命令配合pause让工人必须看一眼结果才能继续在电脑上加一个外置的USB蜂鸣器成功和失败的声音不同这些细节看着不起眼却能极大减少产线上的误操作。人一旦疲劳必然依赖视觉和听觉反馈而不是读屏幕上的英文日志。我特别建议在烧录成功和失败后都加一个按任意键继续的停顿。有些工程师为了让工人操作快把停顿都去掉结果失败信息一闪而过工人根本不知道自己烧失败了。量产追求的不是单板时间极致短而是整体良率和可追溯性。5.3 硬件小技巧烧录夹具与线缆选型工位上最影响烧录成功率的硬件因素不是电脑不是ST-LINK而是那根连接ST-LINK和板子的线。杜邦线用一两天就会接触不良表现就是时好时坏浪费大量排查时间。建议直接上带排针母座的SWD烧录线或者用Pogo Pin探针夹具一次压接到位。SWD信号线的长度也直接影响稳定性和烧录速度。如果夹具线长超过20cmSWD频率别超过2000kHz不然容易出现烧录一半失败。如果线长超过30cm老老实实用1000kHz多烧一秒但稳定得多。还有一个容易忽略的点ST-LINK长时间连续工作会发热特别是在量产高强度烧录下。过热会导致连接不稳定所以工位上的ST-LINK不要堆在密闭盒子里给它留点散热空间。如果一天烧几百片可以准备两个ST-LINK轮换用。5.4 效率优化软件层面的额外细节如果你追求极限效率除了脚本本身还可以优化几个软件层面的细节。第一把固件文件放在本机固态硬盘上不要放在共享网络路径里读取快且不会因为网络波动导致文件访问失败。第二关闭杀毒软件的实时扫描至少把烧录工具目录加入白名单。第三系统电源选项设为高性能阻止USB设备挂起避免ST-LINK在长时间空闲后USB通信失败。这些优化单看很小叠加起来在一天几百片的产量下节省的时间和避免的故障非常可观。6. 写在最后的一个小经验这套批处理烧录方案用了这么久我最深的体会是量产工具的设计原则不是功能最全而是最不容易出错。当初给脚本加管理员权限自动提权、失败自动重试、日志记录这些功能时我图的是省事后来才意识到它们真正解决的是人的问题——让一个不熟悉嵌入式的人也能安全操作烧录过程。如果你也准备在产线上引入ST-LINK Utility批处理方案我的建议是从最简脚本开始跑通再加循环、加日志、加反馈一次加一点每加一点都在现场试几下。不要一上来就想写一个万能脚本产线环境千奇百怪稳定压倒一切。脚本本身没什么高深技术真正值钱的是你对自己产品和产线流程的理解。希望这篇文章能帮你少走点弯路早日摆脱人肉烧录机的身份。
返回列表