chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

介紹RTOOL的JLINK燒錄小工具

jf_NsPBt3VS ? 來(lái)源:風(fēng)火輪技術(shù)團(tuán)隊(duì) ? 2023-01-03 11:16 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

概述

作者一直有一個(gè)想法,就是寫(xiě)一個(gè)功能強(qiáng)大的桌面小工具,里面集成各種平時(shí)開(kāi)發(fā)要用的工具。例如:串口助手,網(wǎng)絡(luò)助手,下載工具等。那么如何也帶來(lái)幾個(gè)問(wèn)題:

問(wèn)題1:那么如何呈現(xiàn)在桌面上也是一個(gè)非常重要的問(wèn)題 -- 桌面懸浮窗。

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

問(wèn)題3:是否貢獻(xiàn)整個(gè)工具 -- 分為兩個(gè)版本:開(kāi)源版本和公司項(xiàng)目版本(已經(jīng)發(fā)布了V1.0版本)。

adb589ba-8985-11ed-bfe3-dac502259ad0.png

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

MCU,我們?nèi)绻褂肎CC構(gòu)建我們的程序后,沒(méi)有IDE的支撐,就需要使用JFLASH這樣的工具進(jìn)行燒錄,這個(gè)操作流程還是挺多步驟的。

adcca8e8-8985-11ed-bfe3-dac502259ad0.png

方便我們對(duì)固件進(jìn)行動(dòng)手術(shù),如對(duì)固件進(jìn)行加密處理,對(duì)芯片ram,flash進(jìn)行隨心所欲的操作。

原理說(shuō)明

我們?cè)谑褂肑Flash燒錄工具時(shí),實(shí)際JFlash是通過(guò)調(diào)用JLinkARM.dll動(dòng)態(tài)庫(kù)提供的接口進(jìn)行操作的。

那么我們可以通過(guò)Dependency walker對(duì)JLinkARM.dll進(jìn)行分析。獲取到dll庫(kù)中所有函數(shù)符號(hào)。

ade826a4-8985-11ed-bfe3-dac502259ad0.png

QT提供了QLibrary類(lèi)可以動(dòng)態(tài)加載dll,所以結(jié)合獲取的函數(shù)符號(hào),我們可以定義一些列函數(shù)指針指向?qū)?yīng)的符號(hào)。

ae047d68-8985-11ed-bfe3-dac502259ad0.png

開(kāi)發(fā)流程

UI設(shè)計(jì),實(shí)際可以很簡(jiǎn)單,目的也是簡(jiǎn)化JFlash的操作流程:

ae300320-8985-11ed-bfe3-dac502259ad0.png

定義對(duì)接動(dòng)態(tài)庫(kù)JLinkARM.dll的一系列函數(shù)指針,頭文件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

通過(guò)QT提供了QLibrary類(lèi)加載dll,然后函數(shù)指針指向?qū)?yīng)的函數(shù)符號(hào):

通過(guò)頭文件RJlinkARM.h定義的函數(shù)指針類(lèi)型定義對(duì)應(yīng)的變量:

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;

通過(guò)動(dòng)態(tài)庫(kù)(JLinkARM.dll)獲取對(duì)應(yīng)的函數(shù)指針

voidRJLinkView::jlinkLibLoadHandle(void)
{
jlinkLib=newQLibrary("JLinkARM.dll");
if(jlinkLib->load())
{
rjlinkOpenFuncPtr=(rjlinkOpenFunc)jlinkLib->resolve("JLINKARM_Open");//打開(kāi)設(shè)備
rjlinkCloseFuncPtr=(rjlinkCloseFunc)jlinkLib->resolve("JLINKARM_Close");//關(guān)閉設(shè)備
rjlinkIsOpenFuncPtr=(rjlinkIsOpenFunc)jlinkLib->resolve("JLINKARM_IsOpen");//判斷設(shè)備是否打開(kāi)
rjlinkTIFSelectFuncPtr=(rjlinkTIFSelectFunc)jlinkLib->resolve("JLINKARM_TIF_Select");//選擇設(shè)備
rjlinkSetSpeedFuncPtr=(rjlinkSetSpeedFunc)jlinkLib->resolve("JLINKARM_SetSpeed");//設(shè)置燒錄速度
rjlinkGetSpeedFuncPtr=(rjlinkGetSpeedFunc)jlinkLib->resolve("JLINKARM_GetSpeed");//獲取燒錄速度
rjlinkResetFuncPtr=(rjlinkResetFunc)jlinkLib->resolve("JLINKARM_Reset");//復(fù)位設(shè)備
rjlinkHaltFuncPtr=(rjlinkHaltFunc)jlinkLib->resolve("JLINKARM_Halt");//中斷程序執(zhí)行
rjlinkReadMemFuncPtr=(rjlinkReadMemFunc)jlinkLib->resolve("JLINKARM_ReadMem");//讀取內(nèi)存
rjlinkWriteMemFuncPtr=(rjlinkWriteMemFunc)jlinkLib->resolve("JLINKARM_WriteMem");//寫(xiě)入內(nèi)存
rjlinkEraseChipFuncPtr=(rjlinkEraseChipFunc)jlinkLib->resolve("JLINK_EraseChip");//擦除芯片
rjlinkExecCommandFuncPtr=(rjlinkExecCommandFunc)jlinkLib->resolve("JLINKARM_ExecCommand");//執(zhí)行命令
rjlinkGetDLLVersionFuncPtr=(rjlinkGetDLLVersionFunc)jlinkLib->resolve("JLINKARM_GetDLLVersion");//獲取DLL版本號(hào)
rjlinkGetSNFuncPtr=(rjlinkGetSNFunc)jlinkLib->resolve("JLINKARM_GetSN");//獲取sn號(hào)
rjlinkGetIdFuncPtr=(rjlinkGetIdFunc)jlinkLib->resolve("JLINKARM_GetId");//獲取ID
rjlinkConnectFuncPtr=(rjlinkConnectFunc)jlinkLib->resolve("JLINKARM_Connect");//連接設(shè)備
rjlinkIsConnectedFuncPtr=(rjlinkIsConnectedFunc)jlinkLib->resolve("JLINKARM_IsConnected");//判斷是否連接設(shè)備
}
}

