#ifndef RJLINKARMH
#define RJLINKARMH
//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
typedef bool (*rjlinkOpenFunc)(void);
typedef void (*rjlinkCloseFunc)(void);
typedef bool (*rjlinkIsOpenFunc)(void);
typedef unsigned int (*rjlinkTIFSelectFunc)(int);
typedef void (*rjlinkSetSpeedFunc)(int);
typedef unsigned int (*rjlinkGetSpeedFunc)(void);
typedef void (*rjlinkResetFunc)(void);
typedef int (*rjlinkHaltFunc)(void);
typedef void (*rjlinkGoFunc)(void);
typedef int (*rjlinkReadMemFunc)(unsigned int addr, int len, void *buf);
typedef int (*rjlinkWriteMemFunc)(unsigned int addr, int len, void *buf);
typedef int (*rjlinkWriteU8Func)(unsigned int addr, unsigned char data);
typedef int (*rjlinkWriteU16Func)(unsigned int addr, unsigned short data);
typedef int (*rjlinkWriteU32Func)(unsigned int addr, unsigned int data);
typedef int (*rjlinkEraseChipFunc)(void);
typedef int (*rjlinkDownloadFileFunc)(const char *file, unsigned int addr);
typedef void (*rjlinkBeginDownloadFunc)(int index);
typedef void (*rjlinkEndDownloadFunc)(void);
typedef bool (*rjlinkExecCommandFunc)(const char* cmd, int a, int b);
typedef unsigned int (*rjlinkReadRegFunc)(int index);
typedef int (*rjlinkWriteRegFunc)(int index, unsigned int data);
typedef void (*rjlinkSetLogFileFunc)(char *file);
typedef unsigned int (*rjlinkGetDLLVersionFunc)(void);
typedef unsigned int (*rjlinkGetHardwareVersionFunc)(void);
typedef unsigned int (*rjlinkGetFirmwareStringFunc)(char *buff, int count);
typedef unsigned int (*rjlinkGetSNFunc)(void);
typedef unsigned int (*rjlinkGetIdFunc)(void);
typedef bool (*rjlinkConnectFunc)(void);
typedef bool (*rjlinkIsConnectedFunc)(void);
#endif // RJLINKARMH
private:
rjlinkOpenFunc rjlinkOpenFuncPtr = NULL;
rjlinkCloseFunc rjlinkCloseFuncPtr = NULL;
rjlinkIsOpenFunc rjlinkIsOpenFuncPtr = NULL;
rjlinkTIFSelectFunc rjlinkTIFSelectFuncPtr = NULL;
rjlinkSetSpeedFunc rjlinkSetSpeedFuncPtr = NULL;
rjlinkGetSpeedFunc rjlinkGetSpeedFuncPtr = NULL;
rjlinkResetFunc rjlinkResetFuncPtr = NULL;
rjlinkHaltFunc rjlinkHaltFuncPtr = NULL;
rjlinkGoFunc rjlinkGoFuncPtr = NULL;
rjlinkReadMemFunc rjlinkReadMemFuncPtr = NULL;
rjlinkWriteMemFunc rjlinkWriteMemFuncPtr = NULL;
rjlinkWriteU8Func rjlinkWriteU8FuncPtr = NULL;
rjlinkWriteU16Func rjlinkWriteU16FuncPtr = NULL;
rjlinkWriteU32Func rjlinkWriteU32FuncPtr = NULL;
rjlinkEraseChipFunc rjlinkEraseChipFuncPtr = NULL;
rjlinkDownloadFileFunc rjlinkDownloadFileFuncPtr = NULL;
rjlinkBeginDownloadFunc rjlinkBeginDownloadFuncPtr = NULL;
rjlinkEndDownloadFunc rjlinkEndDownloadFuncPtr = NULL;
rjlinkExecCommandFunc rjlinkExecCommandFuncPtr = NULL;
rjlinkReadRegFunc rjlinkReadRegFuncPtr = NULL;
rjlinkWriteRegFunc rjlinkWriteRegFuncPtr = NULL;
rjlinkSetLogFileFunc rjlinkSetLogFileFuncPtr = NULL;
rjlinkGetDLLVersionFunc rjlinkGetDLLVersionFuncPtr = NULL;
rjlinkGetHardwareVersionFunc rjlinkGetHardwareVersionFuncPtr = NULL;
rjlinkGetFirmwareStringFunc rjlinkGetFirmwareStringFuncPtr = NULL;
rjlinkGetSNFunc rjlinkGetSNFuncPtr = NULL;
rjlinkGetIdFunc rjlinkGetIdFuncPtr = NULL;
rjlinkConnectFunc rjlinkConnectFuncPtr = NULL;
rjlinkIsConnectedFunc rjlinkIsConnectedFuncPtr = NULL;
void RJLinkView::jlinkLibLoadHandle(void)
{
jlinkLib = new QLibrary("JLinkARM.dll");
if(jlinkLib->load())
{
rjlinkOpenFuncPtr = (rjlinkOpenFunc)jlinkLib->resolve("JLINKARM_Open"); // 打开设备
rjlinkCloseFuncPtr = (rjlinkCloseFunc)jlinkLib->resolve("JLINKARM_Close"); // 关闭设备
rjlinkIsOpenFuncPtr = (rjlinkIsOpenFunc)jlinkLib->resolve("JLINKARM_IsOpen"); // 判断设备是否打开
rjlinkTIFSelectFuncPtr = (rjlinkTIFSelectFunc)jlinkLib->resolve("JLINKARM_TIF_Select"); // 选择设备
rjlinkSetSpeedFuncPtr = (rjlinkSetSpeedFunc)jlinkLib->resolve("JLINKARM_SetSpeed"); // 设置烧录速度
rjlinkGetSpeedFuncPtr = (rjlinkGetSpeedFunc)jlinkLib->resolve("JLINKARM_GetSpeed"); // 获取烧录速度
rjlinkResetFuncPtr = (rjlinkResetFunc)jlinkLib->resolve("JLINKARM_Reset"); // 复位设备
rjlinkHaltFuncPtr = (rjlinkHaltFunc)jlinkLib->resolve("JLINKARM_Halt"); // 中断程序执行
rjlinkReadMemFuncPtr = (rjlinkReadMemFunc)jlinkLib->resolve("JLINKARM_ReadMem"); // 读取内存
rjlinkWriteMemFuncPtr = (rjlinkWriteMemFunc)jlinkLib->resolve("JLINKARM_WriteMem"); // 写入内存
rjlinkEraseChipFuncPtr = (rjlinkEraseChipFunc)jlinkLib->resolve("JLINK_EraseChip"); // 擦除芯片
rjlinkExecCommandFuncPtr = (rjlinkExecCommandFunc)jlinkLib->resolve("JLINKARM_ExecCommand"); // 执行命令
rjlinkGetDLLVersionFuncPtr = (rjlinkGetDLLVersionFunc)jlinkLib->resolve("JLINKARM_GetDLLVersion"); // 获取DLL版本号
rjlinkGetSNFuncPtr = (rjlinkGetSNFunc)jlinkLib->resolve("JLINKARM_GetSN"); // 获取sn号
rjlinkGetIdFuncPtr = (rjlinkGetIdFunc)jlinkLib->resolve("JLINKARM_GetId"); // 获取ID
rjlinkConnectFuncPtr = (rjlinkConnectFunc)jlinkLib->resolve("JLINKARM_Connect"); // 连接设备
rjlinkIsConnectedFuncPtr = (rjlinkIsConnectedFunc)jlinkLib->resolve("JLINKARM_IsConnected"); // 判断是否连接设备
}
}
bool RJLinkView::jlinkOpen(void)
{
if(rjlinkOpenFuncPtr){
return rjlinkOpenFuncPtr();
}
return false;
}
void RJLinkView::jlinkClose(void)
{
if(rjlinkCloseFuncPtr){
rjlinkCloseFuncPtr();
}
}
bool RJLinkView::jlinkIsOpen(void)
{
if(rjlinkIsOpenFuncPtr){
return rjlinkIsOpenFuncPtr();
}
return false;
}
unsigned int RJLinkView::jlinkTIFSelectFunc(int type)
{
if(rjlinkTIFSelectFuncPtr){
return rjlinkTIFSelectFuncPtr(type);
}
return false;
}
void RJLinkView::jlinkSetSpeedFunc(unsigned int speed)
{
if(rjlinkSetSpeedFuncPtr){
rjlinkSetSpeedFuncPtr(speed);
}
}
unsigned int RJLinkView::jlinkGetSpeedFunc(void)
{
if(rjlinkGetSpeedFuncPtr){
return rjlinkGetSpeedFuncPtr();
}
return 0;
}
void RJLinkView::jlinkResetFunc(void)
{
if(rjlinkResetFuncPtr){
rjlinkResetFuncPtr();
}
}
int RJLinkView::jlinkHaltFunc(void)
{
if(rjlinkHaltFuncPtr){
return rjlinkHaltFuncPtr();
}
return 0;
}
int RJLinkView::jlinkReadMemFunc(unsigned int addr, int len, void *buf)
{
if(rjlinkReadMemFuncPtr){
return rjlinkReadMemFuncPtr(addr, len, buf);
}
return 0;
}
int RJLinkView::jlinkWriteMemFunc(unsigned int addr, int len, void *buf)
{
if(rjlinkWriteMemFuncPtr){
return rjlinkWriteMemFuncPtr(addr, len, buf);
}
return 0;
}
int RJLinkView::jlinkEraseChipFunc(void)
{
if(rjlinkEraseChipFuncPtr){
return rjlinkEraseChipFuncPtr();
}
return 0;
}
bool RJLinkView::jlinkExecCommandFunc(const char *cmd, int a, int b)
{
if(rjlinkExecCommandFuncPtr){
return rjlinkExecCommandFuncPtr(cmd, a, b);
}
return false;
}
unsigned int RJLinkView::jlinkGetDLLVersionFunc(void)
{
if(rjlinkGetDLLVersionFuncPtr){
return rjlinkGetDLLVersionFuncPtr();
}
return 0;
}
unsigned int RJLinkView::jlinkGetSNFunc(void)
{
if(rjlinkGetSNFuncPtr){
return rjlinkGetSNFuncPtr();
}
return 0;
}
unsigned int RJLinkView::jlinkGetIdFunc(void)
{
if(rjlinkGetIdFuncPtr){
return rjlinkGetIdFuncPtr();
}
return 0;
}
bool RJLinkView::jlinkConnectFunc(void)
{
if(rjlinkConnectFuncPtr){
return rjlinkConnectFuncPtr();
}
return false;
}
bool RJLinkView::jlinkIsConnectedFunc(void)
{
if(rjlinkIsConnectedFuncPtr){
return rjlinkIsConnectedFuncPtr();
}
return false;
}
void RJLinkView::infoShowHandle(QString info)
{
QString timestamp = QDateTime::currentDateTime().toString("[hh:mm:ss.zzz]==> ");
ui->burnInfoTextBrowser->append(timestamp + info);
}
bool RJLinkView::jlinkConnectHandle(void)
{
if(jlinkIsOpen())
{
infoShowHandle(tr("设备连接成功"));
return true;
}
jlinkOpen();
if(jlinkIsOpen())
{
jlinkExecCommandFunc("device = STM32F407IG", 0, 0);
jlinkTIFSelectFunc(JLINKARM_TIF_SWD);
jlinkSetSpeedFunc(4000);
jlinkConnectFunc();
if(jlinkIsConnectedFunc()){
infoShowHandle(tr("设备连接成功"));
return true;
}else
{
infoShowHandle(tr("连接设备失败! 请检查设备连接..."));
}
}
else
{
infoShowHandle(tr("连接设备失败! 请检查烧录器连接..."));
}
return false;
}
void RJLinkView::jlinkdisconnectHandle(void)
{
jlinkClose();
if(!jlinkIsOpen())
{
infoShowHandle(tr("断开设备成功!"));
}
else {
infoShowHandle(tr("断开设备失败..."));
}
}
QString RJLinkView::jlinkGetCpuIdHandle(void)
{
unsigned char cpuId[12]={0};
char cpuIdTemp[128]={0};
jlinkReadMemFunc(0x1FFF7A10, 12, cpuId);
sprintf(cpuIdTemp, "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X%02X",
cpuId[3], cpuId[2], cpuId[1], cpuId[0],
cpuId[7], cpuId[6], cpuId[5], cpuId[4],
cpuId[11], cpuId[10], cpuId[9], cpuId[8]);
return QString(cpuIdTemp);
}
void RJLinkView::on_fwFilePathSelectPushButton_clicked()
{
QString fwFileName = QFileDialog::getOpenFileName(this, "Firmware file", QCoreApplication::applicationDirPath(), "fw file(*.bin)");
ui->fwFilePathLineEdit->setText(fwFileName);
}
void RJLinkView::on_cleanInfoPushButton_clicked()
{
ui->burnInfoTextBrowser->clear();
}
void RJLinkView::on_getCpuIdPushButton_clicked()
{
if(jlinkConnectHandle())
{
infoShowHandle(tr("获取CPU ID中,请稍后..."));
infoShowHandle(tr("获取CPUID成功: ") + jlinkGetCpuIdHandle());
jlinkdisconnectHandle();
}
}
void RJLinkView::on_clearFlashPushButton_clicked()
{
if(jlinkConnectHandle())
{
infoShowHandle(tr("擦除flash中,请稍后..."));
jlinkEraseChipFunc();
infoShowHandle(tr("擦除flash成功!"));
jlinkdisconnectHandle();
}
}
void RJLinkView::on_burnPushButton_clicked()
{
bool burnAddrIsOk = false;
QFile burnFile;
burnFileSize = 0;
burnFileContent.clear();
if(ui->fwFilePathLineEdit->text() == tr(""))
{
infoShowHandle(tr("请选择要烧录的固件!"));
return;
}
if(jlinkConnectHandle())
{
burnAddr = ui->burnAddrLineEdit->text().trimmed().toInt(&burnAddrIsOk, 16);
if(!burnAddrIsOk)
{
infoShowHandle(tr("烧录起始地址格式有误,请正确输入地址..."));
jlinkdisconnectHandle();
return;
}
burnFile.setFileName(ui->fwFilePathLineEdit->text());
burnFile.open(QIODevice::ReadOnly);
if(burnFile.isOpen())
{
burnFileContent = burnFile.readAll();
burnFileSize = burnFileContent.size();
burnFile.close();
infoShowHandle(tr("开始烧录固件, 请稍后..."));
burnFileTimer->start(RJLINK_BURN_TIME_INTERVAL);
}
else
{
infoShowHandle(tr("烧录固件打开失败,请检查文件是否存在..."));
jlinkdisconnectHandle();
}
}
}
void RJLinkView::burnFileTimerHandle(void)
{
int burnPercent = 0;
if(burnFileTimer)
{
burnFileTimer->stop();
if(burnFileContent.isEmpty())
{
ui->burnProgressBar->setValue(100);
jlinkdisconnectHandle();
infoShowHandle(tr("烧录完成!"));
return;
}
else
{
if(burnFileContent.size() > RJLINK_BURN_CONTENT_SIZE) // 每次搬运1K数据
{
jlinkWriteMemFunc(burnAddr, RJLINK_BURN_CONTENT_SIZE, burnFileContent.data());
burnAddr += RJLINK_BURN_CONTENT_SIZE;
burnFileContent.remove(0, RJLINK_BURN_CONTENT_SIZE);
}
else
{
jlinkWriteMemFunc(burnAddr, burnFileContent.size(), burnFileContent.data());
burnAddr += burnFileContent.size();
burnFileContent.clear();
}
burnPercent = (burnFileSize - burnFileContent.size()) * 100 / burnFileSize;
ui->burnProgressBar->setValue(burnPercent);
burnFileTimer->start(RJLINK_BURN_TIME_INTERVAL);
}
}
}
本文分享自 Rice 嵌入式开发技术分享 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!