快速设计UI版的blhost给LPC55S69更新固件

对于恩智浦的MCU来讲,目前官方用的blhost固件更新工具是命令行版的上位机。在工程师实际应用的过程中,有些朋友可能会觉得命令行版本的上位机不符合个人的使用习惯或者不好发布给自己的终端用户,我们需要的是一个简单易用的GUI版本的上位机。这里给大家安利一个利用python和QT5的组件PySide2使用python脚本快速调用blhost.exe实现简单上位机操作的方法,最后会有打包成exe文件方便发布给终端客户的。

建立开发环境

在使用python开发前,我个人是用Anaconda3和文本编辑器开发的,所以推荐先安装Anaconda3
,文本编辑器推荐使用Sublime

Visual Studio Code

安装好开发环境后,进入python的执行环境


Anaconda3 命令行

安装插件

安装PySide2

使用pip wheel为Python包安装Qt。从CMD运行以下命令进行安装:

pip install PySide2

或者:

pip install --index-url=http://download.qt.io/snapshots/ci/pyside/5.12/latest pyside2 --trusted-host download.qt.io

个人推荐国内的客户用第二种安装方法,第一种我经常安装超时。

安装QT5的开发工具Designer

pip install PyQt5-tools

或者:

pip install PyQt5-tools -i http://pypi.douban.com/simple --trusted-host=pypi.douban.com

安装打包exe的工具pyinstaller

pip install pyinstaller

如果你要开发基于串口的升级工具,还需要安装pyserial

pip install pyserial

这篇文章会以USB HID接口升级为主,串口玩法暂且不表

使用QT Designer设计UI

利用Everything工具搜索到QtDesigner

一般来将通过Windows搜索QtDesigner比较麻烦,建议安装Everything

Everything查找Designer.exe

在Everything里搜索designer.exe,找到anaconda3\Lib\site-packages\pyqt5_tools\Qt\bin下的designer.exe并运行。
QtDesigner

创建界面

选择QVGA landscape(320x240)然后点击Create按钮,创建一个新的界面

创建一个新的QT界面

添加按键和对话框

为新的界面添加3个按键Push Button以及2个对话框Text Browser

添加按键和对话框

修改2个对话框的Object名字为Text_Path/Text_Result
Text_Path会用来显示烧录目标HEX文件的路径
Text_Reset会用来提示连接的状态和烧录的结果
修改3个按键的Object名字为But_Conn/But_Open/But_Prog
But_Conn按键用来测试是否与ISP状态的MCU连接正常
But_Open按键用来打开要烧录的HEX文件
But_Prog按键用来烧录But_Open选择的HEX文件
再修改3个按键的名字为Connect?/OpenBinary/Programm

修改按键名称

设定好后保存UI界面


保存UI

将UI文件转换成python脚本

在Anaconda3的命令行界面里进入UI保存的文件夹,然后输入以下命令

pyuic5 ui.ui >blhost_gui.py

UI文件转成python脚本

转换好后,
在blhost_gui.py开头import的位置加入如下引用
注意,这里要看好PySide2而不是PyQt5

import sys
import os
import subprocess

from PySide2 import QtCore, QtGui, QtWidgets

from PySide2.QtWidgets import *
from PySide2.QtCore import *

在blhost_gui.py最后一行加入如下代码

