QT 编写 STC系列MCU烧录软件

由于产品上用到了STC的单片机,而需要自行写一个烧录软件,该软件可以实现STC系列MCU文件的烧录。

本软件最终取自开源的库,因此感谢为开源无私奉献的人们!

一、将开源的STC的库,编译生成exe文件

本示例采用的github上的开源库:https://github.com/grigorig/stcgal

由于该demo采用的是python库,用C++不是很容易调用,因此将其编译为exe可执行文件使用。

具体方法如下:

1、首先将源码下载或者clone下来。

2、安装pyinstaller

         pip install pyinstaller

         输入$ pyinstaller -v显示版本信息表示安装成功,显示结果如下:
               3.6

3、进入stcgal文件夹,输入以下命令:

pyinstaller -F __main__.py frontend.py ihex.py models.py options.py protocols.py utils.py

      会在当前文件夹的dist子文件夹下面生成__main__.exe

      然后执行   __main__.exe  ,会生成如下的帮助命令,表示编译成功,文件可用

usage: __main__.exe [-h] [-a] [-r RESETCMD] [-P {stc89,stc12a,stc12b,stc12,stc15a,stc15,stc8,usb15,auto}] [-p PORT]
                    [-b BAUD] [-l HANDSHAKE] [-o OPTION] [-t TRIM] [-D] [-V]
                    [code_image] [eeprom_image]

stcgal 1.6 - an STC MCU ISP flash tool
(C) 2014-2018 Grigori Goronzy and others
https://github.com/grigorig/stcgal

positional arguments:
  code_image            code segment file to flash (BIN/HEX)
  eeprom_image          eeprom segment file to flash (BIN/HEX)

optional arguments:
  -h, --help            show this help message and exit
  -a, --autoreset       cycle power automatically by asserting DTR
  -r RESETCMD, --resetcmd RESETCMD
                        shell command for board power-cycling (instead of DTR assertion)
  -P {stc89,stc12a,stc12b,stc12,stc15a,stc15,stc8,usb15,auto}, --protocol {stc89,stc12a,stc12b,stc12,stc15a,stc15,stc8,usb15,auto}
                        protocol version (default: auto)
  -p PORT, --port PORT  serial port device
  -b BAUD, --baud BAUD  transfer baud rate (default: 19200)
  -l HANDSHAKE, --handshake HANDSHAKE
                        handshake baud rate (default: 2400)
  -o OPTION, --option OPTION
                        set option (can be used multiple times, see documentation)
  -t TRIM, --trim TRIM  RC oscillator frequency in kHz (STC15+ series only)
  -D, --debug           enable debug output
  -V, --version         print version info and exit

二、通过命令行测试编译是否成功
 

./__main__.exe -P stc15 -p COM5 -l 1200 -o clock_source=internal -t 33000  test.hex

具体命令解释如下,-P为选择的型号,-p为选择的串口号 ,-l为波特率  -o为选择时钟源,-t为时钟频率     最后test.exe表示烧录的文件的路径。

如有更具体的参数,请参考https://github.com/grigorig/stcgal/blob/master/doc/USAGE.md文件,上面对命令的解释更加详细。

三、编写QT软件

可以调用qprocess,当外部文件命令行调用该文件,具体代码如下:

头文件:

#ifndef STC_ISP_CONFIG_H
#define STC_ISP_CONFIG_H

#include <QObject>
#include <QProcess>
#include <log_generate.h>

//下载参数
typedef struct
{
    QString     ComName;                        //串口号
    uint32_t    BaudRate;                       //波特率

    QString     FirmwarePath;                   //烧录文件路径
    uint32_t    CrystalFreq;                    //晶振
}_STC_ISP_DOWNLOAD_PAR;

//烧录是否成功
typedef enum
{
    ISP_DOWNLOADING = 0,
    ISP_DOWNLOAD_FAIL,
    ISP_DOWNLOAD_SUCC,
}_ENUM_STC_ISP_DOWNLOAD;

