嵌入式参数配置工具(python+pylink)(三)--pylink的使用

背景:设备中包含大量参数,需要配合非程序员同事修改参数进行测试。没有可用的人机交互接口,只能通过串口AT指令或烧录的方式访问。

目标是做成一款人人可以上手的工具,快速对设备进行自定义的配置。

目录

pylink安装

pylink接口介绍

open:PC连接jlink盒子

opened:检查是否有可用的jlink和DLL

set_tif:选择设备连接接口

connect:连接jlink和设备

target_connected:检查设备和Jlink是否连接

flash_file:写文件到设备flash

erase:擦除整片

more:

pylink使用

连接设备

检查文件路径

写入文件

借助JLink.exe擦除指定区域


系列文章:

产品参数配置工具(python+pylink)(一)--方案设计-CSDN博客

产品参数配置工具(python+pylink)(二)--bin文件生成和调用-CSDN博客

产品参数配置工具(python+pylink)(四)--pyqt界面设计-CSDN博客

产品参数配置工具(python+pylink)(五)--打包exe-CSDN博客

pylink安装

pylink是用python写的调用jlink库函数的包,安装后可以在python中import pylink包,调用jlink相关接口函数,实现烧,写,读,调试等操作。

安装方法:pip install pylink-square

安装后,还需要在执行目录下放置DLL文件,x86位机放JLinkARM.dll, x64放JLink_x64.dll

也可以选择将这两个文件的目录加入系统环境变量中。

原因是在windows上,会按照以下顺序搜索dll,dll中包含有pylink接口实现。

1.当前执行目录。
2.Windows系统目录。
3.Windows目录。

pylink接口介绍

open:PC连接jlink盒子

可以通过设置serial_no和Ip_addr指定连接某个jlink。如果只插了一个jlink,可以不设置。

opened:检查是否有可用的jlink和DLL

set_tif:选择设备连接接口

可选择的接口有:JTAG,SPI,SWD

例如:

pylink.enums.JLinkInterfaces.SWD作为参数传入函数,则是选择SWD作为jlink和设备连接接口

connect:连接jlink和设备

speed默认为4000hz,chip_name不能为空,需要根据要连接的芯片设置。这里一定要使用try-except,及时发现连接失败给用户提示,避免卡死。

target_connected:检查设备和Jlink是否连接

在做读写擦操作前都可以检查一下是否连接,确保不会在操作前由于设备断电等,导致设备断连,读写擦卡死闪退。

flash_file:写文件到设备flash

在调用该函数后,会周期性的调用on_progress定义的函数,参数包含当前动作,提示说明,进度(0-100)。可以定义该函数用于显示进度。

该函数会主动先Compare对比当前flash内容和目标内容,若无不同则不再重现烧录;

若有不同,则主动Erash擦除原内容,然后再Flash写入

erase:擦除整片

目前pylink的erase接口只能整片擦除,因此这里我采用了直接调用J-Link.exe command line的方式擦除目标区域

more:

以下是pylink的说明文档,方便查看。本文只介绍小工具需要的接口,其他内容感兴趣的朋友可以自行研究。

Installation — PyLink

pylink使用

连接设备
import pylink
jlink = pylink.JLink()
def jlink_connect(device):
    try:
        jlink.open()
    except:
        return -1
    if not jlink.opened():
        return -1
    jlink.set_tif(pylink.enums.JLinkInterfaces.SWD)
    try:
        jlink.connect(device)
    except pylink.errors.JLinkException:
        return -2
    if jlink.target_connected():
        return 1
    else:
        return 0
检查文件路径

需要注意的是,调用flash_file的时候,要求路径不能有中文,否则会报错卡死。因此这里需要增加一个路径中文检测,避免卡死闪退。

def is_chinese(word):
    for ch in word:
        if '\u4e00' <= ch <= '\u9fff':
            return True
    return False
写入文件

注意:要在写入文件前对设备进行reset操作,避免出现异常。这个操作也推荐使用try-except,避免异常卡死闪退。

关于on_progress回调函数,我在这里选择了只打印非空的操作提示和部分步骤提示。这里还略微有点没搞懂on_progress函数action的调用顺序,似乎percent=100后,这个action还会多次出现。

def flash_circle(action, progress_string, percentage):
    if action == b'Compare':
        if percentage == 0:
            print('comparing...')
    if action == b'Erase':
        if not percentage == 100:
            print('erasing...')
    if action == b'Flash':
        if percentage == 100:
            print('Flash finished')
    if not progress_string == None:
        print(progress_string)

def jlink_write(device, data_path):
    if not jlink.target_connected():
        return -1
    '''
    应用不能放在中文路径,提示用户
    '''
    if is_chinese(data_path):
        print("不能有中文")
        return -2

    # os.system('erase 0x08032000 0x08032800')
    try:
        jlink.reset(50)
        jlink.flash_file(data_path, 0x08032000, power_on=True, on_progress=flash_circle)
        jlink.reset(1)
    except pylink.errors.JLinkException:
        return -3
    return 0
借助JLink.exe擦除指定区域

由于pylink的接口只有整片擦除的erase接口,没有找到擦除指定位置的接口,但命令行是有擦除指定区域的命令的,因此考虑调用命令行进行指定位置的擦除。

命令行指令为: JLink  -commandfile test.jlink -device mcu_type

可以在test.jlink中定义需要执行的指令。指令集可以打开JLink.exe后,在黑窗中输入“?”查看。

erase start_addr end_addr可以擦除从start_addr到end_addr区间的flash,要求起始地址必须对齐sector

常用指令如下:

更多内容详见:https://docs.rs-online.com/5cbd/0900766b8165024a.pdf

举例一个test.jlink如下:

注意:最后一定要退出jlink,否则os.system等不到子进程返回,会卡死闪退

speed 4000
if swd
reset
erase 0x08032000 0x08032800
r
qc

上一篇:产品参数配置工具(python+pylink)(二)--bin文件生成和调用-CSDN博客

下一篇:产品参数配置工具(python+pylink)(四)--pyqt界面设计-CSDN博客

  • 15
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用PythonPyQt5来开发嵌入式系统测试工具PyQt5是一个Python的GUI开发框架,能够提供丰富的GUI组件和工具,使得开发者可以轻松地创建漂亮、交互式的用户界面。 下面是一个简单的示例,展示了如何使用PyQt5来创建一个嵌入式系统测试工具: ```python import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("嵌入式系统测试工具") self.setGeometry(100, 100, 400, 300) label = QLabel("欢迎使用嵌入式系统测试工具", self) label.move(100, 50) button = QPushButton("开始测试", self) button.move(150, 150) button.clicked.connect(self.start_test) def start_test(self): # 在这里添加测试代码 print("开始测试...") if __name__ == "__main__": app = QApplication(sys.argv) mainWindow = MainWindow() mainWindow.show() sys.exit(app.exec_()) ``` 在这个示例中,我们创建了一个MainWindow类,继承了QMainWindow,并在构造函数中设置了窗口的标题和大小。我们还添加了一个标签(label)和一个按钮(button)。 当用户点击按钮时,会触发start_test函数,我们可以在这里添加测试代码。 最后,我们创建了一个QApplication实例,将MainWindow实例作为主窗口,并启动了应用程序。 通过使用PyQt5,我们可以轻松地创建一个漂亮的、交互式的嵌入式系统测试工具

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值