news 2026/9/29 16:15:13

STM32烧录避坑指南:ST-LINK Utility连接、烧录与擦除实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32烧录避坑指南:ST-LINK Utility连接、烧录与擦除实战

STM32开发入门的第一道坎,往往不是写代码,而是把代码弄进芯片里。我见过太多新手,Keil里编译零错误零警告,点下载却弹出一堆红字,或者干脆连芯片都认不到。ST-LINK Utility这个工具,官方出品、免费、轻量,专门用来干三件事:连接芯片、烧录文件、擦除Flash。听起来简单,但实际操作里藏着不少门道——选项字节配置错了芯片直接锁死,读保护开了没关掉下次就连不上,烧录地址填错程序跑飞。这篇内容就是把这些年我在STM32烧录上踩过的坑、总结的技巧,按连接、烧录、擦除三个环节拆开讲清楚,每个步骤都说明为什么这么做、不做会怎样。不管你是刚买回开发板的新手,还是用Keil烧录失败想换工具的老手,都能直接照着操作。

1. 先搞清楚ST-LINK Utility到底解决什么问题

1.1 为什么不用Keil自带的下载功能

很多人第一次接触STM32,装完Keil MDK,建好工程,点Download按钮,结果弹窗报错。Keil的下载功能依赖它内部的Flash算法配置,不同型号的STM32需要不同的算法文件,配置不对就烧不进去。而且Keil的下载是集成在IDE里的,一旦芯片进入读保护状态或者选项字节被改乱,Keil往往只给一个笼统的报错,排查起来很费劲。

ST-LINK Utility是ST官方独立的烧录工具,它直接跟ST-LINK调试器通信,绕过了IDE的Flash算法层。它的优势在于:第一,连接状态可视化,芯片有没有认到、电压是否正常、Flash容量多大,界面上直接显示;第二,擦除和选项字节操作独立成菜单,想单独擦除、单独改读保护,不用重新编译工程;第三,支持拖拽烧录,把bin或者hex文件直接拖进窗口就能烧,适合批量生产或者快速验证。

我个人的习惯是:日常开发用Keil编译调试,但涉及芯片擦除、选项字节修改、批量烧录,一律切到ST-LINK Utility。两个工具配合用,效率最高。

1.2 ST-LINK Utility和ST-LINK调试器的关系

这里要分清两个东西:ST-LINK是硬件调试器(那个USB小盒子),ST-LINK Utility是电脑上运行的软件。软件通过USB线跟硬件通信,硬件再通过SWD接口(两根线:SWCLK和SWDIO)跟STM32芯片通信。

市面上常见的ST-LINK硬件有几种:ST官方出的Nucleo板载ST-LINK、独立的ST-LINK/V2、以及各种第三方兼容版。第三方版本便宜,但固件版本参差不齐,有些老固件不支持新型号芯片。如果你用的是第三方ST-LINK,建议先用ST-LINK Utility里的固件升级功能把固件刷到最新,否则可能认不到STM32F4、F7、H7这些较新的系列。

注意:固件升级过程中绝对不能拔USB线,否则调试器可能变砖。升级前确认电脑USB供电稳定,不要用劣质USB Hub。

1.3 软件下载与安装的坑

ST-LINK Utility目前最新版本是4.6.0,ST官网可以直接下载。安装过程没什么特别的,一路Next就行。但有两个地方要注意:

第一,安装时会问是否安装ST-LINK驱动,一定要勾选。这个驱动是电脑识别ST-LINK硬件的前提,不装的话设备管理器里会显示未知设备。

第二,如果你电脑上已经装了Keil或者STM32CubeIDE,它们可能已经装了ST-LINK驱动,版本可能跟ST-LINK Utility自带的冲突。表现是ST-LINK Utility能打开但连不上芯片。解决办法是在设备管理器里找到ST-LINK设备,右键更新驱动,手动指向ST-LINK Utility安装目录下的驱动文件夹。

安装完成后,把ST-LINK硬件插上电脑,打开设备管理器,应该能看到“STMicroelectronics STLink dongle”或者类似名称的设备,没有黄色感叹号,说明驱动正常。

2. 连接芯片:从物理接线到软件识别

2.1 硬件接线:SWD四线制是标配

ST-LINK跟STM32之间最常用的接口是SWD(Serial Wire Debug),只需要四根线:

ST-LINK引脚STM32引脚说明
SWCLKPA14(默认)时钟线
SWDIOPA13(默认)数据线
GNDGND共地,必须接
3.3V3.3V供电,可选

