FATFS

摘要:
回答:FRESULTf_Mount{FATFS*rfs;如果/*检查驱动器号是否有效*/returnFR_INVALID_DRIVE;vol是f_Mount的第一个参数(名称)。当其值大于或等于_VOLUMES时,错误#define_VOLUMES1//可以定义9/*要使用的卷数。*/参数(官方网站)DriveLogicaldrivenumber(0-9)将返回到注册/注销工作区。文件系统对象指向要注册的工作区。② 然后在工作范围内创建一个新文件/*functiondisk_ initialize()已被调用为f_open*//*Createnewfileonthedrive0*/res=f_open;OPEN属性:1.如何打开?使用:FA_CREATE_ALLWAYS时始终关闭。在Always中,我们需要定义#_FS_READONLY 0/*0:Read/Writeor1:READONLY*/Open 3。对于返回值:我们只测试:FR_OK③ 如果{res=f_Write;f_close;写入后,关闭文件},则将数据写入文件④ 关闭它,然后打开它res=f_open;//FA_READ:此时,打开定义以提高可读性⑤ 读取数据res=f_Read;⑥ 打印后关闭printf/*Closeopenfiles*/f_Close;⑦ 在文件系统中注册刚才打开的“0”工作范围/*取消注册workareapriorodiscaredit*/f_mount;(4) 文件管理系统和SD卡之间的关联!


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

答:数据在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 */               属性     
);  

属性:

ValueDescription
FA_READSpecifies read access to the object. Data can be read from the file. Combine with FA_WRITE for read-write access.
FA_WRITESpecifies write access to the object. Data can be written to the file. Combine with FA_READ for read-write access.
FA_OPEN_EXISTINGOpens the file. The function fails if the file is not existing. (Default)
FA_OPEN_ALWAYSOpens 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_NEWCreates a new file. The function fails with FR_EXIST if the file is existing.
FA_CREATE_ALWAYSCreates 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("
 %s ", buffer);
		
/* Close open files */
f_close(&fnew);

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

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

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

FATFS第1张

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;
}

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

免责声明:文章转载自《FATFS》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ArcGIS基础篇(1)——如何将本地制作的模型进行拷贝?ASP.Net Core 中使用Zookeeper搭建分布式环境中的配置中心系列一:使用Zookeeper.Net组件演示基本的操作下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

VMWare Workstation Pro 15使用教程

1.虚拟化产品应用场景 学习教学 企业中搭建测试环境 生产环境 虚拟机可以在不同的硬件服务器之间迁移 物理机抓取到虚拟机 2.主流的虚拟化产品 VMWare Workstation 15.5 免费 下载地址: https://www.vmware.com/cn.html VMWare Workstation的使用说明:https://docs.vmware...

安卓系统手机目录

一、文件夹 1./acct/    系统回收站,删除的系统文件。     2./cache/    缓存     3./data/    用户的所有程序相关数据     app/    所有用户安装的apk文件     app-private/     data/    每一个应用的数据         com.xx.appname/    每一个应用的数...

Android中SD卡内容读取和简易FTP文件上传(番外)

  大家好,又是一周一次的拔旗时间。本周公司事情较多,原本安排的关于MediaPlayer多媒体应用的技术在本周内分享的事宜要歌啦~ 为了不女装,这次的技术分享内容关于Android中SD卡处理和FTP上传功能,算是一个番外篇(其实我才不告诉你们我是代码没有写完)。So,下面正式开始吧。 Android中SD卡内容读取          有人可能会问,这有...

磁盘调度管理

磁盘调度管理 一、设计目的: 加深对请求磁盘调度管理实现原理的理解,掌握磁盘调度算法。 二、设计内容: 通过编程实现不同磁盘调度算法。 设定开始磁道号寻道范围,依据起始扫描磁道号和最大磁道号数,随机产生要进行寻道的磁道号序列。选择磁盘调度算法,显示该算法的磁道访问顺序,计算出移动的磁道总数和平均寻道总数。 常用的磁盘调度算法简介如下,请在最短寻道优先算法S...

linux 常用操作以及概念

一、常用操作以及概念 查看LINUX发行版的名称及其版本号的命令: lsb_release -a cat /etc/redhat-release(针对redhat,Fedora) 0.rpm包路径:/mnt/Packages 1. --help 指令的基本用法与选项介绍。 2. man man 是 manual 的缩写,将指令的具体信息显示出来。...

linux 系统⽇常管理--运维必备

【监控系统的状态】 1. w 查看当前系统的负载  相信所有的linux管理员最常⽤的命令就是这个’w’ 了,该命令显⽰的信息还是蛮丰富 的。第⼀⾏从左⾯开始显⽰的信息依次为:时间,系统运⾏时间,登录⽤户数,平均 负载。第⼆⾏开始以及下⾯所有的⾏,告诉我们的信息是,当前登录的都有哪些⽤ 户,以及他们是从哪⾥登录的等等。其实,在这些信息当中,笔者认为我们...