zoukankan      html  css  js  c++  java
  • 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("
     %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;
    }
    

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

  • 相关阅读:
    8.移动和重命名文件
    7.复制文件和目录
    22.变基
    21.拉取&删除远程分支
    程序员必备课程——网络编程入门
    正则表达式——Java程序员懂你
    编程语言的基础——搞定JavaIO
    需加装饰——装饰模式
    结合提供者模式解析Jenkins源码国际化的实现
    算法族的集中管理——策略模式
  • 原文地址:https://www.cnblogs.com/jhcelue/p/6764082.html
Copyright © 2011-2022 走看看