在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

QT編寫一個JLINK燒錄工具

Rice嵌入式開發技術分享 ? 來源:Rice 嵌入式開發技術分享 ? 作者:Rice 嵌入式開發技 ? 2023-01-09 11:53 ? 次閱讀

概述

作者一直有一個想法,就是寫一個功能強大的桌面小工具,里面集成各種平時開發要用的工具。例如:串口助手,網絡助手,下載工具等。那么如何也帶來幾個問題:

問題1:那么如何呈現在桌面上也是一個非常重要的問題 -- 桌面懸浮窗。

問題2:工具的名字 -- RTOOL(米飯工具)

問題3:是否貢獻整個工具 -- 分為兩個版本:開源版本和公司項目版本(已經發布了V1.0版本)。

236e849e-8fd1-11ed-92c9-dac502259ad0.png

本篇文章介紹RTOOL的JLINK燒錄小工具,那為什么要在RTOOL中集成JLINK的燒錄工具呢?原因:

MCU,我們如果使用GCC構建我們的程序后,沒有IDE的支撐,就需要使用JFLASH這樣的工具進行燒錄,這個操作流程還是挺多步驟的。

2385c492-8fd1-11ed-92c9-dac502259ad0.png

方便我們對固件進行動手術,如對固件進行加密處理,對芯片ram,flash進行隨心所欲的操作。

原理說明

我們在使用JFlash燒錄工具時,實際JFlash是通過調用JLinkARM.dll動態庫提供的接口進行操作的。那么我們可以通過Dependency walker對JLinkARM.dll進行分析。獲取到dll庫中所有函數符號。

23930238-8fd1-11ed-92c9-dac502259ad0.png

QT提供了QLibrary類可以動態加載dll,所以結合獲取的函數符號,我們可以定義一些列函數指針指向對應的符號。

239f7d6a-8fd1-11ed-92c9-dac502259ad0.png

開發流程

UI設計,實際可以很簡單,目的也是簡化JFlash的操作流程:

2482e8c0-8fd1-11ed-92c9-dac502259ad0.png

定義對接動態庫JLinkARM.dll的一系列函數指針,頭文件RJlinkARM.h:

#ifndefRJLINKARMH
#defineRJLINKARMH

//JLINKTIF
#defineJLINKARM_TIF_JTAG0
#defineJLINKARM_TIF_SWD1
#defineJLINKARM_TIF_DBM32
#defineJLINKARM_TIF_FINE3
#defineJLINKARM_TIF_2wire_JTAG_PIC324

//RESETTYPE
#defineJLINKARM_RESET_TYPE_NORMAL0
#defineJLINKARM_RESET_TYPE_CORE1
#defineJLINKARM_RESET_TYPE_PIN2

typedefbool(*rjlinkOpenFunc)(void);
typedefvoid(*rjlinkCloseFunc)(void);
typedefbool(*rjlinkIsOpenFunc)(void);
typedefunsignedint(*rjlinkTIFSelectFunc)(int);
typedefvoid(*rjlinkSetSpeedFunc)(int);
typedefunsignedint(*rjlinkGetSpeedFunc)(void);
typedefvoid(*rjlinkResetFunc)(void);
typedefint(*rjlinkHaltFunc)(void);
typedefvoid(*rjlinkGoFunc)(void);

typedefint(*rjlinkReadMemFunc)(unsignedintaddr,intlen,void*buf);
typedefint(*rjlinkWriteMemFunc)(unsignedintaddr,intlen,void*buf);
typedefint(*rjlinkWriteU8Func)(unsignedintaddr,unsignedchardata);
typedefint(*rjlinkWriteU16Func)(unsignedintaddr,unsignedshortdata);
typedefint(*rjlinkWriteU32Func)(unsignedintaddr,unsignedintdata);

typedefint(*rjlinkEraseChipFunc)(void);
typedefint(*rjlinkDownloadFileFunc)(constchar*file,unsignedintaddr);
typedefvoid(*rjlinkBeginDownloadFunc)(intindex);
typedefvoid(*rjlinkEndDownloadFunc)(void);
typedefbool(*rjlinkExecCommandFunc)(constchar*cmd,inta,intb);

typedefunsignedint(*rjlinkReadRegFunc)(intindex);
typedefint(*rjlinkWriteRegFunc)(intindex,unsignedintdata);