上述的函數(shù)指針,其實(shí)對(duì)訪問(wèn)操作一點(diǎn)也不友好,所以通過(guò)類(lèi)方法重新對(duì)其封裝,也避免的空指針的訪問(wèn):

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

下載信息窗體的顯示格式設(shè)置,為了方便預(yù)覽我們的操作步驟,所以規(guī)定一個(gè)顯示格式,增加時(shí)間戳的顯示:

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

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

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

斷開(kāi)芯片設(shè)備:

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

獲取CPU ID,原理其實(shí)很簡(jiǎn)單,通過(guò)讀取對(duì)應(yīng)UUID寄存器,就可以獲取過(guò)去到芯片的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);
}

選擇固件按鈕實(shí)現(xiàn),這里指定了文件后綴為.bin格式:

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

清除信息顯示窗體按鈕實(shí)現(xiàn):

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

獲取芯片ID按鈕實(shí)現(xiàn),需要先連接上設(shè)備,然后調(diào)用jlinkGetCpuIdHandle方案獲取ID之后,斷開(kāi)連接:

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

同理,擦除flash也是要先連接上設(shè)備,然后通過(guò)調(diào)用jlinkEraseChipFunc方法進(jìn)行擦除之后,斷開(kāi)連接:

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

一鍵燒錄按鈕原理,獲取固件內(nèi)容存儲(chǔ)到一個(gè)緩沖區(qū)中,然后啟動(dòng)一個(gè)定時(shí)器,然后將固件內(nèi)容搬運(yùn)到對(duì)應(yīng)的Flash區(qū)域:

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

burnFileSize=0;
burnFileContent.clear();

if(ui->fwFilePathLineEdit->text()==tr(""))
{
infoShowHandle(tr("請(qǐng)選擇要燒錄的固件!"));
return;
}

if(jlinkConnectHandle())
{
burnAddr=ui->burnAddrLineEdit->text().trimmed().toInt(&burnAddrIsOk,16);
if(!burnAddrIsOk)
{
infoShowHandle(tr("燒錄起始地址格式有誤,請(qǐng)正確輸入地址..."));
jlinkdisconnectHandle();
return;
}
burnFile.setFileName(ui->fwFilePathLineEdit->text());
burnFile.open(QIODevice::ReadOnly);
if(burnFile.isOpen())
{
burnFileContent=burnFile.readAll();
burnFileSize=burnFileContent.size();
burnFile.close();

infoShowHandle(tr("開(kāi)始燒錄固件,請(qǐng)稍后..."));

burnFileTimer->start(RJLINK_BURN_TIME_INTERVAL);
}
else
{
infoShowHandle(tr("燒錄固件打開(kāi)失敗,請(qǐng)檢查文件是否存在..."));
jlinkdisconnectHandle();
}
}
}

定時(shí)器處理函數(shù),每次燒錄從緩沖區(qū)提取1k數(shù)據(jù)進(jìn)行燒錄:

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)//每次搬運(yùn)1K數(shù)據(jù)
{
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);
}
}
}

演示實(shí)例

獲取CPU ID演示,點(diǎn)擊"獲取CPU ID"按鈕,在顯示窗體便可以看到對(duì)應(yīng)的ID:

ae507c4a-8985-11ed-bfe3-dac502259ad0.png

擦除flash演示,點(diǎn)擊"擦除flash"按鈕,會(huì)調(diào)用SEGGER應(yīng)用,然后進(jìn)行flash擦除:

