FATFS移植测试文档
一、项目要求
在 eMMC驱动移植实验的基础上,加上 FatFs 文件系统,实现 eMMC 卡中文件的读写及其它操作
目的:
(1)了解 FatFs 文件系统的原理
(2)掌握 FatFs 文件系统的移植方法
(3)实现 eMMC卡中文件的读写
(4)测试 eMMC读写速度并分析优化
二、FATFS原理
1、底层接口,包括存储媒介读/写接口(disk I/O)和供给文件创建修改时间的实时时钟,需要我们根据平台和存储介质编写移植代码。
2、中间层FATFS模块,实现了FAT 文件读/写协议。FATFS模块提供的是ff.c和ff.h。除非有必要,使用者一般不用修改,使用时将头文件直接包含进去即可。
3、最顶层是应用层,使用者无需理会FATFS的内部结构和复杂的FAT 协议,只需要调用FATFS模块提供给用户的一系列应用接口函数,如f_open,f_read,f_write 和f_close等,就可以像在PC 上读/写文件那样简单。
三、FATFS移植
1、版本 FatFs - FAT file system module R0.11 ©ChaN, 2015
2、下载地址 http://elm-chan.org/fsw/ff/00index_e.html
3、将下载文件解压到工程目录
4、在mdk工程界面中新建FatFS目录,添加如下文件:
5、魔术棒中设置头文件路径
操作到这里,工程文件结构就算完整了,接下来就是修改文件代码。这里有两个文件需要修改,分别为 user_diskio.c 文件和 ffconf.h 文件。
6、读写函数框架构建
user_diskio.c文件是用户需要完成的diskio驱动程序框架,包括初始化驱动器、获取驱动器状态、读写驱动器等接口函数,需要用户根据使用的芯片和底层函数接口自行配置。
(1)从emmc卡中读取数据函数:
/**
* @brief Reads Sector(s)
* @param pdrv: Physical drive number (0..)
* @param *buff: Data buffer to store read data
* @param sector: Sector address (LBA)
* @param count: Number of sectors to read (1..128)
* @retval DRESULT: Operation result
*/
DRESULT USER_read (
BYTE pdrv, /* 物理扇区,多个设备时用到(0...) */
BYTE *buff, /* 数据缓存区 */
DWORD sector, /*扇区首地址in LBA */
UINT count /* 扇区个数(1..128) */
)
{
DRESULT res = RES_ERROR;
uint32_t timeout;
uint32_t alignedAddr;
alignedAddr = (uint32_t)buff & ~0x1F;
//更新相应的DCache
SCB_CleanDCache_by_Addr((uint32_t*)alignedAddr, count*BLOCKSIZE + ((uint32_t)buff - alignedAddr));
if(HAL_MMC_ReadBlocks_DMA(&hmmc1, (uint8_t*)buff,
(uint32_t) (sector),
count) == HAL_OK)
{
/* Wait that the reading process is completed or a timeout occurs */
timeout = HAL_GetTick();
while