用Keil调STM32,插上J-Link准备下载程序,结果弹出个对话框说“J-Link is a clone, not an original SEGGER product”,点掉之后要么下载失败,要么Keil直接闪退。这套组合拳我前前后后遇到过不止十次,从J-Link V8到V9到DAP,从Keil MDK 4到MDK 5再到现在的ARM Compiler 6,问题版本一大堆,但排查思路其实非常固定。
这篇文章就把这类问题彻底摊开聊:提示盗版是什么原因,下载失败和闪退背后有哪些隐藏坑,从驱动、固件、接线到Keil配置,每一步怎么排查、怎么处理。不管你是刚接触单片机的学生,还是已经在产线上被这个问题折磨过的工程师,照着这篇文章的思路走一遍,至少能解决九成以上的情况。
1. 问题现象与根因分析
1.1 提示“盗版”“克隆”到底是什么情况
先解释一下这个提示的来龙去脉。SEGGER官方对J-Link是有固件签名校验的,正版J-Link的固件经过加密签名,调试器上电后会和上位机软件进行认证。而市面上大量的廉价J-Link(尤其是V8、V9时代流传下来的那一批),用的是非官方固件,有的是直接提取的原始固件,有的是改过序列号的,这类设备在SEGGER软件和Keil的MDK组件里就会被识别为“Clone”。
很多人一看到“盗版”两个字就慌了,觉得是自己的Keil破解问题,或者是电脑中毒了。实际上这里说的盗版,指的是你的J-Link硬件本身,不是Keil软件。Keil本身如果没破解,你连编译都过不了,根本走不到下载这一步。
还有一个容易混淆的点:Keil MDK提示的“J-Link is a clone”对话框,和J-Link Commander提示的“J-Link: DLL version X, compiled Y”,以及SEGGER官方工具提示的“The connected probe is not original”,本质上是同一件事。就是上位机软件通过某种方式判断出你的调试器固件不合法。
1.2 为什么提示盗版后会伴生下载失败和闪退
这三个问题经常一起出现,根本原因就在这个“盗版检测”上面。当SEGGER DLL检测到克隆设备时,并不会直接拒绝工作,而是先弹窗提醒,然后在一个比较别扭的状态下继续运行。这个状态非常不稳定,具体表现就是:
- 弹窗之后,如果点确认,DLL会尝试继续连接,但克隆固件的响应时序和正版固件有差异,握手超时,下载就报错。
- 如果点取消,DLL的连接状态被中断,Keil的调试会话没有正确退出,UI线程等待超时,然后就闪退。
- 还有一种情况,固件版本太老,DLL版本太新,两者协议不匹配,也会在下载过程当中崩溃。
所以“提示盗版”“下载失败”“闪退”这三个现象,实际上是同一根因在不同环节的表现。排查的重点应该是:让J-Link在Keil面前看起来“正常”,或者干脆换一个Keil能信任的调试器。
2. 环境排查与前置准备
2.1 先确认Keil和J-Link的版本匹配关系
在动手刷固件之前,先做一轮软硬件版本梳理。J-Link的DLL驱动是跟着Keil MDK版本走的,Keil 5.20之前的MDK,内置的J-Link DLL是老版本,支持到J-Link V7、V8都比较顺。Keil 5.20之后的MDK,内置的J-Link DLL会定期升级,新DLL对老固件的兼容性反而越来越差。
这里有个比较实用的建议:如果手里的J-Link是V8,最好使用Keil MDK 5.20到5.24这个区间,不要追新。如果用的是V9或者DAP,Keil MDK 5.30以上都没什么问题。
另外要注意,Keil安装目录下的JLink DLL版本和SEGGER官网最新版DLL版本是两回事。Keil用的是ARM协会定制过的CMSIS-DAP/J-Link DLL,路径在Keil_v5\ARM\SEGGER下,而SEGGER官网安装的J-Link Software Pack是独立的一套。这两套驱动如果混用,会引出非常奇怪的兼容性问题,比如Keil识别不到设备,或者识别到了但下载时卡住。
2.2 硬件连接和接口定义检查
J-Link和板子的连接经常被忽略,很多人报错说“Cannot connect to target”或者“No Cortex-M device found”,其实只是杜邦线松了,或者SWD接口的线序接错了。
SWD接口最少需要4根线:SWDIO、SWCLK、GND,还有目标的VCC(用于电平参考)。很多J-Link板子(尤其是V8/V9的20Pin JTAG排针)如果只用SWD模式,需要用杜邦线从对应Pin脚跳过去。
我的习惯是,不管什么板子,先把J-Link的VTref引脚和目标板VCC接上。因为J-Link内部参考电压检测不到目标板电压时,会直接认为目标板没上电,报“Target voltage not found”。这个报错不是说你板子没电,而是说你没接VTref。
再检查SWDIO和SWCLK有没有接反。J-Link的20Pin排针定义里,Pin 7是SWDIO,Pin 9是SWCLK,但很多自制转接板和开发板上的丝印标注并不统一,有的标的是TMS和TCK。TMS对应SWDIO,TCK对应SWCLK。如果你用的是开发板自带的SWD排母,直接用转接线连,应该不会错,但如果是自己飞线,一定要对照原理图。
2.3 区分目标板供电和J-Link供电
J-Link V8/V9板子上有一个跳线或者LDO,可以输出3.3V或者5V,有的版本默认开启对外供电。如果目标板已经用USB或者DC电源供电了,J-Link再往外供一路电,两路电源直接怼到一起,虽然不是一定烧板子,但会造成电平不稳,下载过程时好时坏。
我在排查“下载失败”的时候,经常让用户先把J-Link的供电跳线断开,只用SWD四根线连接目标板。目标板自己供电,J-Link只做调试和下载。这样可以把电源干扰排除掉,剩下的就是信号完整性问题。
3. 实操解决步骤
3.1 从驱动到固件的完整清理流程
如果确认了是克隆J-Link,并且问题表现为提示盗版+下载失败,那我的处理顺序是固定的:先卸载旧驱动,再重装新驱动,最后再考虑刷固件。
具体操作步骤:
- 拔掉J-Link,打开Windows设备管理器,在“通用串行总线设备”或者“通用串行总线控制器”下面,找到带黄叹号的“J-Link”设备,右键卸载设备。如果提示“删除此设备的驱动程序软件”,要勾选上,把旧驱动清干净。
- 去SEGGER官网下载最新版的J-Link Software and Documentation Pack,安装时选择“USB driver only”也行,直接典型安装也行。
- 插上J-Link,等Windows识别完,再看设备管理器,应该出现“J-Link”并且没有感叹号。
- 打开命令行,执行
JLink.exe,输入v命令查看版本。这一步能确认电脑能不能正常识别J-Link。
这一步做完,如果JLink Commander里能看到设备信息,但依然提示Clone,那就进入下一步:刷固件。
J-Link V8刷固件的方式比较老,需要用SAM-BA工具配合USB或者串口把固件烧进去。整个过程比较麻烦,而且V8刷机有变砖风险。V9刷固件相对安全一点,可以用J-Link内置的引导程序来刷,但依然有“刷成砖头”的可能。
在写这篇文章的当下,我个人的建议是:V8/V9如果已经老到连固件都刷不动了,不要恋战,直接换一个基于CMSIS-DAP的调试器,或者买一个正版J-Link EDU MINI。为什么这么说?因为V8的固件和SEGGER新DLL协议差别太大了,就算刷完固件,在Keil MDK 5.36以上的环境里依然会偶尔抽风,浪费时间。
3.2 Keil中调试器配置与下载算法
排除了驱动和固件问题之后,剩下的就是Keil工程配置。这一步很多人会忽略,但恰恰是下载失败的主因。
打开Keil工程,点击魔术棒(Options for Target),进入Debug选项卡:
- 右侧下拉框选择“J-LINK / J-TRACE Cortex”,不要选成“ULINK2”或者“CMSIS-DAP”。
- 点击旁边的Settings按钮,在弹出的窗口里看右侧的SW Device框里能不能扫到芯片型号。如果扫不到,说明J-Link和目标芯片之间的通信有问题。
- 确认左侧的Port选的是SW,不是JTAG。如果是JTAG模式,但你的J-Link和目标板只接了SWD四根线,那肯定连接失败。
再检查Utilities选项卡,点Settings,看Flash Download页面里的Programming Algorithm列表。如果是STM32F103C8T6,这里必须要有“STM32F10x Mid-density 128KB Flash”一行,如果没有,手动点Add,从Keil安装目录的Flash目录里加。加了之后,还要核对起始地址和大小,一般不用改,但如果你用的是特殊封装的芯片,比如STM32F103ZET6(高密度512KB),就要检查是不是选的“STM32F10x High-density 512KB Flash”。
下载地址配置不对的典型现象是:能识别到芯片,点击下载立刻报错“Flash Download failed - Target DLL has been cancelled”。这种报错不是驱动问题,是算法问题。
3.3 闪退问题的工程级处理
Keil闪退的情况比较复杂,我只说和J-Link相关的几种。
第一种:打开Debug模式,然后切回Edit模式,闪退。这种多半是调试会话没有正常关闭,J-Link DLL还在后台跑,Keil的UI线程等不到返回。解决方法是:把Keil完全退出,拔掉J-Link USB线,重新打开工程。如果还是闪退,就删除工程目录下的.uvguix文件(比如test.uvguix.你的用户名),这个文件保存的是窗口布局和调试状态,损坏后会造成Keil启动或切换模式时崩溃。
第二种:点击下载按钮后,弹出一个错误对话框,然后整个Keil窗口消失。这种是J-Link DLL版本和Keil MDK版本冲突。把Keil_v5\ARM\SEGGER目录下的JLinkARM.dll用SEGGER官网对应版本的DLL覆盖掉,一般能解决。但这里有一个坑:Keil MDK 5.30之后,DLL和驱动还涉及CMSIS包的版本匹配,如果直接覆盖,可能会造成“Cannot load driver”之类的错误。稳妥做法是先备份,覆盖后用命令行JLink.exe -Commander验证DLL可正常加载。
第三种:使用J-Link RTT Viewer或者J-Scope这类工具时,Keil闪退。这通常是软件同时占用了同一个J-Link设备。J-Link设备默认只允许一个上位机进程独占访问,如果你开着JLink Commander或者J-Link RTT Viewer,再在Keil里点下载,就会出现冲突。轻则下载失败,重则Keil闪退。所以用J-Link系列工具的时候,要养成习惯:Keil之外最多开一个调试辅助工具,用完了就关。
4. 常见问题与排查技巧实录
4.1 速查表:报错信息和解法对照
| 报错或现象 | 直接原因 | 首选解法 |
|---|---|---|
| J-Link is a clone, not an original SEGGER product | 固件被SEGGER检测为克隆/非官方 | 升级或重刷固件,或更换正版/CMSIS-DAP |
| Cannot connect to target | 接线错误或目标电压检测失败 | 检查VTref,检查SWDIO/SWCLK线序 |
| Target voltage not found | 未接VTref或目标板没上电 | 接通VTref和目标板电源 |
| No Cortex-M SW Device found | SWD通信失败,或芯片锁死 | 检查接线,短接复位电容重新上电 |
| Flash Download failed - Target DLL has been cancelled | Flash算法不对或DLL连接超时 | 核对Programming Algorithm,重装DLL |
| Error: Flash Download failed - Cortex-M4 | 芯片读保护或Flash算法不匹配 | 先解除读保护(Option Bytes),再核对算法 |
| Keil闪退:打开Debug后退出 | 调试会话未正常关闭 | 重启Keil,拔插J-Link,删除.uvguix文件 |
| Keil闪退:点击下载瞬间 | J-Link DLL版本冲突 | 用SEGGER官方DLL覆盖Keil目录下的DLL,注意备份 |
| 能识别但下载到一半卡死 | 目标板供电不稳或SWD信号线过长 | 断开J-Link供电,缩短杜邦线,降低SWD速率 |
4.2 一些独家的排查顺序和避坑经验
踩坑多了以后,我总结了一套自己的排查顺序,比官方文档好用得多。
第一,先软件后硬件。很多工程师习惯先怀疑硬件连接,其实驱动和DLL的问题占了我遇到案例中的一半以上。所以只要不是完全没有供电反应,先把驱动卸载重装一遍,顺便把Keil的J-Link DLL也换掉,再回来查硬件。
第二,SWD频率降一档。J-Link默认的SWD频率可能比较高,对于用杜邦线飞线的情况,高频信号衰减很严重,表现为“能识别,但下载速度极慢”或者“下载到一半失败”。在Keil的Settings里,把Max Clock从默认的4MHz调低到1MHz,甚至是100kHz,很多怪问题就消失了。这个方法尤其适合自制PCB和芯片锁死恢复的场景。
第三,芯片锁死不要急着重刷。STM32如果开启了读保护(RDP),J-Link会提示连接失败。很多人以为是J-Link坏了,其实在J-Link Commander里执行unlock Kinetis或者用STM32 ST-LINK Utility做全片擦除,就能解开。Keil MDK 5.36以上版本的STM32 Device Family Pack里也带了“Unsecure”选项,直接勾选后下载即可。
第四,不要轻易换线。SWD接口对线缆质量很敏感。我在实验室测试时,用30cm排线能稳定下载,换上一根2米的杜邦线就各种失败。如果你在工位上用延长线连接调试器,建议尽量控制在20cm以内,如果必须长距离,用屏蔽线,并且把SWD速率调低。
4.3 顺手排查目标芯片本身的坑
除了J-Link侧的问题,目标芯片本身也会造成“下载失败”和“闪退”。最常见的是STM32的BOOT0引脚状态。如果BOOT0被拉高(进入System Bootloader模式),而你的工程里没有配置对应的下载算法,J-Link能连接上但下载报错。这种报错往往是“Erase Failed”或者“Programming Failed”。
我的经验是:STM32F103系列正常下载时,BOOT0必须为低电平(从Flash启动)。有些开发板BOOT0默认用一个跳帽连接高电平,很多人买回来从来没动过,所有下载都报错。具体表现是:识别芯片正常,擦除、校验都能通过,但写入时总是卡住。一看BOOT0是高电平,把它跳回低电平,问题立刻解决。
另外,如果芯片的复位电路有额外的大电容,或者复位引脚被外部电路拉低,J-Link也无法连接。因为J-Link使用的方式之一是硬件复位后立刻拉高SWDIO,如果目标芯片一直处于复位状态,SWD握手永远也完成不了。排查方法是断开目标板的复位电路,或者用镊子把复位电容短接一下,让复位引脚释放。
从个人角度来说,遇到Keil提示“找不到目标”这类问题,我最先怀疑的永远不是J-Link坏了,而是目标芯片压根没跑起来或者被锁死了。J-Link是个很皮实的工具,真正物理损坏的概率很低,更多时候是我们的使用环境或配置出了问题。
5. 针对“提示盗版”的长期解决思路
5.1 V8/V9刷固件操作要点
如果你的J-Link V9提示盗版,且无法忍受每次下载都弹窗,想尝试刷固件,我简单说一下思路。
V9刷机需要用到J-Link自带的Bootloader。方法是:按住J-Link板子上的BOOT按键,插上USB,此时J-Link会进入一个模拟U盘的模式(有些版本不会模拟U盘,而是识别为一个串口设备)。然后运行SEGGER官方的JLinkConfig.exe,在界面里选择“Update firmware”(或者“Load firmware”),选择对应的.bin固件文件,点击升级。
V8刷机更麻烦,需要SAM-BA工具配合串口或者USB,把刷机固件烧进去。操作不当很容易把Bootloader也覆盖掉,造成彻底变砖。所以我一直不建议新手去碰V8刷机,因为性价比太低了。
关于固件文件本身,这里我不展开讲去哪找,因为标题里的“提示盗版”本身就是这个生态的灰色地带。我的态度是:如果是学习用途,不涉及商业交付,你可以在网上找对应板型的固件试一试,但刷完不一定解决问题,因为新版SEGGER DLL会定期更新克隆检测规则,刷完没过多久可能又弹窗。如果是商业项目,建议直接换正版J-Link或CMSIS-DAP调试器,别在这个事情上耗时间。
5.2 为什么我更推荐CMSIS-DAP方案
如果你是被Keil + J-Link这套组合折磨到崩溃的开发者,我的建议是直接换CMSIS-DAP调试器。CMSIS-DAP是一个基于ARM官方的开源调试器方案,市面上二三十块就能买到,速度快,稳定,最关键的是它不存在“克隆检测”这个概念,不会出现“J-Link is a clone”的提示。
在Keil里,CMSIS-DAP的驱动和J-Link是两套体系。Debug选项卡里选择“CMSIS-DAP Debugger”,你会看到一个完全不同的Settings界面,同样有SWD连接配置,同样有SW Device扫描。实际下载速率和J-Link V9没有肉眼可见的差别,对于单片机开发和调试完全够用。
唯一需要注意的点是:CMSIS-DAP调试器不能使用J-Link的RTT、J-Scope等SEGGER专属功能,如果你重度依赖这些工具,还是要保留J-Link。但如果你只是每天编译、下载、仿真、看变量,CMSIS-DAP是最省心的替代品。
我个人在实际研发当中,主力调试器已经从J-Link换成了DAP,不是因为J-Link不好,而是因为“提示盗版”这种问题一旦出现,排查成本太高,长期来看不如换一条干净的路走。毕竟嵌入式开发的核心是调试芯片逻辑,而不是和调试器本身斗智斗勇。
5.3 如何尽量避免闪退和下载失败反复出现
即便解决了当前的盗版提示,之后的日常使用中还会遇到零星的下载失败和闪退。我把平时总结的几个习惯分享出来:
- 每次打开Keil工程前,先确认J-Link已经插上,并且JLink Commander里能正常识别。如果无法识别,先解决驱动,再开Keil,顺序不要反。
- 使用MDK自带的Pack Installer时要小心,不要把没安装完的包强行关闭,否则会留下损坏的Flash算法文件,之后下载时会闪退。
- 如果同时装有Keil MDK 5和Keil C51(注意这两个是不同产品),它们的调试器配置路径是不同的,不要混用。
- 定期清理Windows系统临时目录和Keil的临时文件(%TEMP%目录下和Keil工程目录下的.tmp、.bak文件),这些文件积累多了,会拖慢Keil的启动速度,也会增加闪退的概率。
这些习惯听上去细碎,但实际遇到问题时,每一项都可能节省你半小时的排查时间。
最后再补充一个小技巧:如果你在Keil的Build Output窗口看到“JLink Warning: Not a genuine SEGGER J-Link”之类的红色警告,可以先记录下完整的警告内容,再去搜索引擎搜。因为J-Link产品的版本和DLL版本组合非常多,针对你手里这个具体版本的警告信息,往往已经有其他人踩过坑,对应的解法会更精准,比盲目刷固件靠谱得多。