ART-Pi Bootloader分析,驱动SD卡和USB设备做TF读卡器

电子说

1.3w人已加入

描述

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,

w25Q64

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工程

w25Q64

这个是基于已经下载完Bootloader工程之后。

然后编译下载,打开串口之后可以看到打印

w25Q64

使能SDIO和虚拟文件系统

点击RT-Thread Settings,并打开Fatfs和SDIO。

w25Q64

使能组件中的SDIO调试日志输出,方便观看。

w25Q64

并打开硬件中的SDIO1

w25Q64

然后保存配置,再次构建工程,并下载到板子上。

w25Q64

到这里,按照两位大佬的文章应该是已经能正常识别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);

w25Q64

注意: sdcard_change()会报隐式声明,我们在”drv_sdio.h”中声明一下即可。这个时候再次编译下载到开发板。

即可出现识别成功的现象。

w25Q64

然后我们添加挂载文件系统代码:

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设备,后面会解释。

w25Q64

然后再次编译下载到开发板之后,使用list_device命令发现挂载成功。

w25Q64

然后先使用sd_init命令再使用ls命令就能查看TF卡里面的内容,接下了我又跟着做了USB设备作为TF读卡器

w25Q64

TF设备作为读卡器
1、打开RT-Thread Setting配置,”使用USB”。并改变设备类型,以及改变磁盘名,注意这个磁盘名默认为flash0,我们一定要改成sd0.

w25Q64

w25Q64

5、注意:和adaphoto大佬所说的一致,TF卡做USB设备的时候一开始上电的时候不能使sd0不能挂载文件系统也就是不能注册到elm上,因为挂载到文件系统就不能挂载到USB的。所以在TF卡做USB设备的时候不执行sd_init()函数。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分