一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

求一種基于U盤(pán)拖拽更新固件的解決方案

痞子衡嵌入式 ? 來(lái)源:安德魯?shù)脑O(shè)計(jì)筆記本 ? 2023-09-20 09:16 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

引言

我們?cè)谙蛞恍┓菍I(yè)開(kāi)發(fā)者發(fā)放開(kāi)發(fā)板時(shí),有時(shí)對(duì)方?jīng)]有調(diào)試器,開(kāi)發(fā)者就無(wú)法下載體驗(yàn)在后續(xù)發(fā)布支持新功能的固件。并且,對(duì)于非專業(yè)開(kāi)發(fā)者的用戶來(lái)說(shuō),僅僅是體驗(yàn)新功能,而不介入開(kāi)發(fā)工作,專門(mén)搭建一套開(kāi)發(fā)環(huán)境,性價(jià)比實(shí)在不高。即使有調(diào)試器硬件,在不同操作系統(tǒng)平臺(tái)上,還需要安裝專門(mén)的工具軟件配合工作,才能實(shí)現(xiàn)下載固件的功能,操作比較繁瑣。為了簡(jiǎn)化下載固件的操作,本例使用MM32F5270微控制器,基于芯片自帶的USB外設(shè),實(shí)現(xiàn)了一個(gè)基于U盤(pán)拖拽更新固件的解決方案。我期望實(shí)現(xiàn)的結(jié)果是:

將開(kāi)發(fā)板同PC連接后,PC將識(shí)別出一個(gè)U盤(pán)

可將開(kāi)發(fā)板的固件(bin 格式)文件拖拽存放至該U盤(pán)中

復(fù)位開(kāi)發(fā)板后,開(kāi)發(fā)板能夠執(zhí)行新的固件程序

相對(duì)于板載帶有U盤(pán)拖拽下載功能的daplink方案,本例節(jié)約了一個(gè)專門(mén)運(yùn)行daplink程序的芯片,利用微控制器自帶的USB外設(shè)直接建立同PC的連接,更可有機(jī)會(huì)被實(shí)現(xiàn)成ROM,固化在芯片內(nèi)部。

原理

MM32F5270片內(nèi)集成了256KB Flash,但可通過(guò)QSPI接口外擴(kuò)spiflash存儲(chǔ)設(shè)備,并可在外擴(kuò)spiflash中執(zhí)行程序(XIP)。本例實(shí)際將運(yùn)行bootloader的片內(nèi)Flash當(dāng)做BOOT ROM,而將可執(zhí)行程序的固件存放在對(duì)接的spiflash存儲(chǔ)介質(zhì)中。當(dāng)芯片上電后,通過(guò)一些外部控制手段(例如使用一個(gè)按鍵選擇啟動(dòng)模式),先運(yùn)行帶有USB功能的bootloader程序,由bootloader的程序?qū)⑿酒?a href="http://www.www27dydycom.cn/analog/" target="_blank">模擬成U盤(pán)(U盤(pán)的物理存儲(chǔ)空間位于外擴(kuò)spiflash的后半段)。PC可以看到模擬U盤(pán)中的現(xiàn)存文件,也可以向其中拖拽新文件。當(dāng)拖拽新文件后,bootloader程序會(huì)繼續(xù)將新文件的程序內(nèi)容復(fù)制到程序的執(zhí)行區(qū)域,覆蓋掉之前的程序,然后再跳轉(zhuǎn)到程序的執(zhí)行區(qū)域執(zhí)行程序。

