ARTICLE DETAIL

资讯详情

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

ST-LINK Utility烧录STM32全指南:SWD与JTAG实战

ST-LINK Utility烧录STM32全指南:SWD与JTAG实战 1. 为什么ST-LINK Utility在今天依然值得装进工具箱STM32的烧录工具这些年换了一茬又一茬Keil自带的下载算法、STM32CubeProgrammer、OpenOCD、J-Flash每一个都能干活。但如果你手上有一块老旧的ST-LINK V2或者你经常需要在没有完整IDE的环境里快速验证一块板子能不能跑起来ST-LINK Utility依然是那个最省心的选择。它体积小、启动快、不依赖工程文件插上就能读芯片ID、擦除、烧录、校验整个流程一气呵成。这篇内容面向的是刚接触STM32的开发者以及那些手上有ST-LINK但一直用Keil点下载按钮、没真正理解SWD和JTAG区别的人。我会从驱动安装开始把ST-LINK Utility的完整使用链路讲清楚包括SWD和JTAG两种模式的接线差异、烧录参数的设置逻辑、常见报错的排查思路以及在实际项目中积累下来的一些经验。关键词覆盖ST-LINK Utility、SWD、JTAG、STM32、烧录这几个核心点读完之后你应该能独立完成从零到烧录成功的全过程。需要提前说明的是ST-LINK Utility官方已经停止更新ST官方主推的是STM32CubeProgrammer。但停止更新不代表不能用它的核心功能依然稳定尤其是在Windows环境下对老版本ST-LINK V2的兼容性反而更好。我自己的工具箱里两个都留着ST-LINK Utility用来做快速验证STM32CubeProgrammer用来处理新芯片和复杂配置。两者不冲突各有各的适用场景。2. 驱动安装与ST-LINK硬件识别那些容易卡住的环节2.1 ST-LINK驱动到底装哪个版本ST-LINK的驱动来源主要有三个ST官方独立驱动包、Keil安装目录下的驱动、以及Windows自动匹配的通用驱动。这三个来源的驱动版本不同行为也不一样。我遇到过最典型的问题是设备管理器里ST-LINK显示为“STLink USB Device”但ST-LINK Utility就是连不上换一个驱动版本就正常了。推荐的做法是直接安装ST-LINK Utility安装包里自带的驱动。安装程序运行到最后会弹出驱动安装向导这一步不要跳过。如果你已经装过其他版本的驱动建议先在设备管理器里卸载掉现有的ST-LINK设备勾选“删除此设备的驱动程序软件”然后重新插拔再运行ST-LINK Utility安装目录下的dpinst_amd64.exe64位系统或dpinst_x86.exe32位系统。安装完成后设备管理器里应该能看到两个设备一个是“STMicroelectronics STLink dongle”另一个是“STMicroelectronics STLink Virtual COM Port”。后者是ST-LINK V2-1版本才有的虚拟串口V2版本没有这个设备。如果你用的是V2版本只看到一个设备是正常的。注意有些廉价ST-LINK V2克隆版使用的是STM32F103C8T6主控驱动识别没有问题但在固件版本上可能和原版有差异。如果ST-LINK Utility提示固件需要升级先不要急着点“Yes”克隆版升级固件有概率变砖。可以先点“No”跳过大部分烧录功能依然可用。2.2 硬件连接SWD和JTAG的引脚对应关系ST-LINK V2的20针接口定义是标准的ARM JTAG 20针但STM32目标板上的调试接口通常是简化的。SWD模式只需要四根线VCC、GND、SWDIO、SWCLK。JTAG模式需要五根线VCC、GND、TMS、TCK、TDI、TDO实际上至少六根。这里有一个容易搞混的地方ST-LINK V2的20针接口里SWDIO对应的是第7针SWCLK对应的是第9针。而很多STM32开发板上的SWD接口是四针或五针的简易排针丝印标注可能是“SWDIO”“SWCLK”“GND”“3.3V”直接对应连接即可。ST-LINK V2 20针引脚信号名SWD模式用途JTAG模式用途1VTref目标板参考电压目标板参考电压7SWDIO/TMS数据线TMS9SWCLK/TCK时钟线TCK13SWO/TDO可选SWO输出TDO15nRESET复位控制复位控制4/6/8/10/12/14/16/18/20GND地地实际接线时VCC不一定要接。ST-LINK V2可以通过VTref引脚检测目标板电压如果目标板已经独立供电VCC可以不连只接GND、SWDIO、SWCLK三根线就能工作。但如果你用的是没有独立供电的裸芯片就需要把VCC接上让ST-LINK给目标板供电。不过要注意ST-LINK V2的供电能力有限大概只有100mA左右驱动大一点的板子可能不够。2.3 14针双排JTAG定位键的坑有些工控板或者开发板上的JTAG接口是14针双排的这种接口的定位键位置和标准20针不同。14针JTAG的引脚定义里第1针通常是VTref第2针是GND第3针是nTRST第4针是GND第5针是TDI第6针是GND第7针是TMS第8针是GND第9针是TCK第10针是GND第11针是RTCK第12针是GND第13针是TDO第14针是GND。如果你手头的ST-LINK是20针的要转接到14针的板子上需要一个转接板或者自己压一根排线。转接的时候最容易搞错的是定位键的方向。我的经验是先找到板子上的第1针标记通常是方形焊盘或者丝印上的小三角然后对照ST-LINK端的第1针位置确保两边的信号一一对应。如果接反了ST-LINK Utility会提示“No target connected”或者“SWD/JTAG communication failure”不会烧坏芯片但会浪费不少时间。3. ST-LINK Utility的界面逻辑与烧录参数设置3.1 主界面功能分区打开ST-LINK Utility主界面分为几个区域顶部菜单栏、工具栏、左侧的存储器浏览区、右侧的信息输出区。工具栏上最常用的几个按钮是Connect、Disconnect、Erase Chip、Program、Verify、Start Debug Session。Connect按钮旁边有一个下拉箭头可以选择连接模式Normal、Hot Plug、Under Reset。这三个模式的区别很关键。Normal模式是常规连接ST-LINK先复位目标芯片再连接。Hot Plug模式是不复位直接连接适合芯片已经在运行、你不想打断它的情况。Under Reset模式是保持复位状态连接适合芯片因为程序跑飞或者引脚配置错误导致无法正常连接的情况。我遇到“Could not stop Cortex-M device”这个报错的时候十有八九是因为芯片进入了低功耗模式或者某个引脚被配置成了特殊功能导致调试接口被禁用。这时候切换到Under Reset模式先按住板子上的复位键点Connect再松开复位键通常就能连上。3.2 烧录文件的加载与地址设置ST-LINK Utility支持的文件格式包括.hex、.bin、.s19Motorola S-record等。.hex和.s19文件自带地址信息加载后会自动填充到对应的存储器区域。.bin文件是纯二进制加载时需要手动指定起始地址。STM32的Flash起始地址通常是0x08000000这个地址在大多数型号上是固定的。加载文件的操作是File - Open File选择你的固件文件。如果是.bin文件会弹出一个对话框让你输入起始地址。这里填0x08000000。如果你用的是带Bootloader的方案应用程序的起始地址可能是0x08004000或者0x08008000具体要看Bootloader占用了多少空间。加载完成后存储器浏览区会显示对应地址的数据。你可以右键点击某个区域选择“Save As”把当前芯片里的内容读出来保存这个功能在做固件备份或者对比的时候很有用。3.3 烧录参数的配置逻辑点击Program按钮之前先点一下工具栏上的“Settings”按钮或者通过Target - Settings进入配置界面。这里有几个关键选项Verify after programming烧录后自动校验建议勾选。校验会逐字节对比芯片内容和源文件确保烧录没有出错。Skip Flash sectors that are not blank跳过非空扇区一般不勾选。如果勾选了烧录时只写入空白区域已有数据的区域会被跳过容易导致固件不完整。Erase necessary sectors only只擦除需要写入的扇区建议勾选。这样比全片擦除快很多尤其是大容量芯片。Reset after programming烧录后自动复位建议勾选。这样烧录完程序直接开始运行不用手动按复位键。在Program界面里还有一个“Start address”选项。如果你加载的是.hex文件这个地址会自动填充不用改。如果是.bin文件这里填的地址要和加载文件时填的地址一致。提示ST-LINK Utility的烧录速度受SWD时钟频率影响。在Settings - Reset Mode里可以调整SWD频率默认是4MHz。如果线缆较长或者目标板干扰较大可以降到1MHz或更低牺牲速度换稳定性。我一般先用默认频率试如果报通信错误再降频。4. SWD与JTAG的取舍什么时候用哪个4.1 SWD模式的优势与适用场景SWD是Serial Wire Debug的缩写只需要两根信号线SWDIO和SWCLK就能完成调试和烧录。相比JTAGSWD的引脚占用少对于引脚资源紧张的STM32项目来说非常友好。而且SWD在高速通信下的稳定性通常比JTAG好尤其是在线缆较长的情况下。SWD的另一个优势是支持SWOSerial Wire Output可以通过一根额外的线输出调试信息配合ITMInstrumentation Trace Macrocell可以实现printf重定向不需要占用串口。这个功能在调试实时性要求高的代码时很有用。我自己的习惯是新项目一律用SWD除非目标板只有JTAG接口。SWD的接线简单四根线搞定不容易接错。而且ST-LINK V2对SWD的支持很成熟基本不会出现兼容性问题。4.2 JTAG模式什么时候必须用JTAG的优势在于支持边界扫描和多器件菊花链。如果你在调试一个包含多个ARM芯片或者FPGA的板子JTAG可以把多个器件串联在一条链上通过IDCODE区分不同的器件。SWD不支持菊花链只能一对一连接。另外有些老旧的STM32型号或者某些特定封装的芯片可能只支持JTAG不支持SWD。比如STM32F1系列的部分型号SWD和JTAG都支持但如果你把JTAG引脚复用成了GPIOSWD可能也会受影响。这时候要么用JTAG要么通过Boot模式或者复位模式来恢复。还有一个场景是当你需要用到ETMEmbedded Trace Macrocell做指令级追踪的时候必须用JTAG。SWD只支持SWO不支持ETM。不过ETM需要额外的Trace引脚一般只有高端型号才支持。4.3 STM32禁用JTAG后如何恢复这是一个非常经典的坑。STM32的JTAG引脚PA13、PA14、PA15、PB3、PB4在上电默认是JTAG功能。如果你在代码里把这些引脚配置成了普通GPIO下次烧录的时候ST-LINK就找不到芯片了。报错通常是“No target connected”或者“SWD/JTAG communication failure”。恢复的方法有几种。第一种是用Under Reset模式连接按住复位键点Connect松开复位键。这样芯片在复位期间JTAG功能还是默认状态ST-LINK能连上。连上之后立刻执行全片擦除把导致引脚复用的程序擦掉。第二种方法是通过Boot模式。把BOOT0拉高BOOT1拉低芯片从系统存储器启动这时候调试接口是默认状态。连上之后擦除Flash再把BOOT0拉低恢复正常启动。第三种方法是用STM32CubeProgrammer的“Hot Plug”模式有时候能绕过这个问题。但最可靠的还是Under Reset加全片擦除。注意GD32F4系列也有类似的问题关闭JTAG引脚后需要用同样的方法恢复。GD32的复位模式连接和STM32基本一致ST-LINK Utility也能识别GD32的部分型号但烧录算法可能需要手动选择。5. 烧录失败的排查链路从报错到解决5.1 “No target connected”的逐步排查这个报错是最常见的原因也最多。我一般按照以下顺序排查第一步检查硬件连接。用万用表量一下ST-LINK和目标板之间的SWDIO、SWCLK、GND是否导通。有时候排线内部断了外表看不出来。特别是那种便宜的杜邦线用几次就接触不良。第二步检查目标板供电。用万用表量一下目标板的3.3V是否正常。如果目标板没有独立供电ST-LINK的VTref引脚应该能检测到电压。如果VTref电压为0ST-LINK不会输出任何信号。第三步检查复位引脚。有些板子的复位引脚被外部电路拉死了导致ST-LINK无法复位芯片。可以尝试把nRESET线断开用Under Reset模式手动复位。第四步降低SWD频率。在Settings里把频率降到1MHz甚至500kHz再试。第五步换一个ST-LINK试试。克隆版ST-LINK的固件版本参差不齐有些版本对特定芯片的支持有问题。5.2 “Could not stop Cortex-M device”的根因分析这个报错的完整信息通常是“Could not stop Cortex-M device! Please check the JTAG cable.”。字面意思是无法停止Cortex-M内核实际上是因为调试接口被禁用了或者芯片进入了某种低功耗状态导致ST-LINK无法通过调试接口控制内核。根因通常有三个一是代码里禁用了JTAG/SWD引脚二是芯片进入了Stop或Standby模式三是看门狗在不断复位芯片导致连接窗口太短。解决方法用Under Reset模式连接连上后立即全片擦除。如果Under Reset也不行检查BOOT0引脚尝试从系统存储器启动。如果还不行可能需要用串口ISP的方式擦除或者用J-Flash的“Unsecure”功能解锁。5.3 Keil5烧录失败与ST-LINK Utility的配合Keil5的烧录失败报错有时候很模糊比如“Flash Download failed”或者“Cannot Load Flash Programming Algorithm”。这时候可以先用ST-LINK Utility验证一下ST-LINK和芯片的连接是否正常。如果ST-LINK Utility能连上并烧录说明硬件没问题问题出在Keil的配置上。Keil5里需要检查的几个地方Options for Target - Debug - Settings确认Port选的是SWD还是JTAG和实际接线一致。Flash Download选项卡里确认Programming Algorithm加载了对应芯片型号的算法文件。如果芯片包没装全算法文件可能缺失。另外Keil5同时装C51和STM32的芯片包时有时候会出现冲突。表现是STM32的芯片包在Keil里看不到或者烧录算法加载失败。解决方法是先装C51再装STM32的芯片包顺序反了容易出问题。6. 从ST-LINK Utility延伸到批量烧录与OTA升级6.1 命令行模式实现自动化烧录ST-LINK Utility提供了一个命令行工具ST-LINK_CLI.exe位于安装目录下。这个工具可以在批处理脚本里调用实现自动化烧录。基本用法是ST-LINK_CLI.exe -c SWD -p firmware.hex -v -Rst参数说明-c SWD指定连接模式为SWD-p指定要烧录的文件-v表示烧录后校验-Rst表示烧录后复位运行。如果需要全片擦除加上-ME参数。在产线批量烧录的场景里可以把多个板子接到一个USB HUB上用脚本循环调用ST-LINK_CLI每个ST-LINK的序列号不同可以通过-c SWD -S serial来指定具体的ST-LINK。不过ST-LINK Utility对多ST-LINK同时连接的支持有限更推荐用STM32CubeProgrammer的命令行版本它对多设备并发的支持更好。6.2 烧录文件格式的转换与处理ST-LINK Utility支持.hex、.bin、.s19等格式但有时候你拿到的固件是其他格式比如.elf或者.axf。这些格式不能直接烧录需要先转换成.bin或.hex。转换工具可以用Keil自带的fromelf或者用arm-none-eabi-objcopy。用fromelf转换的命令是fromelf --bin --output firmware.bin firmware.axf用objcopy转换的命令是arm-none-eabi-objcopy -O binary firmware.elf firmware.bin转换出来的.bin文件烧录时需要指定起始地址。如果是.hex文件地址信息已经包含在文件里不需要额外指定。Motorola S-record格式.s19在一些工业场景里用得比较多ST-LINK Utility也能直接加载。.s19文件是文本格式每一行以S开头后面跟记录类型、长度、地址和数据。解析.s19文件的时候要注意地址的字节序不同工具生成的.s19文件可能有差异。6.3 STM32 OTA升级与ST-LINK烧录的关系OTA升级和ST-LINK烧录是两条不同的路径。ST-LINK烧录是物理连接通过调试接口直接写入Flash。OTA是通过通信接口串口、CAN、以太网等接收固件数据由Bootloader写入Flash。但两者有一个共同点都需要一个可靠的Bootloader来管理Flash的擦写和跳转。在做OTA方案的时候我通常先用ST-LINK Utility把Bootloader烧进去然后通过OTA方式升级应用程序。Bootloader的起始地址固定在0x08000000应用程序的起始地址根据Bootloader的大小来定常见的是0x08004000或0x08008000。Bootloader里需要实现的关键功能包括接收固件数据、校验数据完整性CRC或SHA、擦除应用程序区、写入新固件、跳转到应用程序。跳转之前要关闭所有中断设置栈指针然后跳转到应用程序的复位向量。ST-LINK Utility在OTA开发中的作用是当OTA升级失败导致应用程序损坏时可以用ST-LINK Utility重新烧录Bootloader或者完整的固件把板子救回来。所以做OTA方案的时候一定要保留SWD接口方便紧急恢复。7. 一些实际项目中积累的零散经验ST-LINK Utility的“Connect”按钮在连接成功后如果目标板断电再上电需要重新点Connect。它不会自动重连。在批量烧录的场景里这一点要注意脚本里每次烧录前都要重新连接。ST-LINK V2的固件升级要谨慎。原版ST-LINK V2升级固件一般没问题但克隆版升级后可能无法识别。如果ST-LINK Utility提示固件版本过旧但功能正常可以忽略提示。如果确实需要升级先用STM32CubeProgrammer试试它对克隆版的兼容性稍好一些。烧录大容量芯片的时候ST-LINK Utility的烧录速度会比STM32CubeProgrammer慢一些。比如STM32F4系列1MB Flash的芯片ST-LINK Utility全片烧录大概要十几秒STM32CubeProgrammer可能只要几秒。如果时间敏感可以用STM32CubeProgrammer做批量烧录ST-LINK Utility做调试和验证。最后说一个关于SWD线缆长度的问题。SWD在高速通信下对线缆长度比较敏感超过20厘米的杜邦线就容易出现通信错误。如果必须用长线把SWD频率降到1MHz以下或者用屏蔽线。我在一个电机控制项目里因为板子和ST-LINK之间隔了一个金属外壳用了30厘米的排线4MHz下频繁报错降到500kHz后稳定运行。
返回列表