typedefvoid(*rjlinkSetLogFileFunc)(char*file);
typedefunsignedint(*rjlinkGetDLLVersionFunc)(void);
typedefunsignedint(*rjlinkGetHardwareVersionFunc)(void);
typedefunsignedint(*rjlinkGetFirmwareStringFunc)(char*buff,intcount);
typedefunsignedint(*rjlinkGetSNFunc)(void);
typedefunsignedint(*rjlinkGetIdFunc)(void);
typedefbool(*rjlinkConnectFunc)(void);
typedefbool(*rjlinkIsConnectedFunc)(void);

#endif//RJLINKARMH

通過QT提供了QLibrary類加載dll,然后函數指針指向對應的函數符號:

通過頭文件RJlinkARM.h定義的函數指針類型定義對應的變量:

private:
rjlinkOpenFuncrjlinkOpenFuncPtr=NULL;
rjlinkCloseFuncrjlinkCloseFuncPtr=NULL;
rjlinkIsOpenFuncrjlinkIsOpenFuncPtr=NULL;
rjlinkTIFSelectFuncrjlinkTIFSelectFuncPtr=NULL;
rjlinkSetSpeedFuncrjlinkSetSpeedFuncPtr=NULL;
rjlinkGetSpeedFuncrjlinkGetSpeedFuncPtr=NULL;
rjlinkResetFuncrjlinkResetFuncPtr=NULL;
rjlinkHaltFuncrjlinkHaltFuncPtr=NULL;
rjlinkGoFuncrjlinkGoFuncPtr=NULL;
rjlinkReadMemFuncrjlinkReadMemFuncPtr=NULL;
rjlinkWriteMemFuncrjlinkWriteMemFuncPtr=NULL;
rjlinkWriteU8FuncrjlinkWriteU8FuncPtr=NULL;
rjlinkWriteU16FuncrjlinkWriteU16FuncPtr=NULL;
rjlinkWriteU32FuncrjlinkWriteU32FuncPtr=NULL;
rjlinkEraseChipFuncrjlinkEraseChipFuncPtr=NULL;
rjlinkDownloadFileFuncrjlinkDownloadFileFuncPtr=NULL;
rjlinkBeginDownloadFuncrjlinkBeginDownloadFuncPtr=NULL;
rjlinkEndDownloadFuncrjlinkEndDownloadFuncPtr=NULL;
rjlinkExecCommandFuncrjlinkExecCommandFuncPtr=NULL;
rjlinkReadRegFuncrjlinkReadRegFuncPtr=NULL;
rjlinkWriteRegFuncrjlinkWriteRegFuncPtr=NULL;
rjlinkSetLogFileFuncrjlinkSetLogFileFuncPtr=NULL;
rjlinkGetDLLVersionFuncrjlinkGetDLLVersionFuncPtr=NULL;
rjlinkGetHardwareVersionFuncrjlinkGetHardwareVersionFuncPtr=NULL;
rjlinkGetFirmwareStringFuncrjlinkGetFirmwareStringFuncPtr=NULL;
rjlinkGetSNFuncrjlinkGetSNFuncPtr=NULL;
rjlinkGetIdFuncrjlinkGetIdFuncPtr=NULL;
rjlinkConnectFuncrjlinkConnectFuncPtr=NULL;
rjlinkIsConnectedFuncrjlinkIsConnectedFuncPtr=NULL;

通過動態庫(JLinkARM.dll)獲取對應的函數指針

voidRJLinkView::jlinkLibLoadHandle(void)
{
jlinkLib=newQLibrary("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");//判斷是否連接設備
}
}

上述的函數指針,其實對訪問操作一點也不友好,所以通過類方法重新對其封裝,也避免的空指針的訪問:

boolRJLinkView::jlinkOpen(void)
{
if(rjlinkOpenFuncPtr){
returnrjlinkOpenFuncPtr();
}
returnfalse;
}
voidRJLinkView::jlinkClose(void)
{
if(rjlinkCloseFuncPtr){
rjlinkCloseFuncPtr();
}
}
boolRJLinkView::jlinkIsOpen(void)
{
if(rjlinkIsOpenFuncPtr){
returnrjlinkIsOpenFuncPtr();
}
returnfalse;
}
unsignedintRJLinkView::jlinkTIFSelectFunc(inttype)
{
if(rjlinkTIFSelectFuncPtr){
returnrjlinkTIFSelectFuncPtr(type);
}
returnfalse;
}
voidRJLinkView::jlinkSetSpeedFunc(unsignedintspeed)
{
if(rjlinkSetSpeedFuncPtr){
rjlinkSetSpeedFuncPtr(speed);
}
}
unsignedintRJLinkView::jlinkGetSpeedFunc(void)
{
if(rjlinkGetSpeedFuncPtr){
returnrjlinkGetSpeedFuncPtr();
}
return0;
}
voidRJLinkView::jlinkResetFunc(void)
{
if(rjlinkResetFuncPtr){
rjlinkResetFuncPtr();
}
}
intRJLinkView::jlinkHaltFunc(void)
{
if(rjlinkHaltFuncPtr){
returnrjlinkHaltFuncPtr();
}
return0;
}
intRJLinkView::jlinkReadMemFunc(unsignedintaddr,intlen,void*buf)
{
if(rjlinkReadMemFuncPtr){
returnrjlinkReadMemFuncPtr(addr,len,buf);
}
return0;
}
intRJLinkView::jlinkWriteMemFunc(unsignedintaddr,intlen,void*buf)
{
if(rjlinkWriteMemFuncPtr){
returnrjlinkWriteMemFuncPtr(addr,len,buf);
}
return0;
}
intRJLinkView::jlinkEraseChipFunc(void)
{
if(rjlinkEraseChipFuncPtr){
returnrjlinkEraseChipFuncPtr();
}
return0;
}
boolRJLinkView::jlinkExecCommandFunc(constchar*cmd,inta,intb)
{
if(rjlinkExecCommandFuncPtr){
returnrjlinkExecCommandFuncPtr(cmd,a,b);
}
returnfalse;
}
unsignedintRJLinkView::jlinkGetDLLVersionFunc(void)
{
if(rjlinkGetDLLVersionFuncPtr){
returnrjlinkGetDLLVersionFuncPtr();
}
return0;
}
unsignedintRJLinkView::jlinkGetSNFunc(void)
{
if(rjlinkGetSNFuncPtr){
returnrjlinkGetSNFuncPtr();
}
return0;
}
unsignedintRJLinkView::jlinkGetIdFunc(void)
{
if(rjlinkGetIdFuncPtr){
returnrjlinkGetIdFuncPtr();
}
return0;
}
boolRJLinkView::jlinkConnectFunc(void)
{
if(rjlinkConnectFuncPtr){
returnrjlinkConnectFuncPtr();
}
returnfalse;
}
boolRJLinkView::jlinkIsConnectedFunc(void)
{
if(rjlinkIsConnectedFuncPtr){
returnrjlinkIsConnectedFuncPtr();
}
returnfalse;
}

下載信息窗體的顯示格式設置,為了方便預覽我們的操作步驟,所以規定一個顯示格式,增加時間戳的顯示:

voidRJLinkView::infoShowHandle(QStringinfo)
{
QStringtimestamp=QDateTime::currentDateTime().toString("[hhss.zzz]==>");
ui->burnInfoTextBrowser->append(timestamp+info);
}

連接芯片設備,以下是按照STM32F407IG為例,下載方式采用SWD,下載速度未4000kHz:

boolRJLinkView::jlinkConnectHandle(void)
{
if(jlinkIsOpen())
{
infoShowHandle(tr("設備連接成功"));
returntrue;
}
jlinkOpen();
if(jlinkIsOpen())
{
jlinkExecCommandFunc("device=STM32F407IG",0,0);
jlinkTIFSelectFunc(JLINKARM_TIF_SWD);
jlinkSetSpeedFunc(4000);
jlinkConnectFunc();
if(jlinkIsConnectedFunc()){
infoShowHandle(tr("設備連接成功"));
returntrue;
}else
{
infoShowHandle(tr("連接設備失敗!請檢查設備連接..."));
}
}
else
{
infoShowHandle(tr("連接設備失敗!請檢查燒錄器連接..."));
}
returnfalse;
}

斷開芯片設備:

voidRJLinkView::jlinkdisconnectHandle(void)
{
jlinkClose();
if(!jlinkIsOpen())
{
infoShowHandle(tr("斷開設備成功!"));
}
else{
infoShowHandle(tr("斷開設備失敗..."));
}
}

獲取CPU ID,原理其實很簡單,通過讀取對應UUID寄存器,就可以獲取過去到芯片的UUID

QStringRJLinkView::jlinkGetCpuIdHandle(void)
{
unsignedcharcpuId[12]={0};
charcpuIdTemp[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]);
returnQString(cpuIdTemp);
}

選擇固件按鈕實現,這里指定了文件后綴為.bin格式:

voidRJLinkView::on_fwFilePathSelectPushButton_clicked()
{
QStringfwFileName=QFileDialog::getOpenFileName(this,"Firmwarefile",QCoreApplication::applicationDirPath(),"fwfile(*.bin)");
ui->fwFilePathLineEdit->setText(fwFileName);
}

清除信息顯示窗體按鈕實現:

voidRJLinkView::on_cleanInfoPushButton_clicked()
{
ui->burnInfoTextBrowser->clear();
}