這里專門(mén)使用一塊物理存儲(chǔ)區(qū)域(spiflash存儲(chǔ)器的后半段)的原因是,USB協(xié)議棧模擬U盤(pán)時(shí),對(duì)文件系統(tǒng)的管理操作全部交由PC完成,這就意味著,PC向模擬U盤(pán)發(fā)送包含文件內(nèi)容的數(shù)據(jù)包時(shí),不一定是按照物理上的先后順序發(fā)送的,微控制器端難以通過(guò)數(shù)據(jù)包本身解析出數(shù)據(jù)包的先后順序。但是,bootloader向程序執(zhí)行區(qū)域復(fù)制可執(zhí)行程序的內(nèi)容必須是順序且連續(xù)的。PC在同U盤(pán)的通信過(guò)程中,數(shù)據(jù)包之間的內(nèi)容可能不連續(xù),但最終發(fā)送完成的文件內(nèi)容一定是完整的。因此,這里使用使用了一個(gè)能包含整個(gè)固件文件大小的區(qū)域作為緩沖區(qū),先緩沖下來(lái)整個(gè)完整的文件,然后再將完整的文件內(nèi)容按順序復(fù)制到程序的可執(zhí)行區(qū)域。

理想情況下,如果能用一塊RAM作為整個(gè)文件的緩沖區(qū),通過(guò)U盤(pán)拖拽下載過(guò)程將會(huì)非??臁5纠惺褂胹piflash作為緩沖區(qū),雖然擦除spiflash并向其寫(xiě)入數(shù)據(jù)需要花費(fèi)更多的時(shí)間,但能容納更大的程序文件。

如果芯片內(nèi)部集成足夠大的片內(nèi)Flash,也可以不依賴外擴(kuò)spiflash,對(duì)內(nèi)部的Flash做分區(qū),分別作為bootloader、運(yùn)行程序及文件緩存的存儲(chǔ)區(qū)。

實(shí)現(xiàn)

硬件相關(guān)

本例使用BIRD-F5270開(kāi)發(fā)板,開(kāi)發(fā)板基本情況如下:

晶振 12MHz

使用QSPI接口對(duì)接外擴(kuò)spiflash存儲(chǔ)芯片F(xiàn)M25Q16(2MB Flash),引腳與MM32F5280片內(nèi)合封所使用的引腳保持一致:

QSPI_NSS - PF6

QSPI_SCK - PG7

QSPI_D0 - PG6

QSPI_D1 - PF8

QSPI_D2 - PF10

QSPI_D3 - PG8

USB 引腳

USB_DP - PA12

USB_DM - PA11

按鍵引腳

SW1 - RESET

SW2 - BOOT0

SW3 - PA0

軟件相關(guān)

啟動(dòng)到2nd bootloader

芯片上電復(fù)位后,默認(rèn)是直接執(zhí)行到用戶程序中,但也可以通過(guò)指定的手段改為執(zhí)行bootloader,執(zhí)行U盤(pán)程序。本例使用一個(gè)按鍵,綁定到一個(gè)指定的GPIO輸入(BOOT引腳),芯片在啟動(dòng)過(guò)程中判定啟動(dòng)模式:默認(rèn)啟動(dòng)到用戶程序,當(dāng)按鍵按下時(shí),啟動(dòng)到帶有U盤(pán)程序的bootloader。

MM32F5芯片自帶的BOOT0引腳雖然在微控制器復(fù)位后可作為普通GPIO使用,但可能會(huì)將芯片引導(dǎo)到芯片內(nèi)部已經(jīng)固化到ROM中的bootloader程序中,因此不適合作為2nd bootloader的BOOT引腳。BIRD-F5270開(kāi)發(fā)板上除RESET和BOOT0 之外,還有PA0引腳實(shí)現(xiàn)按鍵(SW3)功能,可作為2nd bootloader中的BOOT引腳。

當(dāng) SW3 被按下時(shí),PA0 為低電平,可執(zhí)行 U 盤(pán)任務(wù),當(dāng) SW3 松開(kāi)時(shí),PA0 為高電平,可執(zhí)行跳轉(zhuǎn)程序的任務(wù),具體實(shí)現(xiàn)代碼如下:

/*readgpiopinlevel,selectbootmode.*/
if(GPIO_ReadInDataBit(BOARD_BTN_PORT,BOARD_BTN_PIN))
{
/*updateapp&run.*/
jump_to_app();
}
else
{
/*runusbmsctask.*/
msc_task();
}

/*cannotrunhere.*/
while(1)
{}

基于USB外設(shè)模擬U盤(pán)

