FATFS

??

(一),什么是文件管理系统

答:数据在PC上是以文件的形式储存在磁盘中的。这些数据的形式一般为ASCII码或二进制形式。简单点说就是:管理磁盘上的文件的方法的代码!

如:我们写到SD卡上面的数据管理一下,更科学的方法来管理

http://elm-chan.org/fsw/ff/00index_e.html,官网介绍 Resources以下是源代码

(二)。我们在移植时主要是那些函数?

答:Device Control Interface(硬件接口函数)

  • disk_status - Get device status                                             选择操纵的模块,此处用SD卡
  • disk_initialize - Initialize device                                                   初始化函数
  • disk_read - Read sector(s)                                                          读
  • disk_write - Write sector(s)                                                         写
  • disk_ioctl - Control device dependent features
  • get_fattime - Get current time

(三),例程:

1,我们用的是0.09版本号的

2。CC936.c中文字体库

①新建工作区间

	/* Register work area for each volume (Always succeeds regardless of disk status) */
	f_mount(0,&fs);  //(文件管理系统)注冊一个工作区间,工作空间命名为0。

那么工作区间的命名范围是什么呢?

答:

FRESULT f_mount (
	BYTE vol,		/* Logical drive number to be mounted/unmounted */
	FATFS *fs		/* Pointer to new file system object (NULL for unmount)*/
)
{
	FATFS *rfs;

	if (vol >= _VOLUMES)		/* Check if the drive number is valid */
		return FR_INVALID_DRIVE;

vol就是f_mount的第一个形參(命名),当他的值大于等于 _VOLUMES,就会返回错误

#define _VOLUMES	1  //can define 9
/* Number of volumes (logical drives) to be used. */

Parameters(官网)

Drive
Logical drive number (0-9) to register/unregister the work area.
FileSystemObject
Pointer to the work area (file system object) to be registered.

②然后再工作区间里面新建文件

/* function disk_initialize() has been called in f_open */

/* Create new file on the drive 0 */
res = f_open(&fnew, "0:newfile.txt", FA_CREATE_ALWAYS | FA_WRITE );

OPEN的属性:

1.怎么打开呢?

FA_CREATE_ALWAYS 总是以创建总是新建的形式打开这个文件

FA_WRITE:此文件仅仅能写

2.看下open函数

FRESULT f_open (

FIL* FileObject,       /* Pointer to the blank file object structure */   文件指针,把打开的文件关联到这个指针连

const TCHAR* FileName, /* Pointer to the file neme */        文件名称字

BYTE ModeFlags         /* Mode flags */               属性     

);  

属性:

Value Description
FA_READ Specifies read access to the object. Data can be read from the file. Combine with
FA_WRITE for read-write access.
FA_WRITE Specifies write access to the object. Data can be written to the file. Combine with
FA_READ for read-write access.
FA_OPEN_EXISTING Opens the file. The function fails if the file is not existing. (Default)
FA_OPEN_ALWAYS Opens the file if it is existing. If not, a new file is created. To append data to the file, use
f_lseek function after file open in this method.
FA_CREATE_NEW Creates a new file. The function fails with FR_EXIST if the file is existing.
FA_CREATE_ALWAYS Creates a new file. If the file is existing, it is truncated and overwritten.

能够第一次打开用:FA_CREATE_NEW。之后打开用:FA_OPEN_EXISTING(已存在)就能够了

或者:总是打开。总是关闭

当用到:FA_CREATE_ALWAYS时,我们要将  #define _FS_READONLY 0 /* 0:Read/Write or 1:Read only */    打开

3.对于返回值(Return Values):我们仅仅測试:FR_OK(是否成功)

③往该文件内写数据

if ( res == FR_OK )
{
	res = f_write(&fnew, textFileBuffer, sizeof(textFileBuffer), &bw);
	f_close(&fnew);      写完之后,把该文件关掉
}

④关掉之后再打开它

res = f_open(&fnew, "0:newfile.txt", FA_OPEN_EXISTING | FA_READ); 	// FA_READ:此时打开定义可读

⑤读取数据

res = f_read(&fnew, buffer, sizeof(buffer), &br);

⑥打印之后关闭

printf("\r\n %s ", buffer);

/* Close open files */
f_close(&fnew);

⑦在文件系统中注冊掉刚才开辟的“0”工作区间

/* Unregister work area prior to discard it */
f_mount(0, NULL);

(四)文件管理系统与SD卡的关联!

1。Application:就是我们主函数中使用的那些上层函数

2,中间是文件系统模块,文件系统要操纵底层SD卡的时候呢还须要  Low level disk I/O。这一部分驱动,这一部分驱动须要我们自己写

/*-------------------------- SD Init ----------------------------- */
  Status = SD_Init();
	if (Status!=SD_OK )
	{
		return STA_NOINIT;
	}
	else
	{
		return RES_OK;
	}

}

