QT写J-link上位机实现烧录功能

        JLink未开放软件开发接口(SDK),无法进行二次开发,但通过一些大佬的发现,JLink在烧录时,实际上都是通过调用JLinkARM.dll动态库提供的接口来进行操作的。这样我们就可以对其进行二次开发,该库有两个版本,一个32位,一个64位,具体位置如下图所示:

该工程实例代码已给出,需要的自行下载:https://download.csdn.net/download/carrymen/88463100

以下是库中导出函数的原型的一部分,基本够用了:


//JLINK TIF
#define JLINKARM_TIF_JTAG	0
#define JLINKARM_TIF_SWD	1
#define JLINKARM_TIF_DBM3	2
#define JLINKARM_TIF_FINE	3
#define JLINKARM_TIF_2wire_JTAG_PIC32	4

//RESET TYPE
#define JLINKARM_RESET_TYPE_NORMAL 0
#define JLINKARM_RESET_TYPE_CORE   1
#define JLINKARM_RESET_TYPE_PIN    2

//REGISTER INDEX
/*
  0 - 15     R0 - R15(SP=R13, PC=R15)
 16          XPSR
 17          MSP
 18          PSP
 19          RAZ
 20          CFBP
 21          APSR
 22          EPSR
 23          IPSR
 24          PRIMASK
 25          BASEPRI
 26          FAULTMASK
 27          CONTROL
 28          BASEPRI_MAX
 29          IAPSR
 30          EAPSR
 31          IEPSR
 */
typedef BOOL (*JLINKARM_Open_Func_Ptr)(void);       // 定义导出函数类型
typedef void (*JLINKARM_Close_Func_Ptr)(void);
typedef DWORD (*JLINKARM_TIF_Select_Func_Ptr)(int);
typedef void (*JLINKARM_SetSpeed_Func_Ptr)(int);
typedef void (*JLINKARM_Reset_Func_Ptr)(void);
typedef void  (*JLINKARM_Go_Func_Ptr)(void);
typedef BOOL (*JLINKARM_IsOpen_Func_Ptr)(void);

typedef void  (*JLINKARM_SetLogFile_Func_Ptr)(char *file);
typedef DWORD (*JLINKARM_GetDLLVersion_Func_Ptr)(void);
typedef DWORD (*JLINKARM_GetHardwareVersion_Func_Ptr)(void);
typedef DWORD (*JLINKARM_GetFirmwareString_Func_Ptr)(char *buff, int count);
typedef DWORD (*JLINKARM_GetSN_Func_Ptr)(void);

typedef BOOL  (*JLINKARM_ExecCommand_Func_Ptr)(char* cmd, int a, int b);
typedef DWORD (*JLINKARM_TIF_Select_Func_Ptr)(int type);
typedef void  (*JLINKARM_SetSpeed_Func_Ptr)(int speed);
typedef DWORD (*JLINKARM_GetSpeed_Func_Ptr)(void);
typedef DWORD (*JLINKARM_GetId_Func_Ptr)(void);
typedef DWORD (*JLINKARM_GetDeviceFamily_Func_Ptr)(void);

typedef BOOL  (*JLINKARM_Open_Func_Ptr)(void);
typedef void  (*JLINKARM_Close_Func_Ptr)(void);
typedef BOOL  (*JLINKARM_IsOpen_Func_Ptr)(void);
typedef BOOL  (*JLINKARM_Connect_Func_Ptr)(void);
typedef BOOL  (*JLINKARM_IsConnected_Func_Ptr)(void);
typedef int   (*JLINKARM_Halt_Func_Ptr)(void);
typedef BOOL  (*JLINKARM_IsHalted_Func_Ptr)(void);
typedef void  (*JLINKARM_SetResetType_Func_Ptr)(int type);
typedef void  (*JLINKARM_Reset_Func_Ptr)(void);
typedef void  (*JLINKARM_Go_Func_Ptr)(void);
typedef void  (*JLINKARM_GoIntDis_Func_Ptr)(void);
typedef DWORD (*JLINKARM_ReadReg_Func_Ptr)(int index);
typedef int   (*JLINKARM_WriteReg_Func_Ptr)(int index, DWORD data);

typedef int   (*JLINKARM_ReadMem_Func_Ptr)(DWORD addr, int len, void *buf);
typedef int   (*JLINKARM_WriteMem_Func_Ptr)(DWORD addr, int len, void *buf);
typedef int   (*JLINKARM_WriteU8_Func_Ptr)(DWORD addr, BYTE data);
typedef int   (*JLINKARM_WriteU16_Func_Ptr)(DWORD addr, WORD data);
typedef int   (*JLINKARM_WriteU32_Func_Ptr)(DWORD addr, DWORD data);

