简介:面向STM32开发者的官方编程与调试工具资源,即STM32 ST-LINK Utility。该软件通过ST-LINK/V2或JTAG/SWD接口完成固件烧录、在线调试、芯片识别与内存测试,并支持ST-LINK硬件固件升级,适合嵌入式入门及量产维护场景。压缩包共277个文件,约10.05MB,以stldr加载文件、C语言源码与头文件为主,另含可执行程序、动态库、PDF说明文档以及Keil、IAR等IDE工程文件,便于直接安装使用或参考二次开发。目前已吸引4721人学习下载。资源内附标准外设库相关源码与系统启动文件,可辅助理解STM32时钟、总线及调试接口配置,同时包含Windows下的ST-LINK驱动安装脚本,能快速解决环境搭建与设备识别问题,对掌握固件下载流程和调试技巧有实用价值。
1. ST-LINK Utility 是什么,为什么产线和老工程师还在用它
产品要交样了,板子却突然连不上调试器——这种时候,很多人会翻出那个界面朴素、多年没更新的 ST-LINK Utility。它不是新工具,甚至已被官方新工具逐步替代,但它仍然是不少工程师电脑里常驻的“后悔药”:当芯片引脚被复用、固件把调试口锁死、或者量产线等着赶工时,这个轻量程序往往比大而全的新工具更直接。这篇文章只讲一件事:怎么用 ST-LINK Utility 把固件可靠地烧进 STM32,以及这个过程里那些容易翻车的地方。适合经常调试 STM32、需要快速烧录验证,或负责产线烧录的开发者。读完你可以独立完成从接线、驱动、烧录校验到命令行量产的完整链路。
2. 连接目标板:驱动、线序与连接模式
2.1 驱动识别与安装:插上没反应先看设备管理器
把 ST-Link 插到电脑上,第一件事不是打开 ST-LINK Utility,而是先确认操作系统已经正确识别它。Windows 下打开设备管理器,正常状态下能看到 ST-Link 相关的调试接口设备,具体显示名会因为驱动版本略有不同;如果看到一个带黄色感叹号的“未知设备”,说明驱动没有装好,或者被其他烧录工具的驱动链顶掉了。这是我在多台电脑上遇到过最常见的情况,尤其是笔记本之前装过其他调试器软件,再插 ST-Link 就容易出现驱动冲突。
解决方式也很直接:去芯片原厂官网的驱动下载页,拿最新驱动包手动安装。解压后,在设备管理器里右键那个未知设备,选“更新驱动程序”,再选“浏览我的电脑以查找驱动程序”,直接指向解压目录。装好后重新插拔一次,设备应该恢复为正常状态。有一个细节容易踩坑:如果设备管理器里已经显示正常,但 ST-LINK Utility 依然报 No ST-LINK detected,优先怀疑是 Utility 自带的驱动和系统当前的驱动版本对不上。此时的做法是先把旧驱动彻底卸载,再重装官方驱动,基本都能救回来。
Utility 主界面底部区域会显示当前 ST-Link 的固件版本信息,版本过旧会在连接时表现得很怪,比如时而识别、时而掉线。Utility 菜单里带有固件升级功能,升级过程只有几秒钟,但有一个硬性要求:过程中绝对不能断电或拔 USB 线,否则 ST-Link 本身就会变成砖头。我一般会在新拿到一个 ST-Link 之后先把固件升到最新再投入项目,这样可以排除掉一批“玄学连接问题”。
2.2 SWD 线序与供电检查:4 根线就能干完的活
ST-LINK Utility 连接 STM32 目标板,绝大多数情况下用的就是 SWD(Serial Wire Debug)方式,比 JTAG 简单得多,最少只需要 4 根线。先看一张接线表,这是整个烧录链路里最值得仔细核对的部分。
| 信号 | 作用 | 连接建议 |
|---|---|---|
| SWDIO | 数据输入输出 | 必须连接 |
| SWCLK | 调试时钟 | 必须连接 |
| GND | 参考地 | 必须连接 |
| 3.3V | 目标板供电 | 目标板有独立供电时不要接 |
| NRST | 复位信号 | 仅在 Under Reset 模式时需要 |
很多人在这一步翻车。市面上的 ST-Link 排针丝印五花八门,SWDIO 和 SWCLK 印反、丝印磨损看不清都是常事。我的习惯是先拿万用表量目标板上的 SWD 引脚定义,确认引脚功能后再插线,而不是完全相信排针丝印。另外要注意:如果目标板本身已经由 USB 或电源模块供电,千万不要再把 ST-Link 的 3.3V 接上去。两个电源同时对同一组引脚供电,轻则电压不稳导致握手失败,重则烧坏调试口电路。
接好线后,Utility 主界面右侧有一个目标电压指示区域,正常情况下会显示当前目标板的供电电压,比如 3.3V 左右。如果这里显示 0.0V 或者干脆没有数值,说明 ST-Link 没有从目标板检测到电源,也就是连接没有真正建立。这个时候问题往往不在软件,而在硬件链路:线没插紧、杜邦线内部断线、目标板没有上电,逐个排查即可。我遇到过不少次所谓“软件连不上”,最后都是因为某根杜邦线内部接触不良导致的。
2.3 Normal 与 Under Reset:什么时候需要按住复位
ST-LINK Utility 的连接对话框里一般有两种连接模式可选,Normal 和 Under Reset,它们的差别可以直接决定你能不能连上一个“看起来已死”的芯片。
Normal 模式就是我们常说的热插拔,目标板正常运行、内核没被锁死时,用 SWDIO 和 SWCLK 两根线就可以完成握手。绝大多数情况下都用这个模式。Under Reset 模式则是 ST-Link 通过 NRST 引脚主动控制目标芯片的复位时序,在复位释放的瞬间强制接管内核。典型场景是:程序把 SWD 引脚复用成了普通 GPIO、芯片进入了低功耗模式、或者程序在死循环里不断重配置时钟,导致 SWD 握手无法完成。这时候只要接上 NRST 线并勾选 Under Reset,就能很大概率把芯片“拉”回来。
外部工具里还有一个常见做法,就是先按住目标板上的复位按键,再在 Utility 里发起连接,连接进度出现后再松开复位键,相当于手工模拟 Under Reset。但这个方法成功率取决于手速和时序,远没有 NRST 线加 Under Reset 模式可靠。所以我一般建议:如果目标板引出了 NRST,就顺手把它接到 ST-Link 的对应引脚上。多一根线,换来的是一层救砖的保底能力。
3. 用 ST-LINK Utility 完成一次完整烧录:从 hex 生成到校验通过
3.1 先解决烧录文件:怎么生成 hex 和 bin
ST-LINK Utility 能烧录的文件格式主要是 Intel HEX 和裸机 bin,两者各有特点。hex 文件自带地址信息,Utility 在打开文件时就能自动解析出固件要写到 Flash 的哪个区域,使用最省心;bin 文件是纯粹的二进制数据,没有地址信息,烧录时必须手动指定起始地址。对大多数 STM32 来说,这个起始地址是 0x08000000,也就是 Flash 的首地址。如果产品里分了 Bootloader 和 App,App 的烧录地址通常会被链接到 0x08008000 之类的偏移位置,但这个偏移在烧录时也必须手动填对,填错地址是烧到一半才发现功能不对的经典原因。
在 MDK(Keil)环境下生成 hex 很简单:打开工程,进入 Options for Target 的 Output 选项卡,勾选 Create HEX File,然后正常编译。编译完以后,在工程输出目录下会生成与工程同名的 .hex 文件。STM32CubeIDE 里则需要去看项目的 Build Settings,在 Post build steps 里通过工具链的 objcopy 命令把 elf 转成 hex。不同版本的 IDE 默认配置不完全一样,有些模板自带生成规则,有些需要自己添加一句 objcopy 命令。如果你发现编译后没生成 hex,先检查这两个位置,而不是怀疑 ST-LINK Utility 出了什么问题——这是很常见的认知偏差。
有一个值得养成的习惯:把生成 hex 和 bin 一起留下。hex 用于常规烧录,bin 则更适合在命令行量产脚本里使用,因为 bin 的地址比较直观。二者并存能让你在遇到“某板子烧不进 hex 但能烧 bin”这种怪问题时多一个排查方向。说到底,工具只是烧录动作的执行者,真正要确保的是文件本身有效。
3.2 核心烧录流程:擦除、编程、校验三步走
连接建立后,烧录这个动作本身并不复杂,但流程顺序会影响成功率。我的习惯是三步走:先擦除,再编程,最后校验。这三个步骤不是每次都必须全做,但对于从旧固件升级到新固件的场景,多花几秒钟擦一遍能省下后面几小时排除疑难杂症的时间。
第一步,File → Open File,选择要烧录的 hex 或 bin 文件。打开之后,Utility 会把文件内容加载进内存缓冲,左侧的地址分布视图会显示出这段固件要写入的具体区域。这一步可以顺便确认文件没有选错:看地址分布是否落在 0x08000000 开始的 Flash 区间即可。误把一个 App 的 hex 当成 Bootloader 烧,最直观的线索就是地址分布和你预期的完全不一致。
第二步,Target → Erase Chip,对整片 Flash 做一次全片擦除。很多教程会说不需要,因为后面的 Program 操作会按区域自动擦除。但从实际操作看,当新固件比旧固件短、或者升级过程中改动过中断向量表时,残留的旧代码会成为后患。所以我在产线流程和日常开发中都会先做 Erase Chip,再进入下一步。这个习惯多花的时间不到几秒钟,收益却很实在。
第三步,Target → Program & Verify。在弹出的编程对话框里确认烧录起始地址(默认 0x08000000)和 Verify after programming 选项处于勾选状态,然后确认执行。编程过程会经历擦除、写入、校验三个阶段,Log 窗口会逐条打印进度。看到编程完成并且校验通过、没有红色报错,一次烧录才算真正完成。顺便说明校验为什么重要:写入 Flash 之后电压波动和线材品质都可能导致个别位写不进,只有把烧写的数据逐字节读回来和文件比对,才能确认芯片里的固件和源文件完全一致。
3.3 Option Bytes:一改就灵也一改就翻车的区域
Option Bytes(选项字节)是 STM32 Flash 里一块特殊的配置区,不存程序,存的是芯片行为:读保护等级、掉电复位阈值、看门狗模式、启动方式等。在 ST-LINK Utility 里通过 Target → Option Bytes 可以查看和修改这些配置。这里是最能体现“新手也能玩、熟手也翻车”的地方,因为一个错误的选项字节可能让整块板子直接无法启动。
最常见的三个配置项:一是 RDP 读保护等级,量产常用 Level 1,防止固件被读出来,这部分在下一章详细展开;二是 BOR 掉电复位阈值,常规项目中保持默认值即可,没有特别理由不要手动抬高,抬高了以后目标板在电池电压略有下降时就会反复复位,表现起来很像固件 bug;三是硬件看门狗的选择,一旦使能,Bootloader 和应用代码必须在规定时间内喂狗,否则芯片不断复位。很多人烧完新固件发现板子像抽风一样重启,查到最后就是选项字节里的看门狗被意外打开。
启动方式 BOOT0/BOOT1 也在这里或在硬件引脚上体现。烧完程序发现芯片没跑起来,先检查启动配置是不是被拉到了 System Memory 而不是 Main Flash。这一类问题不属于 ST-LINK Utility 的毛病,但因为修改选项字节是一步就能做到的事,所以很容易被误判成“烧录没成功”。遇到这种情况,先别反复重烧固件,打开选项字节看一眼才是不走弯路的检查方式。
4. 读取 Flash 与备份固件:烧录之外最实用的两件事
4.1 整片读回与保存:给固件留一份“后悔药”
ST-LINK Utility 不只是写 Flash 的工具,它也支持把芯片里的内容整片读出来,存成 hex 或 bin 文件。这个功能在几个场景里非常实用:产品返修时想确认板子里的固件版本是不是最新的;拿到一台旧样机却找不到原始工程源码时,至少可以把芯片里的二进制内容备份下来;量产机出现现场问题,读取回读日志比猜配置方便得多。
操作路径很简单:在 Target 菜单里选择读回功能,弹出地址范围对话框。绝大多数情况下按整片 Flash 读取即可,比如一颗 512KB 的 STM32F103,地址范围就是 0x08000000 到 0x0807FFFF。读回完成后,Save As 对话框里可以选择保存为 hex 还是 bin。如果是以后要重新烧回板子用的备份,我建议存成 hex 格式,因为它自带了地址信息,恢复时不用再手动指定起始地址,少一个出错环节。
读回过程有一个天然限制,就是读保护。只要芯片设置了 RDP Level 1 或更高,读回操作会被拒绝。这是芯片本身的安全机制,不是工具坏了。遇到这种情况,要么先解除读保护再做备份,要么直接接受“这块芯片的固件拿不出来”这个事实。顺便说一句,并不是所有芯片都有读回价值,很多产品出厂就把调试口关了,这种状态下不用在备份上花时间。
4.2 从备份恢复一台“变砖”的设备
变砖这个词在 STM32 开发里太常见了。典型路径有三种:烧录过程中拔了电源、Bootloader 区域被错误的文件覆盖、改了选项字节导致芯片无法进入正常执行路径。这三种情况都有一个共同点:芯片本身没有坏,只是 Flash 里的内容和它该有的状态对不上。只要 ST-Link 还能建立 SWD 连接,就有机会救回来。
恢复步骤通常是这样:先把 NRST 线接上,连接时勾选 Under Reset,提高握手成功率;如果能连上,先做一次全片擦除,把错误数据清掉;然后把之前备份的 hex 烧回去;最后复位目标板观察现象。如果连 SWD 都建不起来,还有一个最后的办法:把目标板断电,接好线,在发起连接的同时给目标板上电,配合 Under Reset 让芯片在上电瞬间被 ST-Link 接管。这个办法在芯片进入低功耗模式时尤其有效,我靠这个姿势救回过好几块“看起来死透”的板子。
要注意的是,如果芯片已经开启了 RDP Level 1,擦除动作需要额外留意。此时芯片不允许调试接口直接访问 Flash,但允许整体擦除(Mass Erase)作为解锁手段。擦掉全部内容等同于解除保护,Flash 数据全部丢失,这也是“备份是后悔药”这句话的真正含义:没有备份就去解锁,等于亲手清空芯片。
4.3 RDP 读保护三级详解:Level 2 是真正的不归路
| 等级 | 调试接口与 Flash 访问权限 | 降级方式 |
|---|---|---|
| Level 0 | 完全开放,可读可写 | 无需 |
| Level 1 | Flash 内容不可读,调试接口受限 | 整体擦除后回到 Level 0 |
| Level 2 | 调试口永久关闭,代码不可见 | 不可降级,永久锁定 |
量产固件的惯例做法是设到 Level 1,既能阻止普通用户通过调试器把固件读出来,又给返修留了一条整体擦除后重新烧录的后路。Level 2 看起来最安全,代价却是调试接口永久关闭、不可恢复,一旦设备后期需要做故障分析或固件升级,就没有任何回旋余地。我见过不少把 Level 2 当成“高级保护”的案例,最后都为返修付出了额外成本。所以除非产品形态完全不支持后期维护,否则不建议碰 Level 2。
在 Utility 里设置 RDP 的方法是打开 Option Bytes 窗口,在 RDP 字段选择对应等级后确认写入。注意,把 Level 0 改成 Level 1 通常需要一次整片擦除的执行过程,这是芯片规范决定的,不是设置没生效。执行过程中不要断电。至于 Level 1 降到 Level 0,实际上就是做一次 Mass Erase,擦完 Flash 和选项字节一起回到出厂状态,芯片又是一颗可以正常调试的片子了。
5. 避坑:ST-LINK Utility 高频问题与排查顺序
5.1 插上没反应:No ST-LINK detected
现象:ST-Link 插到电脑上,ST-LINK Utility 直接报错 No ST-LINK detected,但设备管理器里能看到 ST-Link 设备。 原因:最常见的两个,一个是 USB 驱动被其他工具改写了,另一个是 ST-Link 固件里没有可用的调试功能。还有一个低频原因:USB 供电不足,尤其是用 HUB 的时候。 解决:先打开设备管理器看设备状态是否正常,有感叹号就手动重装驱动;确认正常后,在 Utility 的固件更新界面读一下当前固件版本,如果版本过旧就升级固件;最后换一个 USB 口直插,排除供电和 HUB 转发问题。这一串排查下来,九成以上都能恢复。
5.2 能识别 ST-Link 但连不上目标芯片:Target not connected
现象:ST-Link 被识别了,但连接目标板时报 Target not connected,或一直卡在连接界面。 原因:目标板没供电、SWD 线序接错、芯片进入了低功耗模式且没有用 Under Reset 连接。 解决:先看 Utility 主界面右侧的目标电压检测值,如果是 0V,直接检查目标板供电和 GND 线;如果电压正常,量一下 SWDIO 和 SWCLK 有没有接反,这是排针丝印不清时最容易犯的错;都排除了再看连接模式,把 NRST 接上并改用 Under Reset。记住一个原则:硬件链路先确认,软件设置后怀疑。
5.3 烧录到一半或者烧完后校验失败
现象:Program 过程报告写入失败,或者 Program & Verify 在最后一步提示校验不通过,烧进去的固件跑起来也经常随机复位。 原因:线材过长或接触不良、目标板供电在写入大电流时跌落、Flash 本身已有残留数据导致写入异常,以及擦除步骤被跳过。 解决:换最短的杜邦线,重新整理接线;给目标板外接稳定的 3.3V 供电;烧录前手动执行一次 Erase Chip 再重新烧。校验失败不要反复重烧同一份文件,先检查硬件环境,因为每次校验失败都是硬件链路发出的真实信号。如果烧录过程中芯片发热明显,先停机检查板子有没有短路。
5.4 读保护解锁失败:Mass Erase 报错
现象:芯片之前设置了 RDP Level 1,想通过擦除降级,但 Utility 执行 Mass Erase 时报错,芯片依然处于保护状态。 原因:大多是连接模式下没有满足擦除条件,比如芯片处于低功耗模式、复位引脚状态不稳定,或者擦除过程中供电有波动。 解决:接上 NRST,改用 Under Reset 模式重新连接;擦除前把目标板外电断开,只保留 ST-Link 供电或确保电压稳定;再用 Target → Mass Erase 尝试一次。如果还是不行,检查芯片是不是处于 RDP Level 2。Level 2 状态下任何擦除请求都会被芯片拒绝,这是硬件层面的策略,不需要再花时间折腾。
5.5 换了一台电脑就认不出 ST-Link
现象:同一个 ST-Link 在一台电脑上工作正常,换到另一台电脑后,Utility 报告连接失败或识别不到。 原因:ST-Link 的驱动没有跟着电脑走,新电脑缺少对应驱动,或者新电脑系统版本较新,旧驱动签名不被识别。 解决:直接去原厂官网下载最新驱动包安装,安装完成后插拔一次 ST-Link。如果装完还不行,在设备管理器里找到 ST-Link 设备,右键卸载设备并勾选删除驱动程序,然后重新安装一次。干净的重装流程比反复点更新驱动更可靠。
6. 进阶:命令行模式与一键量产
6.1 ST-LINK_CLI 基础命令与参数表
ST-LINK Utility 安装目录下带有一个命令行程序 ST-LINK_CLI,它可以不使用图形界面完成连接、擦除、烧录、校验、设置读保护等全部操作。对产线而言,命令行是必须掌握的形态,因为脚本化固定流程比人工点界面可靠得多。最基本的一条烧录命令是这样:
ST-LINK_CLI.exe -c SWD UR -P "app.hex" -V参数说明:-c 指定连接模式和连接方式,SWD 表示使用 SWD 协议,UR 表示 Under Reset 复位连接;-P 指定要烧录的文件;-V 表示在烧录完成后执行校验。整个命令的含义就是:以 SWD 加复位连接的方式连上芯片,烧录 app.hex,写完以后逐字节校验。命令行模式下建议先手动处理读保护和擦除,完整流程会在下面的脚本里体现。
6.2 批量脚本:擦除、双固件、校验一次完成
实际量产时,很多产品需要先烧 Bootloader 再烧 App,两个文件地址不同,不能合并成一个 hex。这时写一个批处理脚本最稳妥。下面是一个 Windows 下的示例,可以直接保存为 .bat 运行:
@echo off rem 定义 ST-LINK_CLI 路径,请按实际安装位置修改 set CLI="C:\Program Files (x86)\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK_CLI.exe" set BOOT=.\build\bootloader.hex set APP=.\build\app.hex echo [1/3] 连接并擦除整片 %CLI% -c SWD UR -EP if errorlevel 1 goto :fail echo [2/3] 烧录 Bootloader 并校验 %CLI% -c SWD UR -P "%BOOT%" -V if errorlevel 1 goto :fail echo [3/3] 烧录 App 并校验 %CLI% -c SWD UR -P "%APP%" -V if errorlevel 1 goto :fail echo 烧录全部完成 exit /b 0 :fail echo 烧录失败,请查看上方日志 exit /b 1逻辑说明:脚本按三步执行,任何一步失败都会通过 errorlevel 跳转到失败分支并返回非零退出码,方便上位机软件捕获结果。烧录顺序有讲究:先擦除整片,再烧 Bootloader,最后烧 App,确保中断向量表不会被旧数据污染。每一条命令都带 UR 参数,即使芯片内部程序把 SWD 引脚做了复用,脚本也能以复位连接方式接管芯片,这是产线流程里提高成功率的关键设计。
参数调整也直接改脚本即可:如果产品已经不需要 Bootloader,删掉第二步并把第一步的擦除保留即可;如果要设置读保护,再加一条类似的命令,把参数改为 -RDP 1,放在 App 烧录完成之后执行。量产时的常见做法是最后再设保护,避免在编程过程中出现调试接口被锁的尴尬。
6.3 把烧录融进日常开发流的习惯
命令行带来的最大收益不是快,而是可重复。日常迭代里,我会在工程的 Makefile 或构建脚本里加一个 flash 目标,把上面这条命令写进去,实现编译完直接烧录。这样每次同事问“烧录命令是什么”,答案永远是同一个脚本,而不是一段回忆。
给日志留底也是一个容易被忽略的好习惯。脚本里把输出重定向到文件,比如在命令结尾加上 > flash.log 2>&1,烧录失败时能把完整的日志发回给协助的人。这比截图快捷得多。最后分享一个教训:有段时间我为了省时间,烧录时跳过全片擦除,结果 App 里残留的旧引导代码导致设备随机复位,排查了整整两天。从那以后,凡是从旧固件升级到新固件,我都坚持先擦除再烧录。这个习惯帮我省下的时间,远比那几秒擦除多得多。希望帮到你。
本文还有配套的精品资源,点击获取