MM32F5270微控制器集成了USB外設(shè),配合TinyUSB協(xié)議棧,可模擬U盤(pán)(MSC設(shè)備)。

當(dāng)運(yùn)行模擬U盤(pán)的程序時(shí),需要指定一塊存儲(chǔ)區(qū)域作為U盤(pán)的存儲(chǔ)空間,在本例中,將外擴(kuò)的spiflash存儲(chǔ)區(qū)域一分為二,前半部分作為執(zhí)行程序區(qū)域,存儲(chǔ)需要執(zhí)行的應(yīng)用程序,后半部分作為U盤(pán)的物理存儲(chǔ)空間,將用于緩存用戶通過(guò)拖拽方式下載的固件。

注意,spiflash作為U盤(pán)的存儲(chǔ)介質(zhì)時(shí)需要解決一個(gè)問(wèn)題,spiflash的最小擦除塊大小是4KB,而U盤(pán)設(shè)備對(duì)存儲(chǔ)介質(zhì)的擦除塊大小是512B,擦除塊大小不匹配。該問(wèn)題有兩種解法:

每次修改spiflash前,先將包含目標(biāo)操作空間的4KB大小的數(shù)據(jù)塊讀取數(shù)據(jù)到RAM中緩存,修改指定位置的數(shù)據(jù)內(nèi)容后,擦除spiflash中對(duì)應(yīng)的整塊,再將修改后的數(shù)據(jù)塊寫(xiě)入到spiflash中。

每次修改spiflash前,先將包含目標(biāo)操作空間的4KB大小的數(shù)據(jù)塊讀取數(shù)據(jù)到RAM中緩存,修改指定位置的數(shù)據(jù)內(nèi)容后,暫不寫(xiě)回到spiflash中。如果接下來(lái)要寫(xiě)入的數(shù)據(jù)仍在該塊中,則繼續(xù)寫(xiě)入RAM緩存。只有當(dāng)將要新寫(xiě)入的數(shù)據(jù)不在緩存的數(shù)據(jù)塊中時(shí),才寫(xiě)回最近緩存的數(shù)據(jù)塊,并讀出新的數(shù)據(jù)塊到RAM緩存中。另外,每次在寫(xiě)操作之后的讀操作,也都會(huì)重新清空RAM緩存中的數(shù)據(jù)。

第一種方法簡(jiǎn)單易實(shí)現(xiàn),但會(huì)頻繁擦寫(xiě)spiflash,消耗存儲(chǔ)器件的壽命。第二種方法相當(dāng)于實(shí)現(xiàn)了一個(gè)cache機(jī)制,操作行為較為復(fù)雜。當(dāng)前暫時(shí)選擇第一種做法,先驗(yàn)證原理,如果后續(xù)考慮將這個(gè)帶U盤(pán)功能的bootloader集成到芯片內(nèi)部,到時(shí)也可以專門(mén)集成一塊以512B作為操作單元的dflash作為固件的緩存存儲(chǔ)設(shè)備。

運(yùn)行TinyUSB協(xié)議棧的程序中,在執(zhí)行MSC任務(wù)時(shí),會(huì)執(zhí)行對(duì)spiflash存儲(chǔ)設(shè)備進(jìn)行讀寫(xiě)操作的回調(diào)函數(shù),如下:

從spiflash讀數(shù)據(jù):

//CallbackinvokedwhenreceivedREAD10command.
//Copydisk'sdatatobuffer(uptobufsize)andreturnnumberofcopiedbytes.
int32_ttud_msc_read10_cb(uint8_tlun,uint32_tlba,uint32_toffset,void*buffer,uint32_tbufsize)
{
(void)lun;

uint8_t*addr=(uint8_t*)(BOARD_MEM_BASE+lba*512+offset);
memcpy(buffer,addr,bufsize);

returnbufsize;
}

向spiflash寫(xiě)數(shù)據(jù):

staticuint8_tflash_buf[4096];