extern _ENUM_STC_ISP_DOWNLOAD   isp_download_state;                   //程序下载情况


class STC_ISP_Config : public QObject
{
    Q_OBJECT
public:
    explicit STC_ISP_Config(QObject *parent = nullptr);

signals:
    void Signal_STC_ISP_Log(int msgType,QString loginfo);

public slots:

    void Slot_Command_Info_Read();              //读取   cmd 执行完命令
    void Slot_Command_Error_Read();             //读取   错误输出信号
    void Slot_Command_Finished(int exitCode);
    bool ISP_Write_Program(_STC_ISP_DOWNLOAD_PAR);    //写入程序

private:
    QProcess  *m_Process;                       //用于操作命令行工具
};

#endif // STC_ISP_CONFIG_H

源文件:

#include "stc_isp_config.h"
#include <QDebug>

_STC_ISP_DOWNLOAD_PAR  ISP_DownloadPar;
_ENUM_STC_ISP_DOWNLOAD isp_download_state;                          //程序下载情况
bool                   isp_finish_flag = true;                      //默认为完成

STC_ISP_Config::STC_ISP_Config(QObject *parent) : QObject(parent)
{
    //新的对象声明
    m_Process = new QProcess(this);

 //   m_Process->setReadChannel(QProcess::StandardOutput);
  //  m_Process->setProcessChannelMode(QProcess::ForwardedChannels);

    //可读时   触发信号
    connect(m_Process,&QProcess::readyRead,this,&STC_ISP_Config::Slot_Command_Info_Read);
    connect(m_Process,&QProcess::readyReadStandardError,this,&STC_ISP_Config::Slot_Command_Info_Read);
    connect(m_Process,SIGNAL(finished(int)),this,SLOT(Slot_Command_Finished(int)));
}

//烧录程序
bool STC_ISP_Config::ISP_Write_Program(_STC_ISP_DOWNLOAD_PAR download_par)
{
    ISP_DownloadPar = download_par;

    isp_download_state = ISP_DOWNLOADING;               //正在烧录

    //参数合法性检查
    if(download_par.FirmwarePath.length() == 0)
    {
        emit this->Signal_STC_ISP_Log(LOG_ERROR,QString("烧录文件路径无效,请重新选择烧录文件!"));
        return false;
    }

    //如果未完成  则退出
    if(!isp_finish_flag)
    {
        emit this->Signal_STC_ISP_Log(LOG_ERROR,QString("上次烧录程序未执行完成,请稍后重试!"));
        return false;
    }

    //默认处于未完成状态
    isp_finish_flag = false;

    //文件主路径
    QString  Command_Main = QString("stcisp.exe");

    //arg赋值
    QStringList Command_Args;

    //型号
    Command_Args.append("-P");
    Command_Args.append("stc15");

    //串口号
    Command_Args.append("-p");
    Command_Args.append(download_par.ComName);

    //波特率
    Command_Args.append("-l");
    Command_Args.append("1200");

    //时钟选择
    Command_Args.append("-o");
    Command_Args.append("clock_source=internal");

    //时钟频率选择
    Command_Args.append("-t");
    Command_Args.append(QString::number(download_par.CrystalFreq));

    //文件名
    Command_Args.append(download_par.FirmwarePath);

    //执行
    m_Process->start(Command_Main,Command_Args);

    return true;
}