ae60ea58-8985-11ed-bfe3-dac502259ad0.png

燒錄程序,點(diǎn)擊"一鍵燒錄"按鈕,同樣會(huì)調(diào)用SEGGER應(yīng)用,然后進(jìn)行燒錄:

ae818f10-8985-11ed-bfe3-dac502259ad0.pngaea0b7f0-8985-11ed-bfe3-dac502259ad0.png






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FlaSh
    +關(guān)注

    關(guān)注

    10

    文章

    1715

    瀏覽量

    154705
  • GCC
    GCC
    +關(guān)注

    關(guān)注

    0

    文章

    112

    瀏覽量

    26070
  • Jlink
    +關(guān)注

    關(guān)注

    6

    文章

    114

    瀏覽量

    39349

原文標(biāo)題:QT編寫(xiě)一個(gè)JLINK燒錄工具

文章出處:【微信號(hào):風(fēng)火輪技術(shù)團(tuán)隊(duì),微信公眾號(hào):風(fēng)火輪技術(shù)團(tuán)隊(duì)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    QT編寫(xiě)一個(gè)JLINK燒錄工具

    的問(wèn)題 -- 桌面懸浮窗。 問(wèn)題2:工具的名字 -- RTOOL(米飯工具) 問(wèn)題3:是否貢獻(xiàn)整個(gè)工具 -- 分為兩個(gè)版本:開(kāi)源版本和公司項(xiàng)目版本(已經(jīng)發(fā)布了V1.0版本)。 本篇文章
    的頭像 發(fā)表于 01-09 11:53 ?4815次閱讀

    硬件設(shè)計(jì)的小工具

    本帖最后由 gk320830 于 2015-3-5 14:15 編輯 收集的設(shè)計(jì)常用的小工具,希望對(duì)大家有用
    發(fā)表于 05-07 11:40

    Labveiw鐘表小工具

    Labveiw 鐘表小工具
    發(fā)表于 08-16 00:22

    圖片轉(zhuǎn)PCB圖的小工具

    畫(huà)PCB的時(shí)候發(fā)現(xiàn)的一個(gè)不錯(cuò)的小工具,可以將圖片轉(zhuǎn)成PCB圖。大家還有什么好用的小工具,大家積極分享一下O(∩_∩)O~~btp2.rar (110.08 KB )
    發(fā)表于 05-08 06:36

    C語(yǔ)言注釋刪除小工具是什么

    C語(yǔ)言注釋刪除小工具是一款刪除c語(yǔ)言注釋并實(shí)現(xiàn)編譯的工具,如果你喜歡這款軟件,就快來(lái)IT貓撲下載吧!C語(yǔ)言注釋刪除小工具介紹很多編譯器不支持中文注釋,特別是日系的單片機(jī)編譯器,這是一個(gè)
    發(fā)表于 07-14 08:39

    C語(yǔ)言注釋刪除小工具的使用教程

    C語(yǔ)言注釋刪除小工具是什么?C語(yǔ)言注釋刪除小工具共有幾個(gè)狀態(tài)?
    發(fā)表于 10-18 06:06

    為什么要在RTOOL中集成JLINK燒錄工具呢?

    JLINK燒錄小工具,那為什么要在RTOOL中集成JLINK燒錄
    發(fā)表于 02-20 17:49

    amo的編程小工具集合

    電子發(fā)燒友網(wǎng)站提供《amo的編程小工具集合.zip》資料免費(fèi)下載
    發(fā)表于 07-22 09:42 ?14次下載

    自制51小工具

    自己做的51小工具,有數(shù)碼管段碼生成,51定時(shí)器計(jì)算,進(jìn)制轉(zhuǎn)換等
    發(fā)表于 11-19 11:35 ?7次下載

    自寫(xiě)小工具

    一個(gè)自己寫(xiě)的小工具感覺(jué)還不錯(cuò),分享給大家。
    發(fā)表于 05-17 09:49 ?41次下載

    單片機(jī)計(jì)算小工具

    常用單片機(jī)計(jì)算小工具
    發(fā)表于 02-27 16:43 ?11次下載

    CAD看圖小工具免費(fèi)下載

    CAD看圖小工具免費(fèi)下載
    發(fā)表于 12-18 14:01 ?48次下載

    射頻工程類(lèi)計(jì)算小工具

    射頻工程類(lèi)計(jì)算小工具,有LC諧振頻率計(jì)算、PCB特性阻抗計(jì)算工具軟件、電感量計(jì)算等一共19個(gè)計(jì)算小工具。
    發(fā)表于 03-21 14:50 ?61次下載

    電阻分壓計(jì)算小工具

    一個(gè)計(jì)算電阻分壓的小工具
    發(fā)表于 09-07 14:54 ?48次下載

    amo的編程小工具合集

    amo的編程小工具合集
    發(fā)表于 03-23 09:19 ?6次下載