使用python操纵jlink

最近在做一个项目,功能都是分开几个人做的,每个人调试自己那部分功能的时候,都用串口打印log信息出来,每个人都调好之后,代码一合并,空间不够了,经过各种删减优化,终于是下进去了。但是这个时候,没有空间可以写log了,出了问题,也不知道是怎么回事,因为这个项目是要大批量一两百个设备运行起来才能看到效果的,我不可能每个设备都连着jlink在线调试啊。关键是空间不足,引脚也没有空出来的。

机缘巧合之下,我在网上找到了一个神器,pylink-square。就是用python来控制jlink。经过我的试验,发现这个包可以在MCU运行期间连上MCU,还不会打断MCU的运行,更厉害的地方是,它还可以把MCU的RAM,FLASH中的内容读出来,实时的哦,读取的操作不会让MCU停下来。有了这个包,虽然我不能打log了,但是我可以把一些关键的变量读出来看,并且因为不会打断MCU的运行,所以我可以拿着个jlink,想看哪个设备就戳上去读变量。

flash中的存的参数还好说,你肯定是知道地址的。但是一些RAM中的变量,要怎么读取呢。这里要分两种情况,如果是静态的变量,或者全局变量,应该是固定地址的,按理说是能够根据地址直接读出来的,如果是栈中的变量,函数中的局部变量,那就无能为力了。另外,虽然我现在还没尝试去读,但是我看到这个pylink的包好像还可以读寄存器的值,也就是R0~R13。那么在死机的时候,是不是能够读取这些寄存器的值,还有RAM中的数据来判断死机是死在哪了呢,这个功能想想还是有可行性的,以后有机会试试。

这里放一张我在MAP文件里看到的变量,类型是Data,Gb全局变量,还可以看到变量的名字在RAM中的地址,真是贴心。

接下来我来说说,这个pylink该怎么用

安装

在命令行中输入

python -m pip install pylink-square

记得有个square,只是pylink的装的就是另外一个包了

第一步找到jlink

pylink找到jlink的依据就是这个jlink的序列号。一开始还真是苦恼了很久,因为一直不知道jlink的序列号去哪里找。

使用python操纵jlink_第1张图片

在开始菜单中找到jlink commander。打开这个commander就会自动连接jlink,这个时候

使用python操纵jlink_第2张图片

就看到序列号了。

那么在pylink,要如何连接jlink,也很简单。先创建一个jlink对象。

j = pylink.JLink()

然后根据序列号连接jlink

j.open('59402259')

注意了,这个序列号必须是个字符串

第二步连接芯片

连接芯片之前,需要注意,pylink默认是用JTAG接口的,如果jlink跟芯片是用SWD连接的,要设置pylink的接口为SWD。

j.set_tif(pylink.enums.JLinkInterfaces.SWD)

接口选对之后,我们要告诉pylink连接的芯片是什么型号

j.connect('EFM32ZG210F32‘)

如果是一些比较冷门的芯片,可能你输入芯片的型号jflash都找不到,这个时候可能只能依靠内核的型号来连接芯片了。

第三步天高海阔任你飞

连接成功了,爱咋玩就咋玩了。读FLASH,RAM中的数据,我一般都是用下面这个接口,addr就是地址,num就是读的字节数,读成功的话,就会返回一个list,里面就是我们想要的数据,记得读出来的数据是小端模式哦。按这个方式,对照着map文件,我们就能够把RAM中的变量,FLASH中的参数统统读出来看了,并且还不打断MCU。就跟你用IAR在线调试的时候,add live watch一个样。

j.memery_read8(addr,num)

另外一点设想

再进一步天马行空的话,岂不是python可以操纵芯片外设!!因为操作外设其实就是操作外设寄存器,操作外设寄存器,就跟读写FLASH一样的。python唯一做不到的就是无法执行中断服务函数。也就是操作外设的话,只能以轮询的方式来,比如UART,不能中断发送中断接收这类的,只能查询接收,查询发送。

你可能感兴趣的:(MCU)