1. 为什么你需要一个迷你ST-LINK V2?
如果你玩过STM32单片机,那你对ST-LINK这个调试下载器肯定不陌生。它就像是STM32的“专属钥匙”,负责把写好的程序代码“灌”进芯片里,还能让你在电脑上实时监控程序的运行状态,看看变量值、单步调试,是开发过程中离不开的得力助手。市面上能买到的ST-LINK V2,大多是基于官方Nucleo开发板上拆下来的方案,体积不小,而且很多还不带虚拟串口功能,调试时还得额外插一个USB转串口模块,桌面上一堆线,乱糟糟的。
所以,我决定自己动手做一个。我的目标很明确:第一,要足够小,能轻松插在开发板排针上不占地方;第二,要带虚拟串口,一根USB线搞定调试和打印;第三,成本要低,自己动手做,物料成本也就十几块钱。最终做出来的成品尺寸是16mm x 45mm,比一个U盘还要小巧,揣在口袋里或者挂在钥匙串上都没问题。这个项目不仅是为了得到一个趁手的工具,更是一个深入了解USB设备、SWD调试协议和STM32启动流程的绝佳实践。无论你是想复刻一个自用,还是想学习硬件设计和固件烧录的完整流程,跟着我一步步来,保证你能收获满满。
2. 硬件设计:麻雀虽小,五脏俱全
别看这个小东西体积迷你,该有的功能一个都不少。它的核心是一颗STM32F103C8T6,也就是我们常说的“蓝莓派”主控。这颗芯片性价比极高,自带USB全速设备接口和SWD调试接口,完美契合我们的需求。整个硬件设计可以拆解为几个关键部分,理解了它们,你就能看懂原理图,甚至自己动手修改。
2.1 核心电路:MCU与电源管理
主控电路是整个调试器的大脑。STM32F103C8T6需要稳定的3.3V供电。我们从USB的5V取电,通过一颗低压差线性稳压器(LDO)转换成3.3V。这里我选用的是RT9013-33GB,它的静态电流低,压差小,输出稳定,非常适合这种USB供电的小设备。为了让MCU稳定工作,电源引脚附近必须放置一个10uF的钽电容和一个0.1uF的陶瓷电容进行滤波,这是硬件设计的黄金法则,能有效抑制噪声。
STM32的时钟电路有两种选择。一种是使用外部高速晶振(通常为8MHz),另一种是使用芯片内部的RC振荡器。为了追求极致的迷你化和可靠性,我选择了使用内部HSI RC振荡器。STM32F103的内部8MHz RC振荡器精度经过校准后,完全能满足USB通信和调试的需求,这样我们就可以省掉外部晶振和两个负载电容,进一步缩小PCB面积。对于32.768kHz的低速晶振,在ST-LINK功能中并非必需,所以也一并省略。
2.2 USB通信与枚举的关键
USB接口是调试器与电脑通信的桥梁。STM32F103的USB是全速(12Mbps)设备,其D+数据线需要通过一个1.5kΩ的电阻上拉到3.3V。这里有个小技巧:这个上拉电阻最好通过一个GPIO引脚来控制。我把它接到了PA12(USB DP)并通过一个1.5k电阻上拉到3.3V,同时这个上拉点受另一个GPIO(如PA11)控制。这样做的目的是,在MCU的固件完全初始化准备好之前,先不接通上拉电阻,避免电脑过早地尝试枚举设备而导致失败。等一切就绪后,再用软件拉高控制引脚,让USB主机正常识别。
USB的D+和D-是一对差分信号线,在PCB布局时必须走成差分对,即两条线平行、等长、间距保持一致。这能保证信号完整性,减少电磁干扰,避免枚举失败或者通信不稳定的问题。Type-C接口的选择让我们的调试器正反插都能用,非常方便,记得在CC1和CC2引脚上各接一个5.1kΩ的下拉电阻到地,这是Type-C设备端的标准配置。
2.3 调试接口与虚拟串口引出
ST-LINK V2的核心功能是通过SWD(Serial Wire Debug)接口调试目标板。我们只需要引出四根线:SWDIO(数据输入输出)、SWCLK(时钟)、GND(地)和3.3V(为目标板供电可选)。这里我使用了一个标准的4Pin 1.27mm间距的排针,既紧凑又可靠。为了保护调试器自身和目标的MCU,可以在SWDIO和SWCLK线上串联一个100欧姆的电阻,起到一定的限流和阻抗匹配作用。
虚拟串口功能则是通过STM32的USART1(PA9为TX,PA10为RX)实现的。我同样将它们引到了另一个4Pin排针上。这样,当你用这个迷你调试器连接目标板时,不仅可以下载调试程序,还能通过PA9和PA10与目标板的串口相连,在电脑上用一个串口助手软件直接打印调试信息,省去了额外模块。PCB布局时,要把这两个排针放在板子边缘,并清晰标注引脚定义,防止接错。
2.4 PCB布局与3D设计实战经验
PCB设计是硬件实现的最后一步,也是决定成败的关键。我的设计原则是“紧凑、整洁、易焊接”。因为板子尺寸只有16mm x 45mm,所以所有元器件都采用0603或更小的0402封装。主控STM32F103C8T6放在板子中央,LDO和USB接口靠近Type-C端口放置,以减少电源路径上的损耗和噪声。
走线优先级:电源 > 时钟/差分信号 > 高速信号 > 低速信号。首先把3.3V和GND的走线布通,并尽量加粗。USB的差分对要优先处理,保证等长和紧耦合。SWD和串口信号属于低速信号,可以稍后安排。在如此小的板子上,铺铜(覆铜)是提供良好地平面和电源平面的重要手段。我在顶层和底层都进行了大面积铺铜,并连接到GND网络,通过大量的过孔将两层地连接在一起,形成一个完整的地平面,这对抑制噪声和保证信号质量至关重要。
使用嘉立创EDA这类免费工具,可以很方便地进行3D预览。在最终投板前,一定要用3D视图仔细检查,确保元器件之间没有干涉,特别是Type-C接口和排针的高度。我第一版设计时就忽略了Type-C接口的金属外壳高度,导致安装外壳后有点挤,第二版做了调整就完美了。最后,别忘了在丝印层清晰标注板子的名称、版本号、USB接口方向和各个排针的定义,这对日后使用和调试非常有帮助。
3. 固件获取与烧录:赋予硬件灵魂
硬件焊接好后,它只是一堆沉默的元器件。固件(Firmware)才是它的灵魂,决定了它是一块普通的STM32开发板,还是一个专业的ST-LINK调试器。ST官方并没有公开ST-LINK的源代码,但幸运的是,其固件文件(.bin或.hex格式)在开源社区和官方评估板资料中是可以找到的。
3.1 固件版本选择与准备
对于我们要实现的“ST-LINK V2 with Virtual COM Port”功能,必须选择正确的固件版本。经过我的实测和社区验证,STLinkV2.J28.M18.bin 这个版本的固件是最合适的。它包含了V2-1版本的功能,即同时支持SWD调试和虚拟串口。你可以在开源硬件平台(如立创开源广场)或者一些开源项目(如正点原子、野火)的资料包里找到这个文件。请务必确认文件名,早期的V2固件(如J16.S4)是不带虚拟串口功能的。
除了固件本身,我们还需要两个关键的软件工具。第一个是 STM32 ST-LINK Utility(版本建议在4.3.0或以下,高版本可能对老旧固件支持不佳),它用于通过另一个现成的ST-LINK给我们的“裸板”烧录初始固件。第二个是 ST-LinkUpgrade,这是ST官方的固件升级工具,在我们完成初始烧录后,用于将调试器的固件版本管理起来。这两个软件都可以在ST官网上找到。
3.2 首次烧录:从“砖头”到“调试器”
刚焊好的板子,其STM32内部是空的,我们需要借助一个“前辈”来引导它。找一块已经能用的ST-LINK调试器(或者任何一款带有ST-LINK的Nucleo开发板),按照下面的步骤操作:
- 硬件连接:用杜邦线将“前辈”ST-LINK的SWD接口(SWDIO, SWCLK, GND, 3.3V)连接到我们自制板的对应引脚上。确保连接牢固,电源正确。
- 打开STM32 ST-LINK Utility:将“前辈”ST-LINK插入电脑,打开软件。正常情况下,软件会识别到连接的“前辈”ST-LINK。
- 连接目标芯片:在软件界面,点击
Target->Connect。这时软件会通过“前辈”尝试连接我们自制板上的STM32F103。如果连接成功,下方日志窗口会显示芯片ID和内存信息。 - 擦除与编程:这是关键一步。先点击
Target->Erase Chip进行全片擦除,确保芯片是空白的。然后点击File->Open file...,选择我们准备好的STLinkV2.J28.M18.bin文件。最后,点击Target->Program & Verify...,在弹出的对话框中,确认编程地址(通常从0x08000000开始),然后点击“Start”按钮。 - 等待完成:编程和校验过程很快,看到“Verification OK”的提示后,就说明固件已经成功写入我们自制的板子了。此时,先不要急着断开连接。
3.3 固件降级与升级:解决兼容性问题
完成首次烧录后,拔掉“前辈”ST-LINK,用一根Type-C数据线将我们自制的调试器直接连接到电脑。Windows会自动识别并安装驱动(如果没有,可能需要手动指定驱动目录,通常在ST-LINK Utility的安装文件夹里)。设备管理器里应该会出现“STMicroelectronics STLink dongle”和“USB Serial Device(COMx)”两个设备,后者就是虚拟串口。
但是,你可能会遇到一个问题:用Keil MDK打开一个STM32工程,选择我们自制的ST-LINK进行下载时,Keil会弹窗提示“ST-LINK固件版本过旧,需要更新”。如果你点击“Yes”同意更新,很可能会失败,并提示“固件文件太大”。这是因为我们使用的STM32F103C8T6的Flash容量是64KB,而Keil想要推送的最新版固件可能超过了这个大小。
解决方案有两个:
方案一(推荐,简单直接):打开Keil的配置,在 Debug -> Settings -> ST-LINK Debugger 的 Debug 选项卡中,取消勾选“Update Target before Debugging”或类似选项。这样Keil就不会在每次调试前检查并尝试更新固件了。
方案二(一劳永逸):将主控芯片更换为 STM32F103CBT6。这是C8T6的大容量版本,引脚完全兼容,但Flash有128KB,足以容纳最新版固件。如果你用的是CBT6,那么在首次烧录 J28.M18 固件后,可以直接在Keil中完成升级,之后就能享受最新固件的特性了。
如果你用的是C8T6,并且希望固件版本显示正确,可以使用 ST-LinkUpgrade 工具进行手动“降级”。打开ST-LinkUpgrade,软件会自动识别设备,并显示当前固件版本(如J28.M18)。在软件的固件列表中选择一个稍旧的、确认可用的V2版本(例如V2.J24.M11),然后点击“Upgrade”按钮。这个过程实际上是向芯片写入一个版本号信息,并可能替换部分内容,使其与Keil的期望版本匹配,从而避免更新提示。
4. 功能验证与实战技巧
固件烧录并处理好版本问题后,我们的迷你ST-LINK V2调试器就正式完工了。是骡子是马,得拉出来溜溜。下面我们从几个方面来全面验证它的功能,并分享一些我踩过坑后总结的实用技巧。
4.1 基础功能测试:连接与识别
首先,将调试器插入电脑USB口,观察板载的LED指示灯(如果有的话)。通常,红色常亮表示USB枚举成功,与电脑建立了连接。打开电脑的设备管理器,你应该能看到两类设备:
- 调试器本体:在“通用串行总线设备”或“libusb-win32 devices”下,会有一个“STMicroelectronics STLink dongle”。
- 虚拟串口:在“端口(COM和LPT)”下,会新增一个“USB Serial Device(COMx)”,记住这个COM口号,比如COM3。
如果只有其中一个,或者都没有,那就要检查硬件焊接(特别是USB的D+、D-和上拉电阻)以及固件是否正确。虚拟串口驱动有时需要手动安装,你可以尝试使用ST官方的“STSW-LINK007”这个USB驱动包。
接下来,用杜邦线将调试器的SWD接口(3.3V, GND, SWDIO, SWCLK)连接到另一块STM32目标板(比如一个最小系统板)。打开Keil MDK,创建一个简单的点灯工程。在 Options for Target -> Debug 设置中,选择“Use: ST-Link Debugger”,然后点击旁边的“Settings”。在“Debug”选项卡中,如果Port选择“SW”后,右侧能识别到“Device Name”(例如STM32F103C8),并且下方没有报错,那就说明SWD调试连接成功了!你可以尝试下载一个简单的程序到目标板,看看LED是否能正常闪烁。
4.2 虚拟串口实战:调试信息输出
虚拟串口功能是这个小调试器的精华所在。我们将调试器的TX(PA9)连接到目标板的RX,调试器的RX(PA10)连接到目标板的TX,GND互连。在目标板的代码中,初始化USART1,并重写printf函数指向串口1。
// 示例:STM32 HAL库中串口发送一个字符
int _write(int file, char *ptr, int len) {
HAL_UART_Transmit(&huart1, (uint8_t*)ptr, len, 1000);
return len;
}
// 然后在main函数中
printf("Hello from my Mini ST-LINK V2!\r\n");
编译下载程序到目标板。打开电脑上的串口助手软件(如Putty、XCOM),选择刚才设备管理器里看到的COM口(如COM3),设置波特率(与代码中一致,如115200)、数据位8、停止位1、无校验。复位目标板,你应该能在串口助手接收区看到“Hello from my Mini ST-LINK V2!”这行打印信息。这意味着,仅用一根USB线,你就同时完成了程序下载、在线调试和串口打印这三件最重要的事,桌面瞬间清爽。
4.3 常见问题与排查指南
自己动手做东西,遇到问题是常态。这里我总结几个最常见的问题和排查思路:
-
问题一:电脑完全无法识别USB设备。
- 检查:Type-C线是否支持数据传输(有些线只能充电)。USB的D+和D-是否接反、短路或断路。1.5kΩ上拉电阻是否焊接良好,是否接到了正确的3.3V上。STM32的USB_DP(PA12)引脚是否虚焊。
- 技巧:用万用表二极管档,测量USB接口的VCC和GND之间是否短路。测量D+对地、D-对地的阻抗,应该大致相等。
-
问题二:能识别ST-LINK,但没有虚拟串口。
- 检查:固件版本是否正确,必须是支持VCP(虚拟串口)的版本,如J28.M18。电脑是否安装了正确的USB转串口驱动(可尝试安装ST官方的VCP驱动)。
- 技巧:在设备管理器中,右键点击未知设备,选择“更新驱动程序”,手动指向ST-LinkUpgrade或STM32 CubeProgrammer安装目录下的驱动文件夹。
-
问题三:Keil可以识别ST-LINK,但下载时失败,提示“No Target Connected”。
- 检查:SWD的四根线(3.3V, GND, SWDIO, SWCLK)是否与目标板连接正确且牢固。目标板是否已供电(如果调试器不提供3.3V输出,目标板需独立供电)。目标芯片的型号在Keil中是否选择正确。
- 技巧:尝试降低SWD时钟速度。在Keil的Debug Settings里,找到“Clock”选项,从默认的4MHz或1MHz降到100kHz试试。有时候目标板刚上电或复位后需要一个短暂的稳定时间,可以在Keil的“Reset”选项里尝试选择“Connect under reset”或“Hardware Reset”。
-
问题四:虚拟串口能识别,但收发数据乱码或不通。
- 检查:串口线的TX和RX是否交叉连接(调试器的TX接目标板RX,调试器RX接目标板TX)。代码中的波特率、数据位、停止位、校验位是否与串口助手设置完全一致。STM32的USART1时钟是否使能并配置正确。
- 技巧:用一个USB转TTL模块,单独测试目标板的串口功能是否正常,以排除是调试器这边的问题还是目标板代码的问题。
5. 进阶玩法与扩展思考
做到这里,一个功能完善的迷你ST-LINK V2调试器已经在你手中了。但技术的乐趣在于不断探索。这个基于STM32F103的小板子,其实还有很大的潜力可以挖掘。
潜力一:摇身一变成为DAP-LINK。 CMSIS-DAP是ARM官方推出的开源调试器协议,兼容性更广,理论上可以调试所有ARM Cortex-M内核的芯片。网上有开源的DAP-LINK固件项目(如ARMmbed/DAPLink)。你可以通过串口ISP的方式,擦除现有的ST-LINK固件,然后刷入DAP-LINK的Bootloader和应用程序固件,这样你的小工具就变成了一个迷你DAP-LINK调试器。我试过,过程稍微复杂一点,需要用到串口和Boot0跳线,但成功后成就感加倍。
潜力二:探索虚拟U盘拖拽下载。 更高级的ST-LINK V2-1固件(如某些Nucleo板载的版本)还支持“拖拽下载”功能。插上电脑后,它会模拟成一个U盘,你把编译好的.bin文件直接拖进去,它就会自动烧录到连接的目标STM32芯片里,非常酷炫。这需要固件和硬件设计上对USB大容量存储设备(MSC)类的支持。你可以研究官方Nucleo板的原理图,看看他们是如何连接STM32的USB和SPI Flash来实现这个功能的,或许可以给你的下一个版本增加这个特性。
潜力三:硬件优化与个性化。 现在的板子是最简设计。你可以根据自己的需求添加更多功能。比如,增加一个LED指示灯来更直观地显示状态(枚举中、通信中、错误);为3.3V输出增加一个可控制的MOSFET开关,方便给目标板断电重启;甚至可以把SWD和串口接口换成更耐用的弹簧针或贴片连接器。PCB的形状也可以设计得更有趣,比如做成一个钥匙扣的形状,或者加上你的个人Logo。
回过头看,这个DIY项目贯穿了从原理图设计、PCB布局、元器件焊接,到固件烧录、驱动安装、功能测试的完整流程。它不仅仅让你得到了一个便宜好用的工具,更重要的是,你亲手打通了“想法”到“实物”的每一个环节。下次当你的同事还在为找调试器而翻箱倒柜时,你可以从容地从口袋里掏出这个自己做的迷你工具,那种感觉,绝对比直接买一个成品要爽得多。硬件设计的细节决定成败,比如那个1.5kΩ的USB上拉电阻,我最初用了10kΩ,结果枚举时好时坏,排查了好久才锁定问题。软件工具链的熟悉也至关重要,知道在哪个环节该用STM32 ST-LINK Utility,哪个环节该用ST-LinkUpgrade,能节省大量时间。希望我的这些经验和踩过的坑,能帮你更顺利地完成自己的作品。
332



被折叠的 条评论
为什么被折叠?



