首页 / 资讯中心 / 文章详情

Keil中J-Link克隆提示与下载失败闪退的排查解决指南

Keil中J-Link克隆提示与下载失败闪退的排查解决指南 ★ FEATURED ARTICLE
用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或者DAPKeil 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是SWDIOPin 9是SWCLK但很多自制转接板和开发板上的丝印标注并不统一有的标的是TMS和TCK。TMS对应SWDIOTCK对应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-DAPCannot connect to target接线错误或目标电压检测失败检查VTref检查SWDIO/SWCLK线序Target voltage not found未接VTref或目标板没上电接通VTref和目标板电源No Cortex-M SW Device foundSWD通信失败或芯片锁死检查接线短接复位电容重新上电Flash Download failed - Target DLL has been cancelledFlash算法不对或DLL连接超时核对Programming Algorithm重装DLLError: 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如果开启了读保护RDPJ-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版本组合非常多针对你手里这个具体版本的警告信息往往已经有其他人踩过坑对应的解法会更精准比盲目刷固件靠谱得多。
阅读完成 · 觉得有帮助?
咨询建站