__author__ = "Magicoe.Niu"
__version__ = "v1.0"
class mainWin(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(mainWin, self).__init__(parent)
        self.setupUi(self)
if __name__ == '__main__':
    print("blhost application start")
    app = QApplication(sys.argv)
    main_win = mainWin()
    main_win.show()
    sys.exit(app.exec_())

尝试运行下GUI

转换好后,我们可以尝试运行下界面,在命令行里输入

python blhost_gui.py

这时候会弹出我们在QtDesigner里设计好的UI界面,并且在命令行终端里会显示blhost application start

首次运行GUI界面

OK,接下来我们就可以添加实际的控制逻辑的代码了

加入blhost的功能

为了引用blhost.exe的功能,我们直接通过python的subprocess方法,还记的我们添加的那行import代码么?

import subprocess

这里我们直接把bhost.exe复制到blhost_gui.py的文件夹下,blhost.exe在SDK包里,具体路径为SDK_2.7.0_LPC55S69\middleware\mcu-boot\bin\Tools\blhost\win

复制blhost.exe到blhost_gui.py的文件夹下

在def retranslateUi(self, MainWindow) 函数结尾的地方,加入按键响应(clicked.connect())的代码

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.But_Open.setText(_translate("MainWindow", "OpenBinary"))
        self.But_Conn.setText(_translate("MainWindow", "Connect?"))
        self.But_Prog.setText(_translate("MainWindow", "Program"))

        self.But_Open.clicked.connect(self.openfile)
        self.But_Prog.clicked.connect(self.program)
        self.But_Conn.clicked.connect(self.connectwUSB)

新加入的3行clicked.connect功能需要调用openfile/program/connectwUSB三个函数来实现打开HEX文件,对芯片变成以及检查USB连接的状态。所以我们要在retranslateUi函数后加入3个新的函数。

首先我们先加入打开文件的函数

openfile_name在这里代表了选择的目标HEX文件的路径,我们把它显示在文本框“Text_Path”中

    def openfile(self):
        openfile_name = QFileDialog.getOpenFileName(self,'选择文件','','Hex File(*.hex)')
        print(openfile_name)
        self.Text_Path.setText(openfile_name[0])

接下来我们加入检查USB连接的函数

检查USB是否和开发板上进入ISP模式的MCU连接正常,我们使用blhost.exe的get-property的功能,通过python的subprocess.Popen调用,所以我们要把blhost.exe放在该脚本同一的文件夹下。
0x1FC9,0x0021是MCU USB ISP时的VID和PID,这里是LPC55S69的不同的恩智浦MCU该VID和PID可能不同,随时可以修改。
get-property 1是获取当前BOOT ROM的版本,如果获取的版本是2.2.0的则芯片是0A的版本,如果是3.0.0的则是1B的版本,如果是其他数字则需要根据KBOOT的版本号来确定芯片的版本。
获取到正确的KBOOT的版本号后悔在Text_Result对话框里显示出来信息,如果不正确则提示连接异常或者提示是未知的芯片版本。

    def connectwUSB(self):
        print("blhost programming connect")
        blhost_main = "blhost.exe"
        ret = subprocess.Popen(blhost_main + " -u 0x1FC9,0x0021 -- get-property 1", shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        RetText = ret.communicate()
        print (RetText)
        if "Current Version" in str(RetText):
            if "Current Version = K2.2.0" in str(RetText):
                self.Text_Result.setText("Connected Silicon 0A Success")
            elif "Current Version = K3.0.0" in str(RetText):
                self.Text_Result.setText("Connected Silicon 1B Success")
            else:
                self.Text_Result.setText("Connected Silicon Success, unknown Silicon version")
        else:
            self.Text_Result.setText("Connected with USB Failed")

最后我们加入烧录芯片的函数

同检查芯片连接状况的函数差不多,这里烧录我们调用的是blhost的 flash-image功能,需要注意的是USB的VID和PID号要对,其他无碍。
正确的烧录blhost.exe会返回“Success”,烧录失败会返回其他信息。

    def program(self):
        target_bin = self.Text_Path.toPlainText()
        print(target_bin)
        print("blhost programming start")
        blhost_main = "blhost.exe"
        ret = subprocess.Popen(blhost_main + " -u 0x1FC9,0x0021 -- flash-image "+ target_bin +" erase", shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        RetText = ret.communicate()
        print (RetText)
        if "Success" in str(RetText):
            self.Text_Result.setText("Program Success")
        else:
            self.Text_Result.setText("Program Failed")

运行blhost_gui.py

当我们补充完以上提到的代码后,在Anaconda3的命令行里输入

python blhost_gui.py

就可以正常运行该UI,如果还没有连接开发板或者开发板上MCU的状态不对


检查USB连接状态

开发板设置

LPC55S69-EVK配置为USB ISP模式需要注意以下几点

  1. J7断开
  2. J11断开
  3. J6选择HS
  4. 短接J10(上电进入ISP模式)
  5. 使用USB接口P9进行USB ISP操作
LPC55S69-EVK USB ISP设置

正常连接和烧录

如果USB连接正常,则按下Connect按钮会显示连接芯片的版本号。


USB连接正常

接下来我们可以按下按钮OpenBinary选择一个我们要烧录的hex文件


选择HEX文件

再点击烧录按钮Program,就可以正常烧录了
正常烧录

打包成exe文件

为了便于我们发布该软件给其他没有建立python执行环境的客户,我们可以用pyinstaller。
为了把整个执行环境达成一个exe,我们需要在pyinstaller命令后加入-F使blhost_gui.py打包后只生成一个exe文件

pyinstaller.exe blhost_gui.py -F

最后会在文件夹dist下边找到blhost_gui


最终生成的exe文件

直接执行该exe文件,当按下功能按钮的时候会发现找不到blhost
原因是需要把blhost.exe和blhost_gui.exe放在同一文件夹下,复制blhost.exe过来就可以解决。


执行exe失败

这里有个问题留给高手们,有谁知道如何把blhost.exe一起打包进来的么?欢迎高手们指点一二。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • 徐正溪的眼睛很有神,会说故事的那种。演员的演技眼睛很重要,眼神可把人物刻画的淋漓尽致。徐正溪的眼睛很有灵性,...
    水墨丹青的丹阅读 1,007评论 0 1
  • 春游龙凤山 2019年3月9日,星期六。下了一个月的雨,星期六天放晴。学校三八的出游活动安...
    范冬霞阅读 278评论 0 0
  • Mock简明文档 Mock.mock() Mock.mock( requestUrl?, requestType?...
    杀个程序猿祭天阅读 4,514评论 1 8
  • 简介 Spring Boot Admin 用于监控基于 Spring Boot 的应用,它是在 Spring Bo...
    灰色调诺言阅读 1,863评论 3 2
  • 关于家,关于童年,这也是我这些年最经常怀念的幸福。 我是家里的老三,也是幺女子。父母也是对我疼爱有加,大概是因为我...
    Nancy222阅读 471评论 0 1