Bootloader解析
我看了Z_Tam大佬創(chuàng)建一個(gè)Bootloader工程,然后下載到板子上,然后也說明了BootLoader主要功能:BootLoader主要用于使用外掛Falsh存儲(chǔ)代碼時(shí) 初始化外掛的Flash、映射物理地址及地址跳轉(zhuǎn)。
ART - Pi使用QSPI連接8M的W25Q64,也有一個(gè)大佬回答這個(gè)bootloader是直接燒寫到內(nèi)部128k的flash程序里,他的作用是引導(dǎo)應(yīng)用程序到外部flash里面,main函數(shù)里面是直接跳轉(zhuǎn)到外部QSPI接口的flash。
我的理解:
ART-Pi有兩個(gè)存儲(chǔ)的空間,一個(gè)是存儲(chǔ)空間為 128K的flash ROM起始地址為 0x08000000,
ART-Pi從存儲(chǔ)空間為128K flash ROM開始運(yùn)行代碼。
我們下載bootloader工程是為了將 bootloader下載到flash程序中,然后將應(yīng)用程序下載到W25Q64中。
當(dāng)ART-Pi上電后,先運(yùn)行flash中的bootloader然后根據(jù)bootloader的引導(dǎo)再運(yùn)行W25Q64中的應(yīng)用程序。
總結(jié):Bootloader的作用,以及什么時(shí)候使用Bootloader
作用: Bootloader在這里主要考慮內(nèi)部flash空間不足,應(yīng)用程序放在外部flahs也就是W25Q64中,需要通過Bootloader實(shí)現(xiàn)程序跳轉(zhuǎn)執(zhí)行。
使用場(chǎng)景:flash中沒有bootloader,而我們的寫的項(xiàng)目代碼量又足夠大的情況下,也就是當(dāng)我們需要執(zhí)行到下載到W25Q64中的項(xiàng)目。理論情況下,項(xiàng)目代碼量足夠小的情況下可以直接下載到flash中運(yùn)行的。
當(dāng)flash中下載的是其它項(xiàng)目代碼,然后我們又將另一個(gè)項(xiàng)目代碼下載到起始地址為 0x90000000的W25Q64中,這個(gè)時(shí)候運(yùn)行的是flash中的項(xiàng)目,并且W25Q64中的項(xiàng)目并不會(huì)執(zhí)行。
所以在構(gòu)建項(xiàng)目前應(yīng)下載Bootloader工程到開發(fā)板中
創(chuàng)建一個(gè)基礎(chǔ)的LED工程
這個(gè)是基于已經(jīng)下載完Bootloader工程之后。
然后編譯下載,打開串口之后可以看到打印
使能SDIO和虛擬文件系統(tǒng)
點(diǎn)擊RT-Thread Settings,并打開Fatfs和SDIO。
使能組件中的SDIO調(diào)試日志輸出,方便觀看。
并打開硬件中的SDIO1
然后保存配置,再次構(gòu)建工程,并下載到板子上。
到這里,按照兩位大佬的文章應(yīng)該是已經(jīng)能正常識(shí)別SD卡,但是我這邊和評(píng)論區(qū)中一些小伙伴并沒有識(shí)別,這里是寫這個(gè)文章的一個(gè)重點(diǎn)。
原因:需在main函數(shù)中添加以下代碼
#include "drv_sdio.h"
int sdcard_mount(void)
{
rt_device_t device;
device = rt_device_find("sd0");
if (device == NULL)
{
mmcsd_wait_cd_changed(0);
sdcard_change();
mmcsd_wait_cd_changed(RT_WAITING_FOREVER);
device = rt_device_find("sd0");
}
return 0;
}
INIT_COMPONENT_EXPORT(sdcard_mount);
注意: sdcard_change()會(huì)報(bào)隱式聲明,我們?cè)凇眃rv_sdio.h”中聲明一下即可。這個(gè)時(shí)候再次編譯下載到開發(fā)板。
即可出現(xiàn)識(shí)別成功的現(xiàn)象。
然后我們添加掛載文件系統(tǒng)代碼:
int sd_init(void)
{
rt_thread_mdelay(500);//這段延時(shí)必須加上,系統(tǒng)上電過程中存在延時(shí),否則會(huì)出現(xiàn)先掛載后注冊(cè)塊設(shè)備sd0的情況
//mkfs("elm","sd0");//掛在前需格式化
if(dfs_mount("sd0","/","elm",0,0)==0) //掛載文件系統(tǒng),參數(shù):塊設(shè)備名稱、掛載目錄、文件系統(tǒng)類型、讀寫標(biāo)志、私有數(shù)據(jù)0
{
rt_kprintf("dfs mount successrn");
}
else
{
rt_kprintf("dfs mount failedrn");
}
return 0;
}
MSH_CMD_EXPORT(sd_init,sd_init);
這是沒有使用INIT_COMPONENT_EXPORT(),自動(dòng)掛載是為了后面的TF卡作USB設(shè)備,后面會(huì)解釋。
然后再次編譯下載到開發(fā)板之后,使用list_device命令發(fā)現(xiàn)掛載成功。
然后先使用sd_init命令再使用ls命令就能查看TF卡里面的內(nèi)容,接下了我又跟著做了USB設(shè)備作為TF讀卡器
TF設(shè)備作為讀卡器
1、打開RT-Thread Setting配置,”使用USB”。并改變?cè)O(shè)備類型,以及改變磁盤名,注意這個(gè)磁盤名默認(rèn)為flash0,我們一定要改成sd0.
5、注意:和adaphoto大佬所說的一致,TF卡做USB設(shè)備的時(shí)候一開始上電的時(shí)候不能使sd0不能掛載文件系統(tǒng)也就是不能注冊(cè)到elm上,因?yàn)閽燧d到文件系統(tǒng)就不能掛載到USB的。所以在TF卡做USB設(shè)備的時(shí)候不執(zhí)行sd_init()函數(shù)。
-
讀卡器
+關(guān)注
關(guān)注
2文章
419瀏覽量
39466 -
SD卡
+關(guān)注
關(guān)注
2文章
566瀏覽量
64115 -
QSPI接口
+關(guān)注
關(guān)注
0文章
14瀏覽量
3408 -
w25Q64
+關(guān)注
關(guān)注
1文章
15瀏覽量
3038 -
ART-Pi
+關(guān)注
關(guān)注
0文章
23瀏覽量
1314
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論