SWCLK和SWDIO的引脚位置不是固定的,不同型号的STM32可能不同,但PA13和PA14是绝大多数型号的默认SWD引脚。如果你在代码里把这两个引脚重映射成了普通GPIO,SWD就连不上了,这时候需要用“Connect Under Reset”模式来救。

3.3V这根线要不要接,取决于你的板子是否已经独立供电。如果板子已经通过USB或者外部电源供电,3.3V可以不接,只接SWCLK、SWDIO、GND三根线。但如果板子没供电,ST-LINK的3.3V可以给芯片供电,不过要注意ST-LINK的3.3V输出电流有限(一般100mA左右),带不动整个板子上的外设。

实操心得:接线尽量短,最好在10厘米以内。我遇到过用20厘米杜邦线连接,SWD通信不稳定,时好时坏,换成短排线立刻正常。如果必须用长线,降低SWD时钟频率试试。

2.2 软件连接:三种模式的区别

打开ST-LINK Utility,点击Target菜单,有三个连接选项:

  • Connect:正常连接,芯片必须在运行状态,SWD引脚没有被占用。
  • Connect Under Reset:复位状态下连接,芯片的NRST引脚被拉低,CPU停止运行,SWD引脚强制可用。适合芯片跑飞、SWD引脚被重映射、或者Flash里程序一上电就死循环的情况。
  • Hot Plug:不断电连接,适合芯片已经在运行且不想复位的情况,但成功率较低。

新手最常用的是Connect,如果连不上就换Connect Under Reset。Connect Under Reset需要把ST-LINK的NRST引脚接到STM32的NRST引脚上,多接一根线。很多第三方ST-LINK板子上没有引出NRST,买的时候注意看。

连接成功后,软件下方状态栏会显示芯片型号、Flash容量、电压等信息。比如显示“STM32F103C8T6, 64KB Flash, 3.3V”,说明连接正常。

2.3 连不上芯片的排查流程

连不上是新手遇到最多的问题,按这个顺序排查:

  1. 检查接线:SWCLK和SWDIO有没有接反?GND有没有共地?这是最常见的原因,占我遇到问题的六成以上。
  2. 检查供电:板子有没有供电?用万用表量一下3.3V引脚,正常应该在3.2V到3.4V之间。电压低于3.0V芯片可能不工作。
  3. 检查ST-LINK驱动:设备管理器里有没有识别到ST-LINK?有黄色感叹号就是驱动问题。
  4. 换Connect Under Reset模式:如果正常连接失败,试试复位连接。
  5. 检查芯片是否被读保护:如果之前开过读保护,正常连接会被拒绝,需要先解除保护(后面章节讲)。
  6. 检查SWD引脚是否被占用:如果代码里把PA13、PA14配置成了其他功能,正常连接会失败,用Connect Under Reset。
  7. 换一个ST-LINK试试:第三方ST-LINK质量参差不齐,有些硬件本身就有问题。

我遇到过最诡异的一次:ST-LINK能识别,芯片型号也能读到,但一烧录就报错。折腾半天发现是USB线的问题,那根线只能充电不能传数据。换线立刻正常。所以排查时不要忽略USB线这个变量。

3. 烧录文件:bin、hex、s19格式怎么选

3.1 三种文件格式的本质区别

ST-LINK Utility支持三种烧录文件:bin、hex、s19。它们的区别在于是否包含地址信息:

  • bin文件:纯二进制数据,不包含任何地址信息。烧录时必须手动指定起始地址,否则软件不知道往哪里写。
  • hex文件:Intel Hex格式,文本文件,每行包含地址、数据和校验和。烧录时软件自动解析地址,不需要手动指定。
  • s19文件:Motorola S-record格式,跟hex类似,也包含地址信息,在汽车电子领域用得比较多。

Keil默认生成的是hex文件(需要在Output选项卡里勾选“Create HEX File”),STM32CubeIDE默认生成elf文件,需要手动转换成bin或者hex。

实操建议:日常开发用hex,因为地址信息自带,不容易出错。批量生产用bin,因为文件小,烧录速度快,但一定要在烧录软件里把起始地址设对。STM32的Flash起始地址是0x08000000,这个地址记牢。

3.2 烧录操作全流程

以烧录hex文件为例,完整步骤如下:

  1. 连接芯片,确认状态栏显示正常。
  2. 点击File菜单,选择Open File,选中你的hex文件。软件会自动在下方显示文件内容,包括地址范围和数据。
  3. 点击Target菜单,选择Program & Verify。弹出的对话框里会显示烧录地址范围、校验方式等信息。
  4. 确认无误后点Start。烧录过程中进度条会走动,完成后显示“Programmed successfully”或者类似提示。
  5. 烧录完成后,芯片会自动复位运行(如果勾选了“Reset after programming”选项)。