//CallbackinvokedwhenreceivedWRITE10command.
//Processdatainbuffertodisk'sstorageandreturnnumberofwrittenbytes
int32_ttud_msc_write10_cb(uint8_tlun,uint32_tlba,uint32_toffset,uint8_t*buffer,uint32_tbufsize)
{
(void)lun;

/*readthe4Ksectorfromspiflashtolocalbuff.*/
uint8_t*flash_addr=(uint8_t*)((BOARD_MEM_BASE+lba*512)&0xFFFFF000);
memcpy(flash_buf,flash_addr,4096);
/*erasethesectorinspiflash.*/
BOARD_EraseSector4KB((uint32_t)flash_addr);
/*writethenewdataintolocalbuff.*/
uint8_t*block=flash_buf+((lba*512)&0xFFF)+offset;
memcpy(block,buffer,bufsize);
/*writethedatafromlocalbufftospiflash.*/
BOARD_WriteSector4KB((uint32_t)flash_addr,flash_buf);

returnbufsize;
}

另外,還有一種做法是不需要真實(shí)存在的物理存儲(chǔ)空間作為U盤(pán)的存儲(chǔ)介質(zhì),而是實(shí)時(shí)解算PC發(fā)過(guò)來(lái)的要存儲(chǔ)在Flash上的數(shù)據(jù)包,解析其中哪些數(shù)據(jù)是文件系統(tǒng)相關(guān)的信息,哪些數(shù)據(jù)是文件本身內(nèi)容。此時(shí),可丟棄文件系統(tǒng)相關(guān)的信息,而將文件本身內(nèi)容按順序存放在spiflash的指定區(qū)域。該方法不需要將spiflash空間一分為二,可提高對(duì)spiflash的空間利用率,但該實(shí)現(xiàn)該方法需要十分熟悉FAT文件系統(tǒng)格式,且萬(wàn)一電腦未按照指定的序列發(fā)數(shù)數(shù)據(jù)時(shí),該方法無(wú)法正確解算出文件內(nèi)容,造成更新固件失敗,因此,在本例中未實(shí)現(xiàn)該功能。

判斷是否存在新固件

