拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

STlink刷Jlink固件教程:低成本改造调试器

STlink刷Jlink固件教程:低成本改造调试器

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 V2STM32F103C8T6可以最理想,硬件标准
山寨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丝印):

引脚功能说明
1VCC3.3V供电
2SWCLK时钟线
3GND地
4SWDIO数据线
5NRST复位
6SWIM单线接口(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。对于喜欢动手的嵌入式玩家来说,这是个性价比很高的折腾项目。

返回列表