完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在前面章节中介绍了使用MM32F3270的SDIO外设驱动SD卡,对SD卡识别和简单的数据读写验证,不过像这样直接操作SD卡存储单元,在实际应用中是不现实的。SD卡一般用来存放文件,所以都需要加载文件系统到里面。 FatFs 是一个通用的文件系统(FAT/exFAT)模块,用于在小型嵌入式系统中实现FAT文件系统。完全用标准C语言编写,所以具有良好的硬件平***立性。可以移植到8051、PIC、AVR、SH、Z80、H8、ARM等系列单片机上而只需做简单的修改。它支持FATl2、FATl6和FAT32格式,支持多个存储媒介,具有独立的缓冲区,可以对多个文件进行读/写,并特别对8位单片机和16位单片机做了优化。 本章节主要介绍移植FatFs文件系统到SD卡内。 FatFs的特点 1)Windows兼容的FAT文件系统(支持FAT12/FAT16/FAT32)与平台无关,移植简单; 2)代码量少、效率高; 3)多种配置选项; 4)支持多卷(物理驱动器或分区,最多10个卷); 5)多个ANSI/OEM代码页包括DBCS; 6)支持长文件名、 ANSI/OEM 或Unicode; 7)支持RTOS; 8)支持多种扇区大小; 9)只读、最小化的API和I/O缓冲区等。 FatFs源码获取 FatFs文件系统的源码可以从FatFs官网下载: http://elm-chan.org/fsw/ff/00index_e.html 此地址不仅仅包含资料包下载,还包括文件系统一些知识,包括函数说明,函数调用实例等。
官网有对FatFs做详细的介绍,感兴趣可以多了解一些。所有版本的FatFs源码的移植步骤都是类似的,我们选择选择其中一个版本下载即可。 FatFs文件结构 解压之后可看到里面有 doc 和src 这两个文件。 FatFs的源代码主要包含几个文件: diskio.c、 diskio.h、 ff.c、 ff.h、 integer.h文件。 其中diskio.c 这个文件是文件系统底层和SD驱动的中间接口的实现代码,移植的时候需要改写在diskio.h中声明的那几个函数,代码在ff.c中被调用;diskio.h定义了FatFs用到的宏;ff.c是一般FatFs的代码文件;ff.h是一般FatFs包含的头文件;integer.h是内部基本类型的定义。 option文件夹下是一些可选的外部c文件,包含了多语言支持需要用到的文件和转换函数。 00readme.txt 说明了当前目录下 diskio.c 、 diskio.h、 ff.c、 ff.h、 integer.h 的功能。 FatFs移植步骤 在工程目录下新建FatFs文件夹,并将src文件夹下的文件复制一份至该文件夹。 接着添加FatFs路径到工程选项。 编写FatFs接口函数 来看diskio.c文件,注释前面的几个头文件,这里要加入自己的头文件。下面的三个宏定义ATA、MMC、USB也可以改成想要的名称,可以改成SD并定义为0。 再次编译,发现提示一个关于get_fattime的错误,get_fattime用来获取当前时间,如果不需要,在ffconf.h中的宏定义#define _FS_NORTC改为1关闭,如果需要这个功能,需要在diskio.c里面,实现get_fattime函数,加入如下代码即可。 至此我们已经完成FatFs文件管理系统的移植,不过功能还没有实现,需要在disk_status、disk_initialize、disk_read、disk_writ、disk_ioctl函数中加入执行代码: 设备状态获取 DSTATUS disk_status ( BYTE pdrv /* Physical drive number to identify the drive */ ) { DSTATUS stat; stat = disk.drv[pdrv]->disk_status(disk.lun[pdrv]); return stat; } 设备初始化 DSTATUS disk_initialize ( BYTE pdrv /* Physical drive nmuber to identify the drive */ ) { DSTATUS stat = RES_OK; if(disk.is_initialized[pdrv] == 0) { disk.is_initialized[pdrv] = 1; stat = disk.drv[pdrv]->disk_initialize(disk.lun[pdrv]); } return stat; } 读取扇区 DRESULT disk_read ( BYTE pdrv, /* Physical drive nmuber to identify the drive */ BYTE* buff, /* Data buffer to store read data */ DWORD sector, /* Sector address in LBA */ UINT count /* Number of sectors to read */ ) { DRESULT res; res = disk.drv[pdrv]->disk_read(disk.lun[pdrv], buff, sector, count); return res; } 扇区写入 DRESULT disk_write ( BYTE pdrv, /* Physical drive nmuber to identify the drive */ const BYTE* buff, /* Data to be written */ DWORD sector, /* Sector address in LBA */ UINT count /* Number of sectors to write */ ) { DRESULT res; res = disk.drv[pdrv]->disk_write(disk.lun[pdrv], buff, sector, count); return res; } 其他 DRESULT disk_ioctl ( BYTE pdrv, /* Physical drive nmuber (0..) */ BYTE cmd, /* Control code */ void* buff /* Buffer to send/receive control data */ ) { DRESULT res; res = disk.drv[pdrv]->disk_ioctl(disk.lun[pdrv], cmd, buff); return res; } 关联的代码不再进行详细描述,可在MindMotion官网下载MM32F3270 lib_Samples: https://www.mindmotion.com.cn/pr ... instream/mm32f3270/ 工程路径如下: ~MM32F3270_Lib_Samples_V0.90Demo_appPlayWave_DemoSPI_I2S_SDIO_FatFs 可以看到详细的样例与功能操作。 |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
2249个成员聚集在这个小组
加入小组灵动微电子MM32全系列MCU产品应用手册,库函数和例程和选型表
11703 浏览 3 评论
【MM32 eMiniBoard试用连载】+基于OLED12864的GUI---U8G2
5930 浏览 1 评论
【MM32 eMiniBoard试用连载】移植RT-Thread至MM32L373PS
10965 浏览 0 评论
【MM32 eMiniBoard测评报告】+ 开箱 + 初探
4577 浏览 1 评论
灵动微课堂(第106讲) | MM32 USB功能学习笔记 —— WinUSB设备
4302 浏览 1 评论
[MM32软件] MM32F002使用内部flash存储数据怎么操作?
978浏览 1评论
805浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 18:57 , Processed in 0.540668 second(s), Total 36, Slave 29 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号