typedef int   (*JLINK_EraseChip_Func_Ptr)(void);
typedef int   (*JLINKARM_DownloadFile_Func_Ptr)(LPCSTR file, DWORD addr);
typedef void  (*JLINKARM_BeginDownload_Func_Ptr)(int index);
typedef void  (*JLINKARM_EndDownload_Func_Ptr)(void);

qt通过resolve对动态库进行解析获取对应函数指针:

 jlink_lib= new QLibrary("JLink_x64.dll");
    if(jlink_lib->load()){
        qDebug()<<"加载JLink_x64.dll成功, 开始解析函数";
        JLINKARM_Open_Entry = (JLINKARM_Open_Func_Ptr)jlink_lib->resolve("JLINKARM_Open");
        JLINKARM_IsOpen_Entry = (JLINKARM_IsOpen_Func_Ptr)jlink_lib->resolve("JLINKARM_IsOpen");
        JLINKARM_Close_Entry = (JLINKARM_Close_Func_Ptr)jlink_lib->resolve("JLINKARM_Close");
        JLINKARM_ExecCommand_Entry = (JLINKARM_ExecCommand_Func_Ptr)jlink_lib->resolve("JLINKARM_ExecCommand");
        JLINKARM_GetDLLVersion_Entry = (JLINKARM_GetDLLVersion_Func_Ptr)jlink_lib->resolve("JLINKARM_GetDLLVersion");
        JLINKARM_TIF_Select_Entry = (JLINKARM_TIF_Select_Func_Ptr)jlink_lib->resolve("JLINKARM_TIF_Select");
        JLINKARM_SetSpeed_Entry = (JLINKARM_SetSpeed_Func_Ptr)jlink_lib->resolve("JLINKARM_SetSpeed");
        JLINKARM_GetSpeed_Entry = (JLINKARM_GetSpeed_Func_Ptr)jlink_lib->resolve("JLINKARM_GetSpeed");
        JLINKARM_Connect_Entry = (JLINKARM_Connect_Func_Ptr)jlink_lib->resolve("JLINKARM_Connect");
        JLINKARM_IsConnected_Entry = (JLINKARM_IsConnected_Func_Ptr)jlink_lib->resolve("JLINKARM_IsConnected");
        JLINKARM_GetId_Entry = (JLINKARM_GetId_Func_Ptr)jlink_lib->resolve("JLINKARM_GetId");
        JLINKARM_GetSN_Entry = (JLINKARM_GetSN_Func_Ptr)jlink_lib->resolve("JLINKARM_GetSN");
        JLINKARM_Reset_Entry = (JLINKARM_Reset_Func_Ptr)jlink_lib->resolve("JLINKARM_Reset");
        JLINKARM_Halt_Entry = (JLINKARM_Halt_Func_Ptr)jlink_lib->resolve("JLINKARM_Halt");
        JLINKARM_WriteMem_Entry = (JLINKARM_WriteMem_Func_Ptr)jlink_lib->resolve("JLINKARM_WriteMem");
        JLINKARM_ReadMem_Entry = (JLINKARM_ReadMem_Func_Ptr)jlink_lib->resolve("JLINKARM_ReadMem");
        JLINK_EraseChip_Entry = (JLINK_EraseChip_Func_Ptr)jlink_lib->resolve("JLINK_EraseChip");
        qDebug()<<"解析函数完成";
    }
    else
    {
        qDebug()<<"加载JLink_x64.dll失败!!";
    }

        例程运行后可能会遇到库的路径找不到,而导致无法解析该库,有两种可能:一种是路径没找到,还有就是动态库的位数和qt编译工具位数对不上,他有一个32位库一个64位库,自行选择。而路径问题的话只需要将库放进编译后的工程中即可,也可以修改库路径。

运行成功后会打印一下信息:

qt工程运行成功界面如下图所示:

