Bootloader解析
我看了Z_Tam大佬创建一个Bootloader工程,然后下载到板子上,然后也说明了BootLoader主要功能:BootLoader主要用于使用外挂Falsh存储代码时 初始化外挂的Flash、映射物理地址及地址跳转。
ART - Pi使用QSPI连接8M的W25Q64,也有一个大佬回答这个bootloader是直接烧写到内部128k的flash程序里,他的作用是引导应用程序到外部flash里面,main函数里面是直接跳转到外部QSPI接口的flash。
我的理解:
ART-Pi有两个存储的空间,一个是存储空间为 128K的flash ROM起始地址为 0x08000000,
ART-Pi从存储空间为128K flash ROM开始运行代码。
我们下载bootloader工程是为了将 bootloader下载到flash程序中,然后将应用程序下载到W25Q64中。
当ART-Pi上电后,先运行flash中的bootloader然后根据bootloader的引导再运行W25Q64中的应用程序。
总结:Bootloader的作用,以及什么时候使用Bootloader
作用: Bootloader在这里主要考虑内部flash空间不足,应用程序放在外部flahs也就是W25Q64中,需要通过Bootloader实现程序跳转执行。
使用场景:flash中没有bootloader,而我们的写的项目代码量又足够大的情况下,也就是当我们需要执行到下载到W25Q64中的项目。理论情况下,项目代码量足够小的情况下可以直接下载到flash中运行的。
当flash中下载的是其它项目代码,然后我们又将另一个项目代码下载到起始地址为 0x90000000的W25Q64中,这个时候运行的是flash中的项目,并且W25Q64中的项目并不会执行。
所以在构建项目前应下载Bootloader工程到开发板中
创建一个基础的LED工程
这个是基于已经下载完Bootloader工程之后。
然后编译下载,打开串口之后可以看到打印
使能SDIO和虚拟文件系统
点击RT-Thread Settings,并打开Fatfs和SDIO。
使能组件中的SDIO调试日志输出,方便观看。
并打开硬件中的SDIO1
然后保存配置,再次构建工程,并下载到板子上。
到这里,按照两位大佬的文章应该是已经能正常识别SD卡,但是我这边和评论区中一些小伙伴并没有识别,这里是写这个文章的一个重点。
原因:需在main函数中添加以下代码
#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”中声明一下即可。这个时候再次编译下载到开发板。
即可出现识别成功的现象。
然后我们添加挂载文件系统代码:
int sd_init(void)
{
rt_thread_mdelay(500);//这段延时必须加上,系统上电过程中存在延时,否则会出现先挂载后注册块设备sd0的情况
//mkfs("elm","sd0");//挂在前需格式化
if(dfs_mount("sd0","/","elm",0,0)==0) //挂载文件系统,参数:块设备名称、挂载目录、文件系统类型、读写标志、私有数据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设备,后面会解释。
然后再次编译下载到开发板之后,使用list_device命令发现挂载成功。
然后先使用sd_init命令再使用ls命令就能查看TF卡里面的内容,接下了我又跟着做了USB设备作为TF读卡器
TF设备作为读卡器
1、打开RT-Thread Setting配置,”使用USB”。并改变设备类型,以及改变磁盘名,注意这个磁盘名默认为flash0,我们一定要改成sd0.
5、注意:和adaphoto大佬所说的一致,TF卡做USB设备的时候一开始上电的时候不能使sd0不能挂载文件系统也就是不能注册到elm上,因为挂载到文件系统就不能挂载到USB的。所以在TF卡做USB设备的时候不执行sd_init()函数。
-
读卡器
+关注
关注
2文章
411浏览量
39371 -
SD卡
+关注
关注
2文章
565浏览量
63898 -
QSPI接口
+关注
关注
0文章
14浏览量
3344 -
w25Q64
+关注
关注
1文章
15浏览量
3021 -
ART-Pi
+关注
关注
0文章
23浏览量
1300
发布评论请先 登录
相关推荐
评论