开发产品一定离不开的是调试器,现在国内市场上大多用的是盗版的j_link ob和st_link。这两个调试器diy的可能性很大,我见过二合一的调试器。但是世面上的固件一般都是老版本的,在用新驱动的时候容易识别盗版导致不能用,虽然可以将驱动版本调低来解决。本文就是介绍如何提取最新的固件。
首先来看一下jlink ob。用到的文件是驱动安装目录下的JlinkARM.dll这个文件(这里以比较新的驱动版本6.18C为例)。这个文件里面包含了arm内核的所有固件,不止是jlink ob,不过其他的我没实验。还用到的软件是winhex。准备好下面开始提取固件。
第一步,用winhex打开JlinkARM.dll。
如图:
第二步,寻找固件位置。这里我就不卖关子了,直接用搜索功能 向下搜索stm32(ob的ic是stm32的)。由于stm32关键词比较多,固件位置一般靠下,可以鼠标向下适当拉一下在向下搜索。
我搜索到的第一个内容,可以看到这个固件的编译日期是2017年 用的ic是stm32f072。
找到固件的大题位置了怎么找到开头那?我就值说了,为什么就不说了,在这里向上搜索16进制字符0020(注意是16进制)。
找到了这个,首先是0020的位置一般是偶地址开始的(比对其他固件没发现不是)。
还有就是后面不愿处跟着一大堆有规律的数据,什么规律我也不知道,但是能看出来特殊,像这样
看着差不多就行了。然后从0020在往前推2个字节,比如这个也就是40 22 00 20;40就是固件的开始,开始找到了,那么怎么找到结尾那。这个比较简单,因为你多取没事,但是不能少取;最极端的方法就是看看你jlink ob用的ic的flash多大,就取多大(注意,因为固件前面还有一段bootloater,用来更新固件用的,所以要减去这个长度,这个bootloater后面会说)。
第二种方法就是找到下一个固件的开始,然后截取,不一定这么精确,多取一点没事。
把着一段内容复制出来,用winhex新建一个文件,粘贴过去。这个文件就是你提取的固件了,比如这个是2017年编译的已经非常新了,再也不怕报错了。
市面上的jlink ob大多是stm32F103的,这个固件不适合用,读者们自己接着往下搜索,就可以找到stm32F103的固件,提取方法时一样的。
F103的固件有两个:
这个编译时间比较新2017年,不知到时什么版本的,我烧写到我的jlink ob(stm32f103c8)里面时可以用的,但是好像指示灯和我手上的不一样了,不影响使用。但是最高支持2250K的频率。
这个版本在我的jilin ob(stm32f103c8)指示灯正常,显示最高频率4000K。(但是我经过测试两个固件的烧写速度一样,设置1M 2M 3M 5M烧写速度全部一样)。
你以为完了吗?当然没有,上面提到过前面还有一段用来更新固件的bootloater,这个bootloater的大小有0x4000(f103c8的大小,其他不知道)的大小并且在jlinkarm.dll里面找不到。怎么办?
有两种办法解决:
- 不用这个bootloater直接跳过,但是也要经过一些处理。在你提取出来的固件前面用winhex添加0x4000大小的空字节,充填数据全是0x00就行了,然后改充填完0x00的固件前面8个字节和提取出来的固件前8个字节一样
比如我的
改了两个,没影响。
这个是真正固件的开头(无改动,注意偏移地址在stm32f103c8上是0x4000)。
这样把改完的固件烧写到stm32F103c8里面就行了,至于为什么这样改这里就不多讲了,内核决定。但是这样处理是不能用官方软件更新升级固件的,因为根本没有bootloater
第二种处理方法是,找一段官方的bootloater加在固件前面,这个bootloater我在下面提供下载(但是我认为没必要,因为本来就是盗版)
下载资源含有两个完整的jlink ob固件;适用ic:stm32f101c8/cb stm32f103c8/cb。一个bootloater
下载链接:https://download.csdn.net/download/qq_39663845/10547285
注:世面上用的ic有的是stm32f101c8/cb stm32f103c8/cb都是通用的。
大家可能会问101不是没有usb功能吗?其实是硬件是有的,但是出厂没测试,或者是残次品。
也就是说你可以用但是st不售后,出了问题别找我。
还有就是f103c8的flash其实有128K,和上面一样也是没测试。stm32f101c8/cb stm32f103c8/cb这4个感觉就是一个东西不同名而已