如果需要适配不同STM32型号芯片的烧录需要对工程进行几个位置的修改:

        ①:修改芯片型号和下载模式,还有下载速率

        ②:修改ID读取地址,根据型号来定,一下给出了STM32和GD32的UID存放地址,参照修改:

        做以上修改就可以了,我使用了STM32F429IG和STM32F103ZET6两块型号不同的芯片做了测试,结果是都能进行烧录,也可以更改成GD32型号,具体就没测试了,大家可以自己试一下。

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 周立功can-ii 上位机 qt是一种用于CAN总线通信的上位机软件平台,基于Qt框架开发。周立功CAN-II上位机可以与CAN总线设备进行通信,并通过用户界面实现数据的读取、发送、监控等功能Qt是一种跨平台的应用程序开发框架,具有丰富的图形化界面和强大的功能库。使用Qt开发周立功CAN-II上位机软件,可以使得软件界面美观、易于操作,并且在各种操作系统上运行稳定。 周立功CAN-II上位机软件具有以下特点和功能。首先,软件提供了友好的用户界面,使用户能够直观地进行数据读取、发送和监控操作。其次,软件支持CAN总线的多种通信协议和数据格式,可以与不同厂家的设备进行兼容。此外,软件还支持数据的实时显示、保存和导出,方便用户进行数据分析和后续处理。 周立功CAN-II上位机软件在工业控制、汽车电子、机械制造等领域有广泛应用。通过与各种CAN总线设备的配合,可以实现车辆诊断、工控设备监控、数据采集等功能。同时,软件的开放接口和丰富的功能库,也提供了二次开发的可能性,可以根据用户的需求进行功能扩展和定制化开发。 总之,周立功CAN-II上位机qt是一款功能强大、易于操作的软件平台,基于Qt框架开发,具有丰富的功能和广泛的应用领域。它为使用CAN总线通信的用户提供了便捷的数据读取、发送和监控操作,是一款值得推荐的上位机软件。 ### 回答2: 周立功CAN-II上位机基于Qt技术开发。Qt是一种跨平台的应用程序开发框架,被广泛应用于软件开发领域。Qt具有丰富的界面库和功能库,使得开发者可以快速构建强大的图形界面和功能丰富的应用程序。上位机是指通过电脑或者其他主控设备进行控制、监测和数据处理的设备。 周立功CAN-II上位机使用Qt作为开发框架,具有以下特点和优势: 1. 跨平台性:Qt可以在多个操作系统上运行,包括Windows、Linux和macOS等,这保证了周立功CAN-II上位机的跨平台能力,可以在不同操作系统的设备上使用。 2. 强大的图形界面:Qt提供了丰富的界面库,开发者可以通过Qt Designer进行界面设计,快速构建直观美观的图形用户界面,使操作更加方便。 3. 多功能支持:Qt提供了多种功能库,包括网络、数据库、图像处理等方面,可以方便地实现与其他系统的数据交互和处理,满足周立功CAN-II上位机的多样化需求。 4. 易于学习和使用:Qt提供了丰富的文档和教程,使得开发者能够快速上手,并且Qt的语言结构清晰、简洁易懂,使得开发效率提高。 5. 开发效率高:Qt提供了丰富的开发工具和调试工具,包括Qt Creator和Qt Designer等,可以提高开发效率,同时Qt的模块化结构使得代码重用和维护更加方便。 总之,周立功CAN-II上位机基于Qt技术开发,充分发挥了Qt跨平台、图形界面和多功能支持等优势,使得周立功CAN-II上位机具有良好的用户体验和广泛的应用前景。 ### 回答3: 周立功can-ii上位机是基于Qt框架开发的一款软件,主要用于与CAN-Ⅱ系列设备通信并对其进行操作和控制。Qt是一种跨平台的C++应用程序开发框架,通过使用Qt,可以方便地开发出具有良好用户界面和强大功能的软件。 周立功can-ii上位机提供了友好的图形用户界面,可以实时监测CAN-Ⅱ系列设备传输的数据,同时也可以设置参数和发送指令。用户可以通过上位机与CAN-Ⅱ设备进行双向通信,实现对设备的控制和配置。 QT框架的优势在于其强大的多线程处理能力和跨平台的特性。周立功can-ii上位机利用这些特点,可以同时处理多个设备的数据请求,并保证数据的稳定和准确。无论是在Windows、Linux还是MacOS等操作系统上,周立功can-ii上位机都可以完美运行。 此外,周立功can-ii上位机还提供了丰富的功能模块,如数据记录功能、数据分析功能、远程升级功能等。用户可以根据自己的需求选择适合的功能模块,定制化自己的上位机软件。 总之,周立功can-ii上位机利用Qt框架开发,具有可靠的通信能力、强大的功能和良好的用户界面。它是一款功能丰富、易于使用的上位机软件,为用户提供了便捷的设备操作和控制方式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值