如果是bin文件,第2步打开文件后会弹窗让你输入起始地址,填0x08000000。其他步骤一样。

烧录速度方面,ST-LINK Utility默认的SWD时钟频率是1.8MHz左右,烧录一个64KB的程序大概需要3到5秒。如果觉得慢,可以在Target菜单的Settings里把频率调高,但调太高可能导致通信不稳定。我一般用4MHz,兼顾速度和稳定性。

3.3 烧录失败的常见原因

烧录失败比连接失败更让人头疼,因为连接成功说明硬件通路没问题,失败往往出在软件配置或者芯片状态上。常见原因有:

  • Flash写保护:芯片的选项字节里开了写保护,任何写入操作都会被拒绝。需要先解除写保护。
  • 读保护开启:读保护开启后,调试器无法访问Flash内容,烧录也会失败。需要先解除读保护(会全片擦除)。
  • 烧录地址错误:bin文件起始地址填错,比如填成了0x00000000,数据写到了系统存储器区域,芯片直接不工作。
  • Flash容量不匹配:比如芯片是64KB Flash,你烧了一个100KB的文件,写到一半就报错。
  • 芯片型号选错:ST-LINK Utility一般会自动识别型号,但如果识别错误,烧录算法会不匹配。

排查时先看报错信息,ST-LINK Utility的报错通常比较具体,比如“Flash memory write protected”就是写保护,“Cannot access memory”就是读保护或者芯片没响应。

4. 擦除操作:全片擦除、扇区擦除和选项字节

4.1 三种擦除方式的适用场景

ST-LINK Utility提供三种擦除方式,在Target菜单的Erase Chip和Erase Sectors里:

  • 全片擦除(Erase Chip):把整个Flash清空,所有数据变成0xFF。适合换程序、解除读保护、芯片状态异常时重置。
  • 扇区擦除(Erase Sectors):只擦除指定的扇区,其他区域保留。适合在已有程序基础上修改部分内容,比如只更新Bootloader或者只更新应用程序区。
  • 选项字节擦除:单独擦除选项字节区域,恢复读保护、写保护等配置到默认状态。

全片擦除最常用,也最安全。我个人的习惯是:每次烧录新程序前先全片擦除,避免旧程序残留数据干扰。虽然多花几秒钟,但能避免很多莫名其妙的问题。

扇区擦除需要了解STM32的Flash扇区划分。不同型号的扇区大小不一样,比如STM32F103C8T6的64KB Flash分为4个扇区,每个扇区1KB;STM32F407的1MB Flash分为12个扇区,前4个16KB,第5个64KB,后面7个128KB。擦除前要查数据手册确认扇区地址范围。

4.2 选项字节:读保护与写保护的开关

选项字节(Option Bytes)是STM32里一块特殊的存储区域,控制着芯片的读保护、写保护、复位行为等。ST-LINK Utility在Target菜单的Option Bytes里可以查看和修改。

读保护(Read Out Protection,RDP)有三个级别:

  • Level 0:无保护,调试器可以自由读写Flash。
  • Level 1:读保护开启,调试器无法读取Flash内容,但可以擦除。烧录新程序前必须先擦除。
  • Level 2:最高保护,调试器完全无法访问,芯片变成“只读”,无法再烧录。这个级别不可逆,设置后芯片基本报废。

新手最容易犯的错误就是不小心把RDP设成了Level 2,芯片直接锁死。所以操作选项字节时一定要看清楚,Level 1和Level 2之间差别巨大。

写保护(Write Protection)可以针对每个扇区单独设置,开启后该扇区无法写入。解除写保护需要先擦除选项字节。

重要提醒:修改选项字节后,芯片需要断电重启才能生效。修改读保护从Level 1到Level 0时,芯片会自动执行全片擦除,Flash里的程序会丢失。操作前确认程序有备份。

4.3 解除读保护的正确姿势

如果芯片被设置了读保护,连接时会提示“Cannot access memory”或者类似信息。解除步骤如下:

  1. 用Connect Under Reset模式连接芯片。
  2. 打开Target菜单,选择Option Bytes。
  3. 在Read Out Protection下拉框里,把Level 1改成Level 0。
  4. 点击Apply。软件会提示“Changing read protection will erase all Flash memory”,确认即可。
  5. 等待擦除完成,芯片自动复位。重新连接,正常。

整个过程大概十几秒,但Flash里的程序全部丢失,需要重新烧录。所以解除读保护前,确认手上有原始程序文件。

