1. 为什么要折腾STlink改Jlink这件事
手头同时有STlink和Jlink的兄弟可能觉得这操作纯属闲得慌,但如果你跟我一样,主力开发板是STM32,偶尔又要摸一摸GD32、MM32、APM32这些国产替代片子,就会明白一个Jlink有多重要。STlink便宜、原厂驱动稳、跟STM32CubeProgrammer和Keil配合得也好,但它有个硬伤——基本只认ST自家的芯片。Jlink呢,通吃ARM Cortex-M全家桶,RTT调试、J-Flash批量烧录、J-Scope实时看波形,功能强出一大截,可正版价格摆在那,随便一个EDU版本就要三四百块。
我手上正好有两三个闲置的STlink V2,都是当年买开发板送的或者十几块钱淘的,平时吃灰。某天在调试一块国产M0+内核的板子时,STlink死活连不上,翻出Jlink又发现是山寨货驱动老掉牙。于是动了念头:能不能把STlink的硬件刷成Jlink固件?查了一圈资料,发现这事在圈子里早就有人干,原理也不复杂——STlink V2用的主控是STM32F103C8T6,而Jlink OB(On-Board)早期版本用的也是同款芯片,硬件层面几乎一模一样,区别只在固件和部分引脚定义。
说白了,这就是一次固件替换的操作。把STlink原厂固件擦掉,写入Jlink OB的固件,再改一下USB描述符让电脑识别成Jlink设备,一个山寨版Jlink OB就诞生了。成本几乎为零,省下的三百块够买好几块开发板。但这里面坑不少:固件版本选哪个、怎么防止刷成砖、刷完之后驱动怎么装、序列号怎么改、哪些STlink硬件版本能刷哪些不能刷,每一步都有讲究。下面我把整个过程拆开揉碎讲清楚,你照着做基本能一次成功。
这篇文章适合手里有闲置STlink V2、想低成本获得Jlink功能的朋友,也适合单纯想了解调试器固件底层原理的爱好者。不需要你有很深的嵌入式功底,但基本的焊接、烧录操作得会。我会把原理、工具、步骤、避坑点全部覆盖到,尽量让第一次接触的人也能跟上。
2. 改造前的核心原理与硬件选型判断
2.1 STlink和Jlink OB为什么能互刷
先把这个事的底层逻辑讲明白,不然你刷的时候心里没底。STlink V2的典型硬件方案是STM32F103C8T6作为主控,负责USB通信和SWD/JTAG时序生成。Jlink OB早期版本(比如OB-STM32F103)用的也是STM32F103C8T6,甚至连外围电路都高度相似——都是USB接口进来,主控跑固件,然后引出SWDIO、SWCLK、GND、VCC、RESET这几根线去目标板。
两者的差异主要在三个地方。第一是固件本身,STlink跑的是ST官方的固件,Jlink跑的是SEGGER的固件,功能逻辑完全不同。第二是USB描述符,包括VID、PID、设备名称、序列号,电脑靠这些信息判断插进来的是什么设备,进而加载对应驱动。第三是引脚映射,虽然主控相同,但STlink和Jlink OB在PCB上把哪些GPIO分配给SWDIO、SWCLK可能不一样,刷完固件后如果引脚对不上,就会出现“设备识别了但连不上目标板”的情况。
所以改造的本质就是:擦除STlink固件 → 写入Jlink OB固件 → 修正USB描述符和引脚映射。前两步是核心,第三步决定你能不能正常用。
2.2 哪些STlink能刷,哪些千万别碰
这是最容易翻车的地方。市面上的STlink V2五花八门,不是所有都能刷。我整理了一个判断表,你对照手里的设备看:
| STlink类型 | 主控芯片 | 能否刷Jlink | 说明 |
|---|---|---|---|
| 原厂STlink V2 | STM32F103C8T6 | 可以 | 最理想,硬件标准 |
| 山寨STlink V2(蓝色小U盘状) | STM32F103C8T6 | 大概率可以 | 需拆开确认主控 |
| 山寨STlink V2(带金属壳) | STM32F103C8T6/CBT6 | 可以 | 注意Flash容量 |
| STlink V2-1(Nucleo板载) | STM32F103 | 不建议 | 板载的刷了会影响开发板功能 |
| STlink V3 | 专用芯片 | 不可以 | 硬件完全不同 |
| STlink V2迷你版(无晶振) | STM32F103 | 谨慎 | 部分缺少必要引脚 |
判断方法很简单:拆开外壳,看主控芯片丝印。如果是STM32F103C8T6或者CBT6,基本都能刷。C8T6是64KB Flash,CBT6是128KB,Jlink OB固件一般不超过64KB,所以两者都够用。如果丝印是其他型号,比如STM32F042之类的,那就别折腾了,硬件方案不一样。
注意:有些超便宜的STlink用的是打磨过的芯片或者国产替代主控,丝印模糊看不清。这种建议直接放弃,刷进去大概率变砖,救回来的成本比买个新的还高。
2.3 需要准备的工具和软件清单
动手之前把东西备齐,免得中途卡壳。我列一下我实际用到的:
- 硬件:待改造的STlink V2一个、杜邦线若干、面包板或直接焊接、另一个能用的调试器(用来给被刷的STlink烧固件,我用的是另一块STlink)
- 软件:STM32CubeProgrammer(用来擦除和烧录固件)、Jlink官方驱动包(装完后自带J-Flash和J-Link Commander)、STlink固件升级工具(可选,用来备份原固件)
- 固件文件:Jlink OB的固件,常见的是
JLink_OB_STM32F103.bin或者带序列号修改功能的版本 - 辅助工具:ST-Link Utility(老版本,用来读取原固件做备份)、十六进制编辑器(改序列号用)
这里重点说下STM32CubeProgrammer,它是ST官方出的烧录工具,支持STlink、UART、USB等多种方式,界面比老的ST-Link Utility友好很多,而且跨平台。下载直接去ST官网搜“STM32CubeProgrammer”就行,安装过程一路下一步,注意装的时候会把STlink驱动一起装上。
Jlink驱动去SEGGER官网下,选“J-Link Software and Documentation Pack”,装完之后设备管理器里会出现J-Link driver,J-Flash、J-Link Commander这些工具也一并装好。
3. 固件备份与刷写实操全流程
3.1 第一步:备份原厂固件,给自己留后路
这一步很多人跳过,结果刷废了想恢复都恢复不了。STlink原厂固件虽然网上能下到,但不同批次版本不一样,备份自己的最稳妥。
操作方式:用另一个正常的STlink连接电脑,通过SWD接口连到待改造STlink的SWD引脚上。待改造STlink的引脚定义如下(以常见的20pin接口为例,实际看PCB丝印):
| 引脚 | 功能 | 说明 |
|---|---|---|
| 1 | VCC | 3.3V供电 |
| 2 | SWCLK | 时钟线 |
| 3 | GND | 地 |
| 4 | SWDIO | 数据线 |
| 5 | NRST | 复位 |
| 6 | SWIM | 单线接口(STM8用) |
把正常STlink的SWCLK、SWDIO、GND、3.3V分别接到待改造STlink对应的引脚上。注意待改造STlink不要插USB,由正常STlink给它供电。
打开STM32CubeProgrammer,选择STlink连接方式,点Connect。如果能识别到芯片,说明接线正确。然后点“Read”或者用“Memory & File”里的读取功能,把整个Flash从0x08000000开始读出来,保存为stlink_backup.bin。这个文件就是你后悔药,刷废了用它恢复。
实操心得:读取的时候把起始地址设为0x08000000,大小设为0x10000(64KB),这样能把整个Flash都备份下来。有些STlink固件会做读保护,如果读不出来,先执行一次全片擦除再读,但擦除后就恢复不了原厂固件了,所以尽量先尝试直接读。
3.2 第二步:擦除原固件并写入Jlink固件
备份完成后,还是用STM32CubeProgrammer连着,先执行全片擦除(Full Chip Erase)。擦除后芯片变成空的,这时候就可以写入Jlink OB固件了。
打开STM32CubeProgrammer的“Erasing & Programming”页面,选择下载好的Jlink OB固件文件(.bin格式),起始地址填0x08000000,然后点“Start Programming”。烧录过程大概几秒钟,完成后会提示成功。
这里有个关键点:Jlink OB固件有多个版本,选哪个很讲究。我试过几个版本,总结如下:
| 固件版本 | 特点 | 推荐度 |
|---|---|---|
| JLink_OB_STM32F103.bin(老版本) | 体积小,兼容性好,但功能少 | 推荐新手 |
| 带序列号修改的版本 | 可自定义序列号,支持多设备 | 推荐 |
| 最新版Jlink OB固件 | 功能全,但可能超出64KB | 谨慎 |
老版本固件大概30-40KB,C8T6完全放得下。最新版有些超过64KB,C8T6就装不下了,会烧录失败或者运行异常。所以如果你的是C8T6,优先选老版本或者精简版。
烧录完成后,拔掉待改造STlink的SWD连线,把它插到电脑USB口上。这时候设备管理器里应该会出现一个新设备,但可能显示为“未知设备”或者“JLink”但带黄色感叹号,因为驱动还没装或者USB描述符还没改。
3.3 第三步:修改USB描述符和序列号
这一步是让电脑正确识别Jlink的关键。STlink原厂的USB描述符里VID是0x0483(ST的厂商ID),PID是0x3748。Jlink的VID是0x1366(SEGGER的厂商ID),PID根据型号不同有0x0101、0x0105等。如果不改描述符,电脑会把它当成STlink,加载STlink驱动,Jlink软件就认不到。
修改方法有两种。第一种是刷固件的时候直接刷入已经改好描述符的固件版本,这种固件网上有现成的,省事。第二种是刷完固件后用J-Link Commander或者专门的配置工具改。我推荐第一种,因为第二种操作复杂,容易出错。
如果你拿到的是原始Jlink OB固件,需要自己改描述符,可以用十六进制编辑器打开bin文件,搜索VID和PID对应的字节位置,替换成Jlink的值。具体位置因固件版本而异,一般在文件的前几KB。改完之后重新烧录。
序列号也很重要。Jlink软件靠序列号区分不同设备,如果序列号重复或者为空,可能无法正常工作。带序列号修改功能的固件版本会在特定地址存放序列号,你可以改成任意8位数字,比如12345678。改的时候注意字节序,一般是小端模式。
注意:改描述符和序列号属于精细操作,改错一个字节就可能导致设备无法识别。建议改之前先用J-Link Commander确认当前设备状态,改完之后再验证。如果改废了,重新擦除再刷一遍就行,不会损坏硬件。
3.4 第四步:安装Jlink驱动并验证
固件刷好、描述符改好之后,把设备插到电脑上。这时候设备管理器里应该能看到“J-Link driver”或者“JLink CDC UART Port”之类的设备。如果没有自动识别,手动更新驱动,指向Jlink驱动安装目录。
驱动装好后,打开J-Link Commander(开始菜单里SEGGER文件夹下)。它会自动连接设备,显示设备信息,包括序列号、固件版本、硬件版本等。如果能看到这些信息,说明改造基本成功。
然后打开J-Flash,新建一个工程,选择目标芯片型号(比如STM32F103C8),连接目标板,尝试读取芯片ID。如果能读到,恭喜你,一个Jlink OB诞生了。接下来就可以用Jlink的所有功能了,包括RTT、J-Scope、批量烧录等。
4. 常见问题排查与避坑经验实录
4.1 刷完之后电脑识别不到设备怎么办
这是最常见的问题,原因通常有三个。第一是固件没刷进去或者刷错了,解决方法是重新擦除再刷一遍,确认烧录地址是0x08000000。第二是USB描述符没改对,电脑把它当成未知设备,解决方法是检查VID/PID是否正确,或者换一个已经改好描述符的固件版本。第三是硬件问题,比如USB线只供电不传数据、USB口接触不良,换根线换个口试试。
如果设备管理器里显示“Unknown Device”并且属性里提示“设备描述符请求失败”,基本可以确定是固件问题。重新刷固件,刷的时候注意看STM32CubeProgrammer的提示,确认烧录成功。
4.2 Jlink软件能识别但连不上目标板
这种情况通常是引脚映射不对。STlink和Jlink OB虽然主控相同,但PCB上SWDIO和SWCLK分配的GPIO可能不一样。STlink V2一般用PA13(SWDIO)和PA14(SWCLK),Jlink OB有些版本用的是PB13和PB14。如果刷完固件后连不上目标板,先检查引脚定义。
解决方法:查你刷的Jlink OB固件对应的引脚定义,然后对照STlink的PCB走线,看是否需要飞线。有些STlink硬件设计上已经兼容Jlink引脚,直接就能用;有些需要把主控的两个引脚重新引出来接到接口上。我手上那个蓝色小U盘状的STlink,刷完之后SWDIO和SWCLK正好对得上,直接就能用,运气不错。
另一个可能的原因是目标板供电问题。Jlink OB默认可能不输出3.3V,需要目标板自己供电。检查Jlink Commander里的供电设置,或者用万用表量一下目标板有没有电。
4.3 刷完固件后STlink功能还能用吗
不能。刷成Jlink之后,原来的STlink固件就被覆盖了,STlink驱动和ST-Link Utility都认不到它了。如果你还想用STlink功能,只能刷回备份的原厂固件。所以建议保留备份文件,并且想清楚你更需要哪个功能。
不过有个折中方案:如果你有两块STlink,可以一块保持原样,一块刷成Jlink,这样两种功能都有。我就是这么干的,一块原厂STlink用来配合STM32CubeProgrammer,一块刷成Jlink用来调试国产芯片和用RTT。
4.4 常见问题速查表
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 设备管理器显示未知设备 | 固件未刷入或描述符错误 | 重新刷固件,检查VID/PID |
| Jlink Commander识别不到 | 驱动未安装或USB描述符不对 | 重装Jlink驱动,确认描述符 |
| 能识别但连不上目标板 | 引脚映射不对或目标板无供电 | 检查SWDIO/SWCLK引脚,确认供电 |
| 烧录时提示Flash不足 | 固件超过64KB | 换用精简版固件 |
| 序列号显示为0或重复 | 序列号未修改 | 用带序列号修改功能的固件重刷 |
| 刷完后电脑反复识别断开 | 固件不兼容或硬件问题 | 换固件版本,检查USB电路 |
4.5 几个我踩过的坑和独家技巧
第一个坑是固件版本选错导致Flash溢出。我第一次刷的时候随便下了个最新版Jlink OB固件,结果烧录到一半提示地址超出范围,芯片直接不启动了。后来换了个40KB左右的老版本才成功。所以C8T6的用户一定要确认固件大小。
第二个坑是序列号没改导致Jlink软件报错。刷完固件后J-Link Commander能识别设备,但一连接就提示“序列号无效”。后来用带序列号修改功能的固件重刷,把序列号改成12345678,问题解决。
第三个技巧是用J-Link Commander验证引脚。刷完固件后如果不确定引脚映射,可以在J-Link Commander里输入si 0选择SWD接口,然后输入connect,看能不能连上目标芯片。如果连不上,换引脚定义再试。
还有一个实用技巧:刷固件之前先把STlink的USB口用胶带贴住,防止误插。因为刷固件过程中如果USB插着,可能会干扰SWD通信,导致烧录失败。我习惯刷之前把USB口封住,刷完再撕开。
5. 改造后的实际使用体验与功能扩展
5.1 Jlink OB能干什么,不能干什么
改造完成后,这个设备本质上是一个Jlink OB(On-Board)版本,功能比正版Jlink EDU少一些,但核心功能都在。能用的功能包括:SWD/JTAG调试、J-Flash烧录、RTT实时传输、J-Scope波形显示、J-Link Commander命令行操作。不能用的功能主要是那些需要额外硬件支持的,比如ETB/ETM跟踪、高速USB(OB版本是全速USB)、多核调试等。
对于日常STM32和国产M0/M3/M4开发来说,这些功能完全够用。RTT是我用得最多的,比串口打印方便太多,不占用UART资源,速度还快。J-Scope也很实用,可以把变量实时画成波形,调PID或者看传感器数据的时候特别直观。
5.2 速度实测与稳定性评估
我用改造后的Jlink OB和正版Jlink EDU做了个简单对比,烧录一个64KB的固件到STM32F103,Jlink OB大概3秒,EDU大概2.5秒,差距不大。调试的时候单步、断点响应速度也基本一致。RTT传输速度方面,OB版本最高大概500KB/s,EDU能到1MB/s,但日常打印调试信息完全够用。
稳定性方面,连续用了几个月,没出现过掉线或者识别异常。唯一需要注意的是,山寨STlink的USB电路质量参差不齐,有些供电不稳的可能会在烧录大固件时断开。如果遇到这种情况,换一根好点的USB线,或者在USB供电上并一个电容。
5.3 还能怎么玩:固件加密与多设备管理
刷成Jlink之后,还可以进一步折腾。比如给固件加读保护,防止别人把你的Jlink固件读出来。STM32CubeProgrammer里可以设置读保护级别,设置后SWD就读不出Flash内容了,但Jlink功能不受影响。
多设备管理方面,如果你有多块改造的Jlink,可以给每块设置不同的序列号,然后在Jlink软件里通过序列号选择设备。J-Flash支持指定序列号连接,批量烧录的时候特别方便。
另外,Jlink OB固件本身也可以修改,比如改设备名称、改LED指示灯行为等。这些属于进阶玩法,有兴趣的可以研究固件里的字符串和配置区域。
5.4 成本核算与替代方案对比
最后算笔账。一块山寨STlink V2大概15-25元,Jlink OB固件免费,工具软件免费,总成本就是一块STlink的钱。正版Jlink EDU大概300-400元,山寨Jlink OB成品大概50-80元。自己改造省下的钱不多,但胜在物尽其用,而且过程本身挺有意思。
如果你不想折腾,直接买山寨Jlink OB也行,但市面上的山寨货质量参差不齐,有些用的主控不是F103,固件也老,买回来可能还得自己刷。自己改造的好处是知根知底,硬件什么情况、固件什么版本都清楚,出了问题也好排查。
替代方案方面,DAPLink也是个选择,开源固件,支持拖拽烧录,但调试功能比Jlink弱一些。如果你主要用Keil或者IAR,Jlink的兼容性更好。如果主要用开源工具链,DAPLink可能更合适。根据自己的需求选就行。
我个人在实际操作中的体会是,STlink改Jlink这事技术门槛不高,但细节决定成败。固件版本、描述符修改、引脚映射这三块搞定了,基本就能成功。刷废了也不要紧,有备份就能恢复,最坏情况就是损失一块十几块钱的STlink。对于喜欢动手的嵌入式玩家来说,这是个性价比很高的折腾项目。