前文中實(shí)現(xiàn)的U盤(pán)功能,將包括文件系統(tǒng)信息的新固件儲(chǔ)存在了spiflash的后半段空間中,bootloader程序要讀取新固件中的內(nèi)容也需要能夠操作文件系統(tǒng),本例中為bootloader程序性集成了嵌入式系統(tǒng)上常見(jiàn)的文件系統(tǒng)組件為 FatFs(http://elm-chan.org/fsw/ff/00index_e.html)

本項(xiàng)目中,僅需要 FatFs 實(shí)現(xiàn)文件的讀功能,不需要對(duì)文件進(jìn)行寫(xiě)操作,因此只需要在適配接口上實(shí)現(xiàn)讀操作即可, 配置文件ff_conf.h中配置宏選項(xiàng) FF_FS_READONLY 的值為1。然后在diskio.c文件中適配文件系統(tǒng)對(duì)具體物理介質(zhì)的讀操作函數(shù)disk_read()如下:

DRESULTdisk_read(
BYTEpdrv,/*Physicaldrivenmubertoidentifythedrive*/
BYTE*buff,/*Databuffertostorereaddata*/
LBA_tsector,/*StartsectorinLBA*/
UINTcount/*Numberofsectorstoread*/
)
{
(void)pdrv;

BYTE*flash_addr=(BYTE*)(BOARD_MEM_BASE+sector*FF_MAX_SS);
memcpy(buff,flash_addr,count*FF_MAX_SS);

return0;
}

如何在文件系統(tǒng)中的眾多文件中識(shí)別微控制器可執(zhí)行程序的固件呢?本例采用通過(guò)文件名來(lái)確定是否為固件。

通過(guò) FatFs 嘗試打開(kāi)一個(gè)有宏BOARD_APP_NAME指定名稱的文件,若能成功打開(kāi)該文件,則說(shuō)明有可用的固件文件存在。

if(FR_OK==f_open(&file,"0:/"BOARD_APP_NAME,FA_READ))
{
...
}

為什么不能使用任意bin判斷文件作為固件呢?這里考慮到,當(dāng)文件系統(tǒng)中有多個(gè)bin文件時(shí),bootloader 沒(méi)有依據(jù)判斷哪一個(gè)固件為新固件(根據(jù)修改日期判斷是否可行,作為可移動(dòng)存儲(chǔ)設(shè)備,會(huì)插在不同電腦上,如果不同電腦的時(shí)間不一致,則會(huì)出現(xiàn)判斷失誤的情況,因此不選擇使用修改日期作為新固件的判斷依據(jù)),指定固定文件名的方式判斷固件,最簡(jiǎn)單有效,問(wèn)題最少。

驗(yàn)證固件的有效性

不少人都應(yīng)該有這樣的經(jīng)歷,在網(wǎng)上下載大文件如大型游戲時(shí),往往下載頁(yè)面會(huì)提供一串 MD5 碼,這段 MD5 碼的作用是驗(yàn)證下載的文件是否完整,當(dāng)用戶在網(wǎng)上下載大文件完成后,可在 CMD 中使用 certutil -hashfile MD5 指令求出該文件的 MD5 碼,與下載頁(yè)面提供的 MD5 進(jìn)行對(duì)比,判斷文件是否下載完整。

MicrosoftWindows[版本10.0.22621.1848]
(c) Microsoft Corporation。保留所有權(quán)利。

E:>certutil-hashfileproject.binMD5
MD5的project.bin哈希:
615ca0da12d496b7a8b1bd6c21876a97
CertUtil:-hashfile 命令成功完成。

E:>

嵌入式領(lǐng)域,Arm的MbedTLS加解密算法庫(kù)中提供了MD5的計(jì)算方法,因此可使用MbedTLS計(jì)算MD5,有程序如下:

/*calcmd5.*/
mbedtls_md5_contextmd5_ctx;

mbedtls_md5_init(&md5_ctx);
mbedtls_md5_starts(&md5_ctx);

while(1)
{
UINTbr=0;
f_read(&file,app_buf,sizeof(app_buf),&br);

mbedtls_md5_update(&md5_ctx,app_buf,br);

if(br

除了 MD5 以外,還可以使用如 SHA1,SHA2 或者 SM3 等更高安全等級(jí)的散列值算法作為新固件的判斷依據(jù)。

復(fù)制固件到執(zhí)行區(qū)域

復(fù)制固件到執(zhí)行區(qū)域的做法較為簡(jiǎn)單,就是使用 f_read() 函數(shù)讀取數(shù)據(jù),再寫(xiě)入到spiflash的指定區(qū)域即可。

但除了復(fù)制固件文件內(nèi)容本身,其文件的MD5值也要寫(xiě)入到Flash中。應(yīng)在寫(xiě)新固件之前將之前的MD5值擦除,寫(xiě)新固件完成之后,再將新MD5值寫(xiě)入,如此一來(lái),MD5除了作為檢查新固件的完整性的方法外,還可作為執(zhí)行區(qū)域固件完整性檢查的重要依據(jù)。

本例中,將MD5值存放在片內(nèi)flash的末尾。

檢查新固件和復(fù)制固件到執(zhí)行區(qū)域的代碼如下:

/*checkmd5,themd5lengthis16byte.*/
if(memcmp((uint8_t*)BOARD_MD5_BASE,md5_val,sizeof(md5_val))!=0)
{
/*newfile,update.*/
BOARD_EraseSector4KB(BOARD_MD5_BASE);

uint32_thas_write=0;
while(1)
{
UINTbr=0;
memset(app_buf,0xff,sizeof(app_buf));
f_read(&file,app_buf,sizeof(app_buf),&br);

BOARD_EraseSector4KB(has_write);
BOARD_WriteSector4KB(has_write,app_buf);
has_write+=4096;

if(br

需要使用完整的一個(gè)塊存放MD5值,MD5必須保證單獨(dú)擦除,單獨(dú)寫(xiě)入。除了MD5以外,該區(qū)域還可以可根據(jù)需要存放一些固件相關(guān)的信息,比如說(shuō)修改時(shí)間,固件大小等信息,充分利用空間。

跳轉(zhuǎn)執(zhí)行

跳轉(zhuǎn)程序需要做的事情包括:恢復(fù)系統(tǒng)時(shí)鐘,修改中斷向量表位置,復(fù)位棧指針,執(zhí)行應(yīng)用程序的復(fù)位程序等。具體操作如下:

voidjump_to_app(void)
{
...
/*jumptoapp.*/
CLOCK_ResetToDefault();

vtor=(uint32_t*)BOARD_APP_BASE;

__disable_irq();
SCB->VTOR=BOARD_APP_BASE;

__ISB();
__DSB();

__set_MSP(vtor[0]);
__set_PSP(vtor[0]);

__enable_irq();
((void(*)(void))vtor[1])();
}

用戶應(yīng)用程序

為了配合bootloader正常工作,需要用戶在自己的應(yīng)用程序需調(diào)整以下內(nèi)容:

在Linker File中指定可執(zhí)行程序在分塊后的存儲(chǔ)區(qū)

避免誤配置GPIO和QSPI導(dǎo)致BOOT按鍵或外擴(kuò)spiflash失效

本例實(shí)現(xiàn)的bootloader,spiflash作為應(yīng)用程序的執(zhí)行區(qū)域,代碼段的起始位置位于spiflash的起始映射地址0x90000000,不是片內(nèi)Flash的0x08000000,因此,需要調(diào)整Linker中對(duì)應(yīng)的配置如下:

/*---------------------FlashConfiguration----------------------------------
;FlashConfiguration
;FlashBaseAddress<0x0-0xFFFFFFFF:8>
;FlashSize(inBytes)<0x0-0xFFFFFFFF:8>
;
*----------------------------------------------------------------------------*/
#define__ROM_BASE0x90000000
#define__ROM_SIZE0x00100000

若使用spiflash存儲(chǔ)應(yīng)用程序,bootloader在執(zhí)行應(yīng)用程序前就應(yīng)該將 QSPI 接口和 GPIO 引腳配置好。在用戶應(yīng)用程序中,如果需要操作QSPI或者bootloader中使用的GPIO,要特別注意避開(kāi)。

總結(jié)

通過(guò)USB接口將BIRD-F5270連接電腦,保持SW3按鍵按下時(shí),再按下并松開(kāi)RESET按鍵,稍后會(huì)在PC上看到一個(gè)大小約為1MB的U盤(pán),將新編譯好的名為 “project.bin” 的固件文件拖拽存放至該U盤(pán)中,然后保持SW3按鍵松開(kāi)的狀態(tài)下再次按下并松開(kāi)RESET按鍵,稍后即可發(fā)現(xiàn)微控制器已經(jīng)在執(zhí)行新固件中的應(yīng)用程序了。

作為下載新固件的 U 盤(pán),還可以存放一些別的文件,供應(yīng)用程序使用,例如一張圖片,一首音樂(lè),或一段文字,但需要注意的是,應(yīng)用程序?qū)υ撐募到y(tǒng)只有讀操作的權(quán)限,不能進(jìn)行寫(xiě)操作(或者在bootloader中實(shí)現(xiàn)安全寫(xiě)操作的接口,讓?xiě)?yīng)用程序去調(diào)用相應(yīng)的寫(xiě)操作接口)

known issue

開(kāi)發(fā)板通過(guò) USB 連接電腦,保持 SW3 按鍵按下的狀態(tài),多次快速按下復(fù)位鍵,可能會(huì)造成文件系統(tǒng)損壞,文件丟失,需重新格式化才能正常使用,其原因是兩次按下復(fù)位鍵中間,電腦正在修改 Flash 中的內(nèi)容,但復(fù)位操作打斷了寫(xiě)操作,造成文件系統(tǒng)損壞。因此需避免快速多次按下復(fù)位鍵的操作。這里可考慮使用一個(gè)可編程的指示燈,指示芯片內(nèi)部程序的工作狀態(tài):當(dāng)拖拽固件文件到芯片時(shí),指示燈快速閃爍;當(dāng)復(fù)制新固件文件到程序運(yùn)行區(qū)域時(shí),指示燈保持常亮;當(dāng)復(fù)制完畢后,指示燈熄滅。僅當(dāng)指示燈熄滅后,方可重新復(fù)位芯片執(zhí)行新程序。






審核編輯:劉清

聲明:本文內(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)投訴
  • 微控制器
    +關(guān)注

    關(guān)注

    48

    文章

    7953

    瀏覽量

    155127
  • ROM
    ROM
    +關(guān)注

    關(guān)注

    4

    文章

    578

    瀏覽量

    87369
  • 調(diào)試器
    +關(guān)注

    關(guān)注

    1

    文章

    313

    瀏覽量

    24329
  • SPI Flash
    +關(guān)注

    關(guān)注

    1

    文章

    13

    瀏覽量

    10607
  • QSPI接口
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    3551

原文標(biāo)題:定制帶U盤(pán)功能的bootloader實(shí)現(xiàn)拖拽下載固件

文章出處:【微信號(hào):pzh_mcu,微信公眾號(hào):痞子衡嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    一種PCIe接口的視頻采集解決方案

    一種PCIe接口的視頻采集解決方案
    發(fā)表于 04-30 06:29

    一種基于ZigBee的駕駛輔助系統(tǒng)解決方案

    一種基于ZigBee的駕駛輔助系統(tǒng)解決方案
    發(fā)表于 05-14 06:22

    一種單芯片低功耗藍(lán)牙BLE解決方案

    一種單芯片低功耗藍(lán)牙BLE解決方案
    發(fā)表于 05-21 07:01

    一種射頻開(kāi)關(guān)的解決方案

    一種射頻開(kāi)關(guān)的解決方案
    發(fā)表于 05-21 06:46

    一種NXP最新的NFC電子錢(qián)包解決方案

    NFC電子錢(qián)包總體結(jié)構(gòu)是怎樣構(gòu)成的?一種NXP最新的NFC電子錢(qián)包解決方案
    發(fā)表于 05-24 06:44

    一種可網(wǎng)絡(luò)化管理和配置機(jī)頂盒的網(wǎng)絡(luò)解決方案

    一種可網(wǎng)絡(luò)化管理和配置機(jī)頂盒的網(wǎng)絡(luò)解決方案
    發(fā)表于 05-25 07:10

    一種基于ARM Cortex-M處理器的音頻解決方案

    一種基于ARM Cortex-M處理器的音頻解決方案
    發(fā)表于 06-01 06:32

    一種應(yīng)對(duì)壓電效應(yīng)失效的電容器解決方案

    一種應(yīng)對(duì)壓電效應(yīng)失效的電容器解決方案
    發(fā)表于 06-08 06:39

    一種STM32仿真調(diào)試時(shí)復(fù)位后需要run多次的解決方案

    一種STM32仿真調(diào)試時(shí)復(fù)位后需要run多次的解決方案
    發(fā)表于 12-01 07:11

    一種MCU Specific Package單片機(jī)的具體解決方案

    一種MCU Specific Package單片機(jī)的具體解決方案
    發(fā)表于 12-10 07:46

    一種LCD和LED沖突的解決方案

    一種LCD和LED沖突的解決方案
    發(fā)表于 01-25 07:12

    一種用RK818實(shí)現(xiàn)電源管理的解決方案

    RK818是什么?一種用RK818實(shí)現(xiàn)電源管理的解決方案
    發(fā)表于 02-10 06:21

    一種基于RK3288的人臉識(shí)別測(cè)溫解決方案

    一種基于RK3288的人臉識(shí)別測(cè)溫解決方案
    發(fā)表于 03-03 12:21

    CH32X035實(shí)現(xiàn)U盤(pán)固件更新

    CH32X035的開(kāi)發(fā)板上有個(gè)USB-A口, 實(shí)現(xiàn)個(gè)U盤(pán)固件更新功能還是比較容易的,廠家有自己的U
    發(fā)表于 10-30 17:52

    通過(guò)U盤(pán)更新arm程序

    通過(guò)U盤(pán)更新arm程序
    發(fā)表于 03-21 15:24 ?14次下載