如果芯片被设成了Level 2,那就没办法了,ST-LINK Utility会直接拒绝连接,芯片只能换掉。这也是为什么我一直强调:除非产品量产需要防抄板,否则不要碰Level 2。

5. 实战经验:那些文档里不会写的细节

5.1 批量烧录的效率技巧

如果你要烧录几十上百块板子,一块一块手动操作太慢。ST-LINK Utility支持命令行模式,可以写个批处理脚本自动烧录。

命令行基本格式是:

ST-LINK_CLI.exe -c SWD -p firmware.hex -V -Rst

参数说明:-c SWD表示用SWD接口连接,-p指定烧录文件,-V表示校验,-Rst表示烧录后复位。把这个命令写进bat文件,插一块板子双击一次,效率比手动操作高很多。

更进一步,可以用Python脚本调用ST-LINK_CLI,配合USB Hub和多个ST-LINK,实现多工位并行烧录。不过要注意,多个ST-LINK同时工作时,每个的序列号不同,需要在命令行里用-SN参数指定。

5.2 烧录后程序不运行的排查

有时候烧录显示成功,但程序就是不跑。常见原因:

  • 复位引脚被拉低:板子上的复位电路有问题,芯片一直处于复位状态。
  • BOOT引脚配置错误:BOOT0和BOOT1引脚决定了芯片从哪启动。如果BOOT0接高电平,芯片从系统存储器启动,不跑用户程序。正常运行时BOOT0应该接低电平。
  • 时钟配置错误:程序里配置了外部晶振,但板子上没焊晶振,芯片起不来。用HSI内部时钟可以避免这个问题。
  • 中断向量表偏移:如果程序里设置了中断向量表偏移(比如用了Bootloader),但实际烧录地址跟偏移不匹配,中断会跳转到错误位置。

排查时先用ST-LINK Utility读一下Flash内容,确认数据确实写进去了。然后检查BOOT引脚和复位引脚电压。如果都正常,用调试器单步跟踪,看程序卡在哪里。

5.3 ST-LINK Utility与Keil的配合使用

虽然ST-LINK Utility能独立完成烧录,但日常开发中还是Keil用得更多。两个工具配合的关键是:Keil负责编译和调试,ST-LINK Utility负责擦除和救砖。

具体流程:在Keil里编译生成hex文件,如果Keil下载失败,切到ST-LINK Utility,先全片擦除,再手动烧录hex。烧录成功后回到Keil,点Debug按钮,如果能正常进入调试界面,说明芯片状态恢复正常。

有时候Keil下载失败是因为Flash算法配置不对,这时候在Keil的Options for Target里,Debug选项卡,Settings里检查Flash Download的算法是否匹配芯片型号。不匹配的话,从Keil的安装目录下找到对应的FLM文件添加进去。

5.4 常见问题速查表

现象可能原因解决方法
连接时提示“No ST-LINK detected”驱动未安装或USB线问题重装驱动,换USB线
连接时提示“Cannot access memory”读保护开启或芯片未供电解除读保护,检查供电
烧录时提示“Flash memory write protected”写保护开启擦除选项字节,解除写保护
烧录成功但程序不运行BOOT引脚错误或复位电路问题检查BOOT0电平和复位引脚
烧录速度极慢SWD时钟频率过低在Settings里调高频率
芯片型号识别错误ST-LINK固件过旧升级ST-LINK固件
选项字节修改后不生效未断电重启拔插USB或按复位键

这张表里的问题覆盖了我这些年遇到的九成以上情况。遇到新问题先查表,查不到再一步步排查硬件和软件。

6. 从烧录工具延伸到STM32开发习惯

6.1 版本管理与程序备份

烧录工具用熟了之后,很容易忽略一件事:程序备份。我见过太多人,芯片读保护一开,原始程序没了,想改个功能都改不了。所以我的习惯是:每次烧录前,先用ST-LINK Utility把芯片里的程序读出来存成hex文件,跟源码一起归档。

ST-LINK Utility读取Flash的操作很简单:连接芯片后,点击Target菜单的“Save Memory”或者直接点工具栏的读取按钮,选择保存路径和格式即可。读出来的hex文件可以用ST-LINK Utility重新烧录,也可以用其他工具解析。

对于量产产品,建议在出厂前把最终固件读出来存档,标注版本号和日期。后续如果客户反馈问题,可以对比芯片里的程序和存档是否一致,快速定位是程序问题还是硬件问题。

6.2 调试接口的复用与释放