/*-----------------------------------------------------------------------*/
/* Return Disk Status                                                    */

DSTATUS disk_status (
	BYTE drv		/* Physical drive nmuber (0..) */
)
{
	return RES_OK;
}

底层的磁盘的读/写

/*-----------------------------------------------------------------------*/
/* Read Sector(s)                                                        */

DRESULT disk_read (
	BYTE drv,		/* Physical drive nmuber (0..) */
	BYTE *buff,		/* Data buffer to store read data */
	DWORD sector,	/* Sector address (LBA) */
	BYTE count		/* Number of sectors to read (1..255) */
)
{

	if (count > 1)           //多个磁盘
	{
		SD_ReadMultiBlocks(buff, sector*BLOCK_SIZE, BLOCK_SIZE, count);

			  /* Check if the Transfer is finished */
	     SD_WaitReadOperation();  //循环查询dma传输是否结束

	    /* Wait until end of DMA transfer */
	    while(SD_GetStatus() != SD_TRANSFER_OK);
	}
	else							       //单个磁盘
	{

		SD_ReadBlock(buff, sector*BLOCK_SIZE, BLOCK_SIZE);

			  /* Check if the Transfer is finished */
	     SD_WaitReadOperation();  //循环查询dma传输是否结束

	    /* Wait until end of DMA transfer */
	    while(SD_GetStatus() != SD_TRANSFER_OK);

	}
	return RES_OK;
}

/*-----------------------------------------------------------------------*/
/* Write Sector(s)                                                       */

#if _READONLY == 0
DRESULT disk_write (
	BYTE drv,			/* Physical drive nmuber (0..) */
	const BYTE *buff,	/* Data to be written */
	DWORD sector,		/* Sector address (LBA) */
	BYTE count			/* Number of sectors to write (1..255) */
)
{

	if (count > 1)
	{
		SD_WriteMultiBlocks((uint8_t *)buff, sector*BLOCK_SIZE, BLOCK_SIZE, count);

		  /* Check if the Transfer is finished */
	  	 SD_WaitWriteOperation();	   //等待dma传输结束
	    while(SD_GetStatus() != SD_TRANSFER_OK); //等待sdio到sd卡传输结束
	}
	else
	{
		SD_WriteBlock((uint8_t *)buff,sector*BLOCK_SIZE, BLOCK_SIZE);

		  /* Check if the Transfer is finished */
	   		SD_WaitWriteOperation();	   //等待dma传输结束
	    while(SD_GetStatus() != SD_TRANSFER_OK); //等待sdio到sd卡传输结束
	}
	return RES_OK;
}
#endif /* _READONLY */

IO控制为空(直接返回OK)

/*-----------------------------------------------------------------------*/
/* Miscellaneous Functions                                               */

DRESULT disk_ioctl (
	BYTE drv,		/* Physical drive nmuber (0..) */
	BYTE ctrl,		/* Control code */
	void *buff		/* Buffer to send/receive control data */
)
{
	return RES_OK;
}

                           嵌入式刚開始学习的人,看到此文的大神们,有什么错误的地方多多意见啊!

时间: 2024-12-23 16:00:54

FATFS的相关文章

Zynq Fatfs文件系统应用笔记

Zynq Fatfs文件系统应用笔 Hello,panda 笔记介绍基于所描述的Zynq Fatfs基于Xilinx xilffsv3.0和Sdpsv2.4,文件系统采用在Bare-Metal和轻量级操作系统中常用的FatFs,版本为v0.10b. 在开始介绍FatFs文件系统在Zynq实现之前一定要先对FAT32文件系统有一个清晰的了解. 1 FAT32文件系统 应用笔记针对SD上的FAT32文件系统,在对文件系统作详细介绍之前,先回顾一下硬盘的结构,如图1: 图1 硬盘结构 对一个机械硬盘而