//读取信息
void STC_ISP_Config::Slot_Command_Info_Read()
{
    static uint32_t count = 0;
    QByteArray Temp_Array;              //当前数组
    int        CurrentIndex = 0;        //当前的索引

    QByteArray read_info = m_Process->readAll();


    //信息判断
    if(read_info.contains("Waiting for MCU, please cycle power"))      //重新 上电
    {
        emit this->Signal_STC_ISP_Log(LOG_NORMAL,QString("串口连接成功,请重新上电!"));
    }
    else if(read_info.contains("Serial port error: could not open port "))      //串口无效或被占用
    {
        isp_download_state = ISP_DOWNLOAD_FAIL;     //下载失败
        emit this->Signal_STC_ISP_Log(LOG_ERROR,QString("打开串口 %1 失败!").arg(ISP_DownloadPar.ComName));
    }
    else if(read_info.contains("Writing flash:"))        //烧录中
    {
        emit this->Signal_STC_ISP_Log(LOG_NORMAL,QString("串口烧录中,请稍等..."));
    }
    else if(read_info.contains("Finishing write"))
    {
        isp_download_state = ISP_DOWNLOAD_SUCC;     //下载成功
        emit this->Signal_STC_ISP_Log(LOG_HEALTH,QString("程序烧录完成!"));
    }


    qDebug() << read_info;
}

//出错信息
void STC_ISP_Config::Slot_Command_Error_Read()
{
    QByteArray read_info = m_Process->readAllStandardError();
}

//完成
void STC_ISP_Config::Slot_Command_Finished(int exitCode)
{
    isp_finish_flag = true;
}

 

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: STC-ISP烧录软件是一种用于STC单片机的烧录工具,可帮助用户将程序下载到单片机中。以下是关于STC-ISP烧录软件下载的详细步骤: 首先,我们需要打开浏览器,进入STC官方网站。通过在搜索框中输入“STC-ISP烧录软件下载”,我们可以找到相关页面。 在STC官方网站中,我们可以找到STC-ISP烧录软件的最新版本。通常,官方网站会提供软件的下载链接,我们可以点击链接进行下载。 下载完成后,我们需要解压缩软件文件。双击下载的压缩文件,然后选择解压缩的位置。解压缩完成后,会生成一个可执行文件,通常是以“.exe”为文件后缀名。 接下来,我们可以双击可执行文件打开STC-ISP烧录软件软件界面通常会提供用户操作和设置的选项,如选择单片机型号、选择下载文件等。 在软件界面中,我们需要选择正确的单片机型号。通常,软件会提供一个下拉菜单,列出了支持的单片机型号。我们需要根据我们使用的具体单片机型号来进行选择。 在选择单片机型号后,我们可以选择需要下载的程序文件。通常,软件会提供一个浏览文件的按钮,我们可以点击这个按钮来选择需要下载的程序文件。 当我们选择好单片机型号和程序文件后,我们可以点击软件界面上的“烧录”按钮来开始烧录过程。软件会自动将程序下载到单片机中。 烧录完成后,我们可以断开单片机与计算机之间的连接,然后将单片机按照需要进行相应的运行。 这就是关于STC-ISP烧录软件下载的相关步骤。希望对您有所帮助! ### 回答2: STC-ISP烧录软件可以用于STC51单片机的固件升级和程序下载。您可以通过以下步骤进行软件下载: 1. 打开您的浏览器,进入STC官方网站http://www.stcmcudata.com/。 2. 在网站首页的菜单栏中找到“软件下载”选项,并点击进入。 3. 在“软件下载”页面中,找到“STC-ISP烧录软件”选项,并点击下载链接。 4. 在下载页面中,根据您的操作系统选择合适的版本,如Windows、Linux或Mac OS,然后点击下载按钮。 5. 下载完成后,找到下载的安装文件,并双击运行。 6. 按照安装向导的指示,选择软件的安装目录,并完成安装过程。 7. 安装完成后,打开STC-ISP软件。 8. 在软件界面中,选择连接方式和目标单片机型号。 9. 配置好烧录参数,如波特率和烧录模式。 10. 点击“打开”按钮,选择您要烧录的程序文件。 11. 点击“开始”按钮,开始烧录过程。 12. 在烧录完成后,您可以重新上电并测试您的单片机程序。 需要注意的是,下载和安装STC-ISP烧录软件需要确保您的电脑具备足够的磁盘空间和系统要求。此外,在使用软件时,请仔细阅读软件提供的使用说明和注意事项,以确保正确而安全地进行烧录操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值