4、ST-Link详解:ST-Link版本演进、ST-Link与STM32CubeProgrammer、ST-Link的虚拟串口功能
做嵌入式开发这些年,ST-Link 是我用得最多的调试器,没有之一。从早期的 ST-Link/V1 到现在的 STLINK-V3,每个版本我都踩过坑。今天咱们就把这个“小蓝盒子”彻底聊透。
核心要点:ST-Link 不仅是调试器,它还集成了虚拟串口(VCP)和存储烧录功能。选对版本,能省掉你一个外接 USB-TTL 的钱。
4.1 ST-Link 版本演进:从 V1 到 V3 的变迁
ST-Link 的版本迭代,说白了就是速度越来越快、功能越来越全。我最早用 ST-Link/V1 时,烧个 512KB 的固件要等半分钟,现在 V3 几秒就搞定。
| 版本 | SWD 最高频率 | 虚拟串口 | 目标电压 | 典型板型 |
|---|---|---|---|---|
| ST-Link/V1 | 1.2 MHz | 不支持 | 5V 固定 | 大蓝盒 |
| ST-Link/V2 | 4 MHz | 支持(部分) | 3.3V / 5V 可选 | 小蓝盒 |
| ST-Link/V2-ISOL | 4 MHz | 支持(隔离) | 3.3V / 5V 可选 | 带隔离 |
| STLINK-V3SET | 24 MHz | 支持(多路) | 1.65V ~ 3.6V | 模块化 |
| STLINK-V3PWR | 24 MHz | 支持(带电流测量) | 1.65V ~ 3.6V | 带功耗分析 |
避坑提醒:我曾经在项目里用了 ST-Link/V1 去调试 STM32F4,结果 SWD 频率太低,调试时经常断连。后来换成 V2 才稳定。如果你用 F4/H7 系列,至少选 V2。
V2 是目前最普及的版本。Nucleo 板和 Discovery 板上集成的就是它。V3 主要面向专业用户,支持多路虚拟串口和更高的调试带宽。我个人习惯在量产测试时用 V3,开发阶段用 V2 就够了。
4.2 ST-Link 与 STM32CubeProgrammer 的配合
STM32CubeProgrammer(简称 CubeProg)是 ST 官方推出的烧录工具。它和 ST-Link 的关系,就像钥匙和锁——ST-Link 是硬件接口,CubeProg 是软件控制台。
为什么我推荐用 CubeProg 而不是 Keil/IAR 自带的烧录功能?
- 批量烧录:CubeProg 支持命令行模式,可以写脚本一键烧录。我曾在产线上用 Python 调用 CubeProg CLI,一天烧了 2000 片。
- 选项字节配置:读保护(RDP)、看门狗设置、启动模式,这些在 CubeProg 里一目了然。
- 固件升级:ST-Link 本身的固件也是通过 CubeProg 更新的。嗯,这里要注意——V2 的旧固件不支持虚拟串口,升级后才能用。
实用技巧:用 CubeProg 的“Firmware Upgrade”功能时,记得先断开调试连接。我曾经在调试状态下升级固件,结果 ST-Link 变砖了。还好 ST-Link 有 Bootloader 保护,重新上电按住复位键就能恢复。
下面这张图展示了 ST-Link 与 CubeProg 的协作流程:
4.3 ST-Link 的虚拟串口功能
虚拟串口(Virtual COM Port,VCP)是 ST-Link 最实用的附加功能。它通过 USB 模拟出一个串口,让你不用额外接 USB-TTL 就能打印调试信息。
你想想看,调试时只需要一根 USB 线,既能烧录又能看串口日志,多方便。
4.3.1 硬件连接
ST-Link 的 VCP 信号线是固定的:
- SWIM / SWO:V2 版本用这个引脚输出 VCP 数据(仅限 STM8 调试模式)
- TX / RX:V3 版本有独立的 UART 引脚,与 SWD 分开
- GND:必须共地
注意:ST-Link/V2 的 VCP 和 SWO 共用引脚。如果你要用虚拟串口,就不能同时用 SWO 做跟踪输出。我在一个项目中就吃过这个亏——想同时看 ITM 日志和串口打印,结果发现只能二选一。
4.3.2 驱动安装
Windows 下需要安装 ST-Link VCP 驱动。我建议直接从 ST 官网下载 en.stsw-link009.zip,解压后运行 dpinst_amd64.exe。装好后设备管理器里会出现 STMicroelectronics STLink Virtual COM Port。
Linux 下不需要额外驱动,内核自带 CDC ACM 驱动。插上后一般显示为 /dev/ttyACM0。
4.3.3 代码配置
以 STM32CubeIDE 为例,启用 VCP 只需要两步:
- 在
.ioc文件中使能USART2(Nucleo 板默认连接) - 设置波特率 115200,8N1 模式
发送数据的代码很简单:
#include "stdio.h"
// 重定向 printf 到串口
int __io_putchar(int ch) {
HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
int main(void) {
HAL_Init();
SystemClock_Config();
MX_USART2_UART_Init();
printf("ST-Link VCP 测试开始\r\n");
while (1) {
printf("系统运行中... 时间戳: %lu\r\n", HAL_GetTick());
HAL_Delay(1000);
}
}
小技巧:如果你用串口助手收不到数据,先检查 ST-Link 固件版本。V2 的旧固件(V2.J17 以下)默认关闭 VCP 功能。用 CubeProg 升级到最新固件就能解决。我遇到过好几次这种“硬件没问题,软件没配置”的坑。
4.3.4 波特率与稳定性
ST-Link VCP 的波特率范围是 9600 ~ 921600。我个人习惯用 115200,稳定且兼容性好。如果你要高速传输日志,可以试试 460800,但线长不要超过 30cm。
| 波特率 | 最大线长(USB + 杜邦线) | 适用场景 |
|---|---|---|
| 9600 | 2m | 低功耗调试 |
| 115200 | 1m | 日常开发 |
| 460800 | 30cm | 高速日志输出 |
| 921600 | 15cm | 压力测试 |
嗯,这里要注意——VCP 的稳定性受 USB 线质量影响很大。我曾经用一根劣质 USB 线,115200 都丢包。换根带磁环的线就好了。
4.4 小结
ST-Link 从 V1 到 V3,核心变化就是更快、更稳、功能更全。V2 是性价比之王,V3 是专业利器。虚拟串口功能让调试变得简单——一根线搞定烧录和日志。配合 STM32CubeProgrammer 的命令行模式,产线烧录效率能提升好几倍。
如果你还在用串口线加调试器的组合,不妨试试 ST-Link 的 VCP。省一个 USB 口,少一根线,桌面也清爽不少。