獲取芯片ID按鈕實現,需要先連接上設備,然后調用jlinkGetCpuIdHandle方案獲取ID之后,斷開連接:

voidRJLinkView::on_getCpuIdPushButton_clicked()
{
if(jlinkConnectHandle())
{
infoShowHandle(tr("獲取CPUID中,請稍后..."));
infoShowHandle(tr("獲取CPUID成功:")+jlinkGetCpuIdHandle());
jlinkdisconnectHandle();
}
}

同理,擦除flash也是要先連接上設備,然后通過調用jlinkEraseChipFunc方法進行擦除之后,斷開連接:

voidRJLinkView::on_clearFlashPushButton_clicked()
{
if(jlinkConnectHandle())
{
infoShowHandle(tr("擦除flash中,請稍后..."));
jlinkEraseChipFunc();
infoShowHandle(tr("擦除flash成功!"));
jlinkdisconnectHandle();
}
}

一鍵燒錄按鈕原理,獲取固件內容存儲到一個緩沖區中,然后啟動一個定時器,然后將固件內容搬運到對應的Flash區域:

voidRJLinkView::on_burnPushButton_clicked()
{
boolburnAddrIsOk=false;
QFileburnFile;

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();
}
}
}

定時器處理函數,每次燒錄從緩沖區提取1k數據進行燒錄:

voidRJLinkView::burnFileTimerHandle(void)
{
intburnPercent=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);
}
}
}

演示實例

獲取CPU ID演示,點擊"獲取CPU ID"按鈕,在顯示窗體便可以看到對應的ID:

2491f798-8fd1-11ed-92c9-dac502259ad0.png

擦除flash演示,點擊"擦除flash"按鈕,會調用SEGGER應用,然后進行flash擦除:

24a6ad50-8fd1-11ed-92c9-dac502259ad0.png

燒錄程序,點擊"一鍵燒錄"按鈕,同樣會調用SEGGER應用,然后進行燒錄:

24b1697a-8fd1-11ed-92c9-dac502259ad0.png24bb2ff0-8fd1-11ed-92c9-dac502259ad0.png

審核編輯hhy

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 芯片
    +關注

    關注

    456

    文章

    51157

    瀏覽量

    426558
  • Qt
    Qt
    +關注

    關注

    1

    文章

    308

    瀏覽量

    38039
  • 燒錄
    +關注

    關注

    8

    文章

    266

    瀏覽量

    35692
