Jlink V8 在 Keil MDK5.25 中无法正常烧写、调试程序的故障处理

最 近我兄弟(亲弟弟)把我的某宝Jlink V9 拿去用了。没办法自己也得用啊,所以把几年前买的Jlink V8翻出来用(也是某宝出品),结果~~没法正常调试

虽然Jlink V8以前用着正常,可以前用的是低版本的MDK。现在用的是MDK5.25,Jlink V8 在手上算是老物件了。所以我想当然的,认为需要刷新V8固件。然并卵!!!反复搞没有解决调试问题,原本在MDK5.25下是可以正常烧写程序的,最后搞的不能正常烧写程序。还多出一毛病,基本功能完全丧失,这不成黑砖了吗?


题外:Jlink V8 砖头恢复

Jlink V8 砖头复活工具下载

注意:复活工具在win7 下,是不能正常连接Jlink V8 引导程序的,我试过N次了。我是在Win7 下安装了一个xp虚拟机,在虚拟xp下安装工具,才能成功重刷Jlink V8固件。

使用虚拟机之前,要在BIOS里把CPU的虚拟功能打开。

先安装WindowsXPMode_zh-cn.exe 虚拟xp系统(实际上就是一个虚拟文件,500多M)

下载地址:https://download.microsoft.com/download/D/7/A/D7AD3FF8-2618-4C10-9398-2810DDE730F7/WindowsXPMode_zh-cn.exe

再安装Windows6.1-KB958559-x86-RefreshPkg.msu 虚拟工具(Windows Virtual PC ,实际上就是一个系统补丁)

下载地址:https://download.microsoft.com/download/0/5/5/0554AE99-785F-45CB-B1F2-0E3ED1E6117D/Windows6.1-KB958559-x86-RefreshPkg.msu


以前能正常使用,本质上V8本身也是能正常用的。就算你再怎么找,也找不到在2014/11/28日之后出现的V8固件版本(哪怕你在网上下载的、标称2014年之后的固件),因为你把V8重刷固件之后,MDK5中第一次访问Jlink V8的时候,MDK给你更新的最后版本就是 2014/11/28 的版本。刷来刷去还是回到了问题的原点。

先解决Jlink V8 在MDK5.25 里不能烧写程序的问题。

1.排除Jlink V8 硬件驱动问题。

我的使用环境是:win7 32  MDK5.25 。驱动用 6.20h 或 6.12a 的都试过,都能正常下载。网上查询的结果是:建议用6.12j的版本。这一点是乎没有什么那么苛刻的要求。事实上我就是用的6.20h版的驱动!(同一个设备,不同驱动版本可以在系统的设备管理器中进行调节,别用什么驱动精灵之类的工具调节,那东西只保证设备运状态是正常的,可不保证版本对号)

2.排除JTAG 或 SW 烧写线 连接问题。

这是容易忽略的基本问题,要保证程序烧写连接线,连接正确,且不能有接触不良的情况!来回折腾,谁能保证没问题?

3.排除 Segger 文件夹内文件版本匹配的问题。

MDK5安装目录的Segger 文件夹内有三个文件非常重要,Jlink.exe , JLinkARM.dll, JL2CM3.dll 。这三个文件MDK安装时自带。而我们使用Jlink 前,Jlink.exe , JLinkARM.dll 需要从驱动安装文件夹中复制到MDK5的Segger文件夹,替换原有文件注意:6.12版驱动文件中的 Jlink.exe , JLinkARM.dll  , 不能与MDK5.25自带的JL2CM3.dll一同使用烧写程序时会出现如下错误

Jlink V8 在 Keil MDK5.25 中无法正常烧写、调试程序的故障处理

Jlink V8 在 Keil MDK5.25 中无法正常烧写、调试程序的故障处理

因为MDK5.25JL2CM3.dll的版本为2.99.29.0 ,与 6.12驱动中上述两个文件的程序功能(库接口)不匹配。可以简单的理解为 JL2CM3.dll 的版本过高。虽然不能烧写程序,但是可以正常取得ARM芯片的基本信息。

6.20版本驱动中的 Jlink.exe , JLinkARM.dll 与 MDK5.25 自带的 JL2CM3.dll 配合,Jlink V8 可以正常烧写程序。如下图是烧写结果。

Jlink V8 在 Keil MDK5.25 中无法正常烧写、调试程序的故障处理

(如果仅仅为了能烧写程序,看到这里就可以了。)


再处理不能正常调试的问题。

按照上面的提示进行处理,可以烧写程序了,但不能正常调试程序!打开调试状态,十几秒钟之后就会报错,退出调试状态,或挂在调试状态。

Jlink V8 在 Keil MDK5.25 中无法正常烧写、调试程序的故障处理

MDK会不厌其烦地告诉你:“你用的是某宝产品,来来来,把你看到的信息依我妹”,接下来进入调试状态,寄存器显示正常数据:

Jlink V8 在 Keil MDK5.25 中无法正常烧写、调试程序的故障处理

十几秒内如果有遇到断点,是可以正常跳到断点暂停的,十几秒后,如果断点继续往下执行,会报错:

Jlink V8 在 Keil MDK5.25 中无法正常烧写、调试程序的故障处理

并且所有寄存器显示为零,如下图:

Jlink V8 在 Keil MDK5.25 中无法正常烧写、调试程序的故障处理

接着要么退出调试状态,要么MDK挂在调试状态(实际上ARM程序是接着往下跑,至于有没有跑迷路,就不晓得了

造成这种情况的原因是: Jlinkk V8 只能使用 2.99.23.0 或 低于这个版本的 JL2CM3.dll 文件。(这是网友hslaiaya提出的观点 。原文出处:http://bbs.21ic.com/icview-1858620-1-1.html

但也不能低的太离谱,这是我试验了一天得出的结论!

为了找到什么低版本的 JL2CM3.dll 能使Jlink V8正常烧写,又能正常调试,我以6.12a版本的驱动测试了 2.0 到 2.66.0.0,八个版本的 JL2CM3.dll, 只有2.02这个版本能通过Jlink V8正确读取ARM的基本数据,但,也不能烧写和调试程序。(其中2.0版的JL2CM3.dll 是 MDK4.12版自带的文件)其它版本,要么无法找到芯片,要么认错芯片,要么干脆把MDK5.25主程序搞挂掉!(这是欠多少钱呐,都没操作成功,至于要它挂掉吗?)

没办法,又安装了一个 MDK5.15 版,从里面把2.99.15.0版的 JL2CM3.dll 拿出来,连同 Jlink 6.12a驱动中的Jlink.exe , JLinkARM.dll 文件放入MDK5.25 的 Segger 文件夹下。最终测试成功,可以正常烧写程序,可以正常调试程序,也不要你依他妹。

(实践证明Jlink 6.20h驱动中的link.exe , JLinkARM.dll文件也可以配这个版本的JL2CM3.dll 使Jlink V8在MDK5下正常使用!不是网查资料中说的那么言之凿凿,“不能使用高于Jlink 6.12j版本的文件”)

实际上 Jink V8 ,Jlink V9 在MDK5.25 中使用时,只需要切换 Segger中的三个文件就行了。

将下面的文件解压出来,放在MDK5的 Segger 文件夹内(..Keil_v5\ARM\Segger) 替换原有文件 (替换前注意备份原文件),就可以切换使用Jlink V8 或 Jlink V9了。

JLINK V8 MDK5.25_Segger替换文件

JLINK V9 MDK5.25_Segger替换文件