MDK4.6配J-LINK调试时提示升级,升级完成后,弹出下图提示框后,软件自动退出。
提示原因:由于MDK4.6能识别山寨JLINK导致。网络牛人分析如下:
今天将Keil MDK升级到了V4.54,使用J-link下载程序,发现MDK自带的Jlink驱动已经更新到V4.5版本,然后MDK提示有J-Link新固件,这之前也遇到过这类提示,然后我选择了升级j-link固件。升级之后,悲剧的事情发生了:j-link再也不能连接设备。
到网上找了相关资料,发现有一个很牛的同学用IDA跟踪了最新J-link驱动和V4.4驱动的dll文件,发现“新版的在打开 J-Link 函数的过程里多了两个调用。前一个判断了一下仿真器的功能字符串里是否有 GDBFull,有就会多一步 USB 通讯,超时的就是这一步操作;后一个通过序列号枪毙了一些老的(被偷的?)J-Link。看了一下 GDBFull 这个字符串,只在这里用了一次,将其全部改为大写,发现可以连上了。另外,序列号为 11111117 和 805306163 的会强制校验 GDBFull 功能”。(网页地址:http://www.cppblog.com/crhackos/archive/2012/05/30/175483.html 看来V4.53已经有这个问题了)。然后他使用了修改动态链接库里面的字符串GDBFull的方法(修改办法是用类似winhex程序打开库文件,搜索那个字符串然后改掉)。
但这种方法还有个问题,就是在每次仿真时,都会提示Jlink版本更改的警告。
这里我提供一个简单方法:将原来能下载的keil MDK程序版本中keil\ARM文件夹下的Segger文件夹内容拷贝到新安装的MDK相同位置,替换掉原来的。重启J-link即可。
有条件的,使用正版就不会有上面问题,正版正版我也想有个。
我的解决办法:
下载这个文件,具体方法见压缩包里的readme:http://yunpan.cn/QIJZqtkSRv79a
在网上收集的其它解决办法:
1、重新烧写固件到Jlink,将原来V8.bin固件用Winhex打开,并找到偏移地址为0xff00为首地址4bytes修改为其他值,只要不为原来的11111117 或 805306163即可,因为更新后的固件对这两个固件SN进行了强制校验,修改为其他值即可完美解决问题,同时将0xff30后面的GDBFull对应改成GDBFULL,对应ASCII码为47 44 42 46 55 4C 4C,目的是跳过GDBFull检查。
1.1 另外一种灵活的修改SN的方法:将0xff00为起始地址的4Bytes修改为0xffffffff,同时将0xff30后面的GDBFull对应改成GDBFULL,对应ASCII码为47 44 42 46 55 4C 4C,目的是跳过GDBFull检查,保存修改好的固件文件。更新固件后,打开Commander,不理会更新,在Jlink命令后面输入exec setsn = xxxxxxxx,所输入的sn为16进制,否则更新升级时会出现错误。 建议定义成你更新的时间,如20121121,这样就能追溯掉固件上次的时间。
2、此时安装了Segger4.65d的版本,打开JLink Commander,按要求提示更新,更新完之后即可正常使用最新的版本了。
PS:CM0加入读保护后,Segger的Unsecured Chip功能不能正常使用了,还未找到办法。跟ST的FAE联系后,建议使用ST Link的STVP来对Option Byte进行擦除,对RDP进行擦除。
更新固件之后,实测发现更容易掉固件了,之前的固件在同样的硬件平台使用半年都不掉一次,更新之后,平均估计半个月就会掉。还没找到问题所在,这样推理的话,只是跟固件相关。抑或是新的固件对硬件操作上有所更改所致?
注意:同时修改GDBFull为GDBFULL或其他字符,根据目前实测,一个月不掉固件,所以修改的地方除了SN,同时应当修改GDBFull字符。解决之前只修改SN后,常掉固件的问题。