博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FATFS(A)
阅读量:5796 次
发布时间:2019-06-18

本文共 5653 字,大约阅读时间需要 18 分钟。

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

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

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

,官网介绍 Resources下面是源码

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

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

  • - Get device status                                             选择操纵的模块,此处用SD卡
  • - Initialize device                                                   初始化函数                              
  • - Read sector(s)                                                          读
  • - Write sector(s)                                                         写
  • - Control device dependent features
  • - 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 == 0DRESULT 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;}

 

                           嵌入式初学者,看到此文的大神们,有什么错误的地方多多意见啊!

转载地址:http://xfbfx.baihongyu.com/

你可能感兴趣的文章
Tasks and Back stack 详解
查看>>
成功的背后!(给所有IT人)
查看>>
在SpringMVC利用MockMvc进行单元测试
查看>>
Nagios监控生产环境redis群集服务战
查看>>
Angular - -ngKeydown/ngKeypress/ngKeyup 键盘事件和鼠标事件
查看>>
Java利用httpasyncclient进行异步HTTP请求
查看>>
Python version 2.7 required, which was not foun...
查看>>
context:annotation-config vs component-scan
查看>>
经典sql
查看>>
typedef BOOL(WINAPI *MYFUNC) (HWND,COLORREF,BYTE,DWORD);语句的理解
查看>>
[BZOJ] 1012 [JSOI2008]最大数maxnumber
查看>>
gauss消元
查看>>
数据结构之链表与哈希表
查看>>
IIS7/8下提示 HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求...
查看>>
http返回状态码含义
查看>>
响应式网站对百度友好关键
查看>>
洛谷P2179 骑行川藏
查看>>
(十八)js控制台方法
查看>>
VB关键字总结
查看>>
android代码生成jar包并混淆
查看>>