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