S3C2416裸机开发系列十七_GCC下Fatfs的移植

S3C2416裸机开发系列十七 GCC下Fatfs的移植 象棋小子    1048272975 对于固态存储器,其存储容量可以很大,往往需要一款文件系统对存储器用户数据进行组织文件的管理.它对文件存储器空间进行组织和分配,负责文件的存储并对存入的文件进行保护和检索.在嵌入式系统中,往往需要采用windows兼容的文件系统,像相机的照片.视频监控.语音产品等,很多都需要从windows计算机上提取资源或在windows计算机上进一步处理.Fatfs由于其开源免费,支持fat32,受到了广泛的应用,

随想录(fatfs的学习)

[ 声明:版权全部,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 上学的时候就对文件系统非常有兴趣.可是苦于没有合适的fs代码能够学习.市面上的fs代码,要么太大.像linux一样,动不动就是几万行,几十万行.要么就是没有开源,你仅仅会使用它的接口,却不太清楚里面是怎么实现的. 一直到后来工作的时候,发现了fatfs这么一个开源库代码. fatfs大小合适.内容也比較紧凑.仅仅要做好底层的接口移植就能够使用了.眼下fatfs用来管理最多的还是sd卡设备,n

fatfs源码阅读

使用fatfs文件的第一步,就是调用F_mount函数注册一个工作空间. F_mount函数的原型如下: 第一个参数根据网上大神的答复,是外设类型,如果是sd卡就是0,flash等等其他的外设就是其他得数,据说有定义,不过我没找到. 第二个参数FATFS指针就是工作空间的指针,个人感觉有点lwip网卡数据结构的感觉. FATFS数据结构及解释如下,个人感觉了解FATFS这个工作空间数据结构是什么东西就行: typedef struct {    BYTE    fs_type;      /* 

STM32-移植FATFS的NANDFLASH驱动

一,建立工程FATFS源码 1,在http://elm-chan.org/fsw/ff/00index_e.html上下载ff007c.zip,并把ff007c.zip里面的 src文件夹复制到D:\works\EK-STM3210E-UCOSII下,并改名为Fatfs: 2,在IDE工程中右击选择“Add Group”建立“FATFS”文件组,并在“FATFS”上右击选择“Add Files”添加 D:\works\EK-STM3210E-UCOSII\Fatfs下的C文件: 3,把D:\wo

FatFs模块系统应用指南

本文使用的FatFs版本为:V0.12b(2016年9月4发布) 1.如何移植 1.1首要考虑 FatFs模块移植基于以下假设条件: ANSI C: 编译器应遵循ANSI C.FatFs模块是以ANSI C(C89标准)语言编写的中间件软件,它不依赖任何硬件平台,只要相应的编译器支持ANSI C. 整形类型大小: FatFs模块假设char/short/long类型变量大小为8/16/32位.假设int类型变量为16或32位.这些内容定义在文件integer.h中,对大多数编译器而言,默认的定义

【基于STM32F407IGT6】STemWin5.20d + uCOS-III + FatFS程序下载

[基于STM32F407IGT6]STemWin5.20d + uCOS-III + FatFS程序下载

FATFS外置UNICODE GBK双向转换码表(转)

源:FATFS外置UNICODE GBK双向转换码表 将UtoG,GtoU双向码表放到存储卡里面实现长文件名,因为FATFS长文件名需要unicode支持, 首先将UtoG.sys,GtoU.sys两个文件放到SD卡根目录,注意,一定要在根目录,并且是短文件名,因为长文件名需要UNICODE支持,此时的FATFS还是不支持长文件名的,但是当初始化UNICODE码表后就可以支持长文件名了. 两个码表下载地址:http://download.csdn.net/detail/cp1300/552673

unicode转GBK,GNK转unicode,解决FATFS中文码表占用ROM问题(转)

源:unicode转GBK,GNK转unicode,解决FATFS中文码表占用ROM问题 之前一直使用的512KB ROM的STM32,但是最近使用的只有128KB,想用FATFS显示支持长文件名,发现添加CC936.C后ROM肯定不够的,就决定将这个双向码表存储到外部存储器中,flash或者SD卡都行,只有能读就行; 更改后的CC936.C中的编码转换函数 WCHAR ff_convert ( /* Converted code, 0 means conversion error */ WCH