SWD接口占用了PA13和PA14两个引脚,如果项目里这两个引脚不够用,可以在程序里把SWD禁用,释放成普通GPIO。但禁用之后,ST-LINK就再也连不上了,只能通过Connect Under Reset模式救回来。

具体做法是在代码里调用GPIO_PinRemapConfig或者直接配置AFIO寄存器,把SWJ功能关掉。但一定要在禁用之前,确保程序里有一个延时或者按键检测,给自己留一个“后悔窗口”。否则程序一上电就禁用SWD,下次想烧录就只能用Connect Under Reset。

我个人的建议是:除非引脚实在不够用,否则不要禁用SWD。多两个引脚换来的调试便利性,远比省两个引脚划算。

6.3 从ST-LINK Utility到其他烧录工具

ST-LINK Utility是ST-LINK硬件的专用工具,如果你用的是J-Link或者DAP-Link,就需要换其他软件。J-Link用J-Flash,DAP-Link用OpenOCD或者pyOCD。工具不同,但核心逻辑一样:连接、擦除、烧录、校验。

学会了ST-LINK Utility的操作逻辑,换其他工具时只需要熟悉界面布局和参数名称,底层原理是相通的。比如J-Flash里也有Connect、Erase、Program、Verify这些操作,只是菜单位置不同。

对于嵌入式新手,我的建议是先把ST-LINK Utility用熟,理解烧录的完整流程和常见问题。之后不管换什么芯片、什么调试器,都能快速上手。工具会变,但“连接-擦除-烧录-校验”这个流程不会变。

最后分享一个我自己的小习惯:每次开始一个新项目,先用ST-LINK Utility连接芯片,读一下Flash内容,确认芯片是空的还是已经有程序。如果是空片,直接烧录;如果有程序,先备份再擦除。这个习惯帮我避免了好几次误擦重要程序的事故。烧录工具用得好不好,不在于操作多快,而在于每一步都知道自己在做什么、为什么这么做。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/29 16:14:35

Vivado与VSCode协同开发Verilog:插件配置与快捷键全攻略

1. 为什么我彻底放弃了Vivado自带的代码编辑器如果你正在用Xilinx的Vivado做FPGA开发,大概率经历过这样的场景:打开一个几百行的Verilog文件,想改个信号名,结果自带的文本编辑器卡顿到让人怀疑人生;想批量替换某个端口…

作者头像 李华
网站建设 2026/9/29 16:13:29

阿里云产品手册2025.pdf深度解读:从选型地图到成本看板的四步落地法

简介:阿里云产品手册2025.pdf面向云计算从业者、企业架构师、开发者及技术选型人员,系统梳理阿里云全栈产品体系,帮助读者快速建立对云平台能力版图的整体认知,解决产品繁多、分类不清、选型困难等问题。资源为单个PDF文件&#x…

作者头像 李华
网站建设 2026/9/29 16:13:26

TableGIS实战:从混乱表格到行政区统计的轻量地理空间处理

接到一个活儿:把六千多条商家登记数据按行政区归并统计,再交给业务部门做选址参考。听上去不难,但真拿到手才发现,这批数据来自三张Excel、两个CSV和一个残缺的GeoJSON,坐标列的字段名一个叫lng、一个叫longitude、一个…

作者头像 李华
网站建设 2026/9/29 16:13:02

智慧文旅云平台落地实战:从PPT方案到高并发架构的避坑指南

简介:这份智慧文旅云平台建设方案PPT面向文旅行业信息化规划者、系统集成商及政府文旅主管部门,围绕游客体验提升与行业数字化转型需求,提供从顶层设计到落地实施的完整参考框架。压缩包内仅含1个pptx文件,约27.61MB,以…

作者头像 李华
网站建设 2026/9/29 16:12:48

MySQL InnoDB Cluster高可用实战:Router部署与故障排查

说实话,最开始我对MySQL InnoDB Cluster(简称MIC)是持保留态度的。早年搭过MHA、弄过半同步复制,总觉得官方这套东西太“重”——又是组复制又是Router又是Shell的,光名词就能劝退一批人。但真正被生产环境逼着把整套架…

作者头像 李华
网站建设 2026/9/29 16:12:30

AI大模型12-为什么 SFT 之后还要 RLHF?ChatGPT 一鸣惊人的幕后功臣

免费基金定投助手全功能拆解:为什么你的基金定投还在亏钱?因为你的工具用错了。动态平衡仓位管理8种智能定投策略引擎,会自己算买卖点的定投系统-CSDN博客 https://download.csdn.net/download/weitingfu/93448039?spm1001.2014.3001.5503 开…

作者头像 李华