工欲善其事,必先利其器:动手给JLink添加官方不支持的芯片
背景市场上的新芯片层出不穷,JLink的官方支持不可能完全跟得上,这就尴尬了。但是好在Segger在设计时就想到了这一点,允许用户自己添加新芯片或扩展官方已经支持的芯片。本文只讲如何添加新芯片,参考的资料为UM08001_JLink.pdf中的第12章——Open Flashloader。本文以华大半导体的HC32L19x系列为例子,jlink驱动版本为V6.86f。最终效果在开始前,我们先看看最终效果。在添加前,JFlash里找不到华大的任何型号,如下图
添加前添加后如下图
添加后此外,如果使用RTT进行调试,那也是方便不少。添加前没有对应的型号,因此只能选对应的芯片内核,通过指定地址的方式去使用。
添加前但是工程改动后,这个地址是会变的,得经常查找并更新该地址,效率也是低得感人。添加后就可以选择对应的型号,通过自动搜索的方式使用,效果如下
添加后添加方法找到Jlink安装目录下的JLinkDevices.xml并打开;在打开的文件添加如下内容,因为这个文件里没有任何华大的芯片,所以我添加到文件末尾,如果文件已经有同厂家的其它芯片,建议还是放一起,方便维护。效果和代码放下面了,代码的解释在后面!
<!-- --> <!-- HDSC (HC32L19x) --> <!-- --> <Device> <ChipInfo Vendor="HDSC" Name="HC32L190FCUA" Core="JLINK_CORE_CORTEX_M0" WorkRAMAddr="0x20000000" WorkRAMSize="0x00008000" Aliases="HC32L196PCTA; HC32L196MCTA; HC32L196KCTA; HC32L196JCTA; HC32L190JCTA; "/> <FlashBankInfo Name="Internal Flash" BaseAddr="0x00000000" MaxSize="0x00040000" Loader="Devices/HDSC/HC32L19X/FlashHC32L19X_256K.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/> </Device>保存文件就添加完了,可以验证是否如文章开头的效果一样代码解释最开始的三行是注释,注释嘛,随便写了,清晰明了就行;<Device>和</Device>必须成对出现,而且没有属性表。每个(系列)芯片都对应着这么一对。ChipInfo是描述芯片的信息,必须在 <Device>和</Device>内。参数说明Vendor芯片厂家的名字,比如这里的"HDSC"就是华大半导体Name芯片的具体型号,我用的就是HC32L190FCUACore芯片的内核,这个必须是JLink支持的内核之一,具体的名字可以在文档里的12.5.3.1 Attribute values - Core章节找到。本文的这颗芯片是M0+的内核,但是列表里没有M0+,所以这里选M0!WorkRAMAddr芯片RAM的起始地址,这个可以在用户手册里找到,也可以打开SDK里的官方例程,然后在工程配置里找到WorkRAMSize芯片RAM的大小,同样可以在用户手册里找到,也可以打开SDK里的官方例程,然后在工程配置里找到Aliases同系列的相同RAM和FLASH的型号,比如华大这里全是同样的配置,我就都加进去了JLinkScriptFile高级用法,有些芯片操作比较特殊,可以通过脚本去实现,这里我用不上FlashBankInfo描述芯片的Flash信息,有多块flash的话,每块对应一个FlashBankInfo。参数说明Nameflash的名字,名字可以随便起BaseAddrflash的起始地址,可以在用户手册里找到MaxSizeflash的大小,可以在用户手册里找到Loader烧录的算法,segger官方的是.elf格式,.flm是ARM的格式,keil里就用这个。这个路径可以是绝对地址也可以是相对地址,相对地址的话是从JLinkDevices.xml所在的路径为起始地址。本文使用的算法文件是在华大的HDSC.HC32L19X.1.0.0.pack安装后从C:\Keil_v5\ARM\Flash拷贝过来的,没有的文件夹就自己新建LoaderType必须是12.5.4.1 Attribute values - LoaderType中列出的类型之一,目前只有FLASH_ALGO_TYPE_OPEN一个类型,而*.flm是支持这个类型的AlwaysPresent指示这个块flash是不是一直存在,本文是内部flash,当然一直存在