最 近我兄弟(亲弟弟)把我的某宝Jlink V9 拿去用了。没办法自己也得用啊,所以把几年前买的Jlink V8翻出来用(也是某宝出品),结果~~没法正常调试。
虽然Jlink V8以前用着正常,可以前用的是低版本的MDK。现在用的是MDK5.25,Jlink V8 在手上算是老物件了。所以我想当然的,认为需要刷新V8固件。然并卵!!!反复搞没有解决调试问题,原本在MDK5.25下是可以正常烧写程序的,最后搞的不能正常烧写程序。还多出一毛病,基本功能完全丧失,这不成黑砖了吗?
【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 的版本。刷来刷去还是回到了问题的原点。
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一同使用。烧写程序时会出现如下错误:
因为MDK5.25 中JL2CM3.dll的版本为2.99.29.0 ,与 6.12驱动中上述两个文件的程序功能(库接口)不匹配。可以简单的理解为 JL2CM3.dll 的版本过高。虽然不能烧写程序,但是可以正常取得ARM芯片的基本信息。
6.20版本驱动中的 Jlink.exe , JLinkARM.dll 与 MDK5.25 自带的 JL2CM3.dll 配合,Jlink V8 可以正常烧写程序。如下图是烧写结果。
(如果仅仅为了能烧写程序,看到这里就可以了。)
按照上面的提示进行处理,可以烧写程序了,但不能正常调试程序!打开调试状态,十几秒钟之后就会报错,退出调试状态,或挂在调试状态。
MDK会不厌其烦地告诉你:“你用的是某宝产品,来来来,把你看到的信息依我妹”,接下来进入调试状态,寄存器显示正常数据:
十几秒内如果有遇到断点,是可以正常跳到断点暂停的,十几秒后,如果断点继续往下执行,会报错:
并且所有寄存器显示为零,如下图:
接着要么退出调试状态,要么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替换文件】