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,
另一个是 存储空间为 8M的W25Q64 ROM起始地址为0x90000000。
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 success
");
}
else
{
rt_kprintf("dfs mount failed
");
}
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.
2、使能硬件中的usb设备
3、保存设置,编译下载到开发板上。发现在我的电脑中并没有出现可识别的U盘,这是因为我们USB线未连接正确。 4、重点:使用USB线让开发板的“USB-OTG”口和PC板连接。然后就可以看到U盘SD0(SD0是我自己改的名字,也就是U盘的名字)
5、注意:和adaphoto大佬所说的一致,TF卡做USB设备的时候一开始上电的时候不能使sd0不能挂载文件系统也就是不能注册到elm上,因为挂载到文件系统就不能挂载到USB的。所以在TF卡做USB设备的时候不执行sd_init()函数。
原作者:林夕
|