收藏 人收藏

    評論

    相關推薦

    嵌入式Qt-動手編寫并運行自己的第1ARM-Qt程序

    本篇詳細介紹了如何自己編寫Qt程序,如何通過交叉編譯,最終放到開發板中執行的過程。
    的頭像 發表于 06-02 09:06 ?8654次閱讀
    嵌入式<b class='flag-5'>Qt</b>-動手<b class='flag-5'>編寫</b>并運行自己的第1<b class='flag-5'>個</b>ARM-<b class='flag-5'>Qt</b>程序

    編寫一個QT程序

    學習種編程語言或編程環境,通常會先編寫“Hello World”程序。我們也用 Qt Creator
    發表于 11-21 10:41 ?1051次閱讀

    MCU_JLINK的相關資料推薦

    MCU_JLINK批處理腳本燒錄工具-JFlash關于JLINK升級燒錄腳本指令指令解釋合理的創建標題,有助于目錄的生成如何改變文本的樣式插
    發表于 01-26 06:43

    JLINK-V8固件及燒錄指導教程

    J-link 是使用過程中,如果內部固件意外損壞或丟失,請參考下面操作步驟說明,重新燒錄Jlink固件。
    發表于 01-08 16:20 ?24次下載

    qt編寫的觸摸小鍵盤

    使用qt5編寫qt程序小鍵盤,對于qLineedit的重寫
    發表于 03-03 15:06 ?7次下載

    Qt圖形編程基礎之使用Qt編寫“Hello,World”程序實驗

    分享到:標簽:Qt圖形編程 Linux 操作系統 12.3 實驗內容使用Qt編寫Hello,World程序 1.實驗目的 通過編寫
    發表于 10-18 14:44 ?1次下載
    <b class='flag-5'>Qt</b>圖形編程基礎之使用<b class='flag-5'>Qt</b><b class='flag-5'>編寫</b>“Hello,World”程序實驗

    stm32怎么燒錄程序

    STM32燒錄程序目前筆者知道的有三種:JLink ,Ulink和串口燒錄,使用工具分別為:JLink,ULink以及USB轉TTL線。
    的頭像 發表于 11-16 16:09 ?8.2w次閱讀

    使用Qt編寫的串口調試工具的應用程序和源代碼資料免費下載

    本文檔的主要內容詳細介紹的是使用qt編寫的串口調試工具的應用程序和源代碼資料免費下載。
    發表于 12-18 08:00 ?83次下載
    使用<b class='flag-5'>Qt</b><b class='flag-5'>編寫</b>的串口調試<b class='flag-5'>工具</b>的應用程序和源代碼資料免費下載

    QT 編寫 STC系列MCU燒錄軟件

    由于產品上用到了STC的單片機,而需要自行寫燒錄軟件,該軟件可以實現STC系列MCU文件的燒錄。本軟件最終取自開源的庫,因此感謝為開源無私奉獻的人們!
    發表于 10-25 20:36 ?17次下載
    <b class='flag-5'>QT</b> <b class='flag-5'>編寫</b> STC系列MCU<b class='flag-5'>燒錄</b>軟件

    jlink燒錄軟件_使用 MCU BootUtility 工具燒錄I.MXRT

    使用MDK/MCUXpresso IDE/IAR工具編譯生成燒錄固件文件。使用MCU BootUtility來加載hex文件或者bin文件或者是.srec文件進行站式燒錄。默認情況下
    發表于 10-28 20:36 ?10次下載
    <b class='flag-5'>jlink</b><b class='flag-5'>燒錄</b>軟件_使用 MCU BootUtility <b class='flag-5'>工具</b>來<b class='flag-5'>燒錄</b>I.MXRT

    單片機程序生產燒錄工具

    背景:有的公司在生產時做單片機軟件燒錄,工人不會操作JFlash,就自己寫簡單版本的生產用的軟件燒錄工具。環境:Visual Studi
    發表于 11-23 17:36 ?12次下載
    單片機程序生產<b class='flag-5'>燒錄</b><b class='flag-5'>工具</b>

    使用MCUXpresso直接燒錄hex文件

    這里介紹種使用不需要源代碼燒錄hex文件的方法。打開MCUXpresso軟件,并新建工程(工程的芯片選型要和需要燒錄的芯片型號
    發表于 12-07 12:51 ?8次下載
    使用MCUXpresso直接<b class='flag-5'>燒錄</b>hex文件

    AN017 基于Jlink燒錄文件到SPI Nor Flash的方法

    AN017 基于Jlink燒錄文件到SPI Nor Flash的方法
    發表于 02-27 18:21 ?0次下載
    AN017 基于<b class='flag-5'>Jlink</b><b class='flag-5'>燒錄</b>文件到SPI Nor Flash的方法

    手把手教你編寫上位機

    本次來教大家編寫基于QT的簡單的上位機。 學習新的東西我們都從最基礎地實例開始,比如學
    發表于 05-08 10:36 ?1次下載
    手把手教你<b class='flag-5'>編寫</b><b class='flag-5'>一</b><b class='flag-5'>個</b>上位機

    QT|編寫簡單的上位機

    QT | 編寫簡單的上位機 時間 :2023-03-19文章目錄QT | 編寫
    發表于 05-08 10:12 ?3次下載
    <b class='flag-5'>QT</b>|<b class='flag-5'>編寫</b><b class='flag-5'>一</b><b class='flag-5'>個</b>簡單的上位機
    主站蜘蛛池模板: 人人看人人看人做人人模 | 奇米影视9999 | 亚洲综合五月天婷 | 久久riav国产精品 | 一级女人毛片人一女人 | 欧美美女福利视频 | 久久精品男人影院 | 日本黄色一级网站 | 成人sese| 亚洲成av人影片在线观看 | 色天使亚洲综合在线观看 | 国产成人精品1024在线 | 丁香网五月天 | 国产精品手机在线 | 国产欧美精品一区二区色综合 | 男人扒开美女尿口无遮挡图片 | 你懂的网址在线观看 | 瑟瑟网站免费 | 视色4se视频在线观看 | 韩国理伦片在线观看2828 | 久久99久久精品国产99热 | 久久青草免费免费91线频观看 | 女人爽到喷水的视频大全在线观看 | 国产小片 | 久久精品视频国产 | tube69hdxxxx日本| 日本黄色爽 | 在线三区| 欧美性生活网站 | 午夜在线免费观看 | 国产成人精品1024在线 | 免费午夜不卡毛片 | 69久久夜色精品国产69小说 | 激情欧美一区二区三区中文字幕 | 国产女同在线观看 | 国产农村三片免费网站 | 亚洲国产精品久久久久婷婷老年 | 久久女同 | 亚洲三级在线看 | 人人揉人人爽五月天视频 | 日韩毛片免费线上观看 |