SD卡与fatfs文件系统(1)

xiaoxiao2021-02-28  15

    SD的优势之一是它的便携性,它可以自由插拔,可以在嵌入式设备和PC机之间交换数据。如果使用FAT(File Allocation Table)文件系统,它便可以方便在安装windows的PC和嵌入式设备之间交换数据。一个完整的FAT文件系统代码量非常庞大,不适合资源较少的嵌入式系统,于是就需要一个微型的FAT文件系统,FatFs就是基于这样的目的而开发的。

    FatFS是一个专为小型嵌入式系统设计的通用FAT文件系统模块。FatFs具有较高的可配置性,最小配置仅使用1K的RAM空间,非常适用于嵌入式系统。FatFs 的编写遵循ANSI C,并且完全与磁盘I/O层分开。因此,它独立(不依赖)于硬件架构。它可以被嵌入到低成本的微控制器中,如AVR, 8051, PIC, ARM, Z80, 68K 等等,而不需要做任何修改。

特点

Windows兼容的FAT文件系统不依赖于平台,易于移植代码和工作区占用空间非常小多种配置选项: 多卷(物理驱动器和分区) 多ANSI/OEM代码页,包括DBCS 在ANSI/OEM或Unicode中长文件名的支持 RTOS的支持 多扇区大小的支持 只读,最少API,I/O缓冲区等等

FatFs的源代码只有几个文件:diskio.c,ff.c,ff_util.c,tff.c及头文件。diskio.c是磁盘操作的代码文件(这个文件是移植时要实现的),ff.c是一般FatFs的代码文件,tff.c是微型FatFs的代码文件,ff_util.c是几个辅助函数。integer.h是内部基本类型的定义,ff.h是一般FatFs包含的头文件,tff.h是微型FatFs包含的头文件。

[cpp] view plain copy print ? #if _FATFS_TINY != 1  #include <fatfs/src/ff.h>  #else  #include <fatfs/src/tff.h>  #endif  #include <fatfs/src/ff_util.h>   #if _FATFS_TINY != 1 #include <fatfs/src/ff.h> #else #include <fatfs/src/tff.h> #endif #include <fatfs/src/ff_util.h>

微型FatFs配置最小时仅占用内存1KB,但它是一个只读的FAT系统。

FatFs的配置文件是fatfs_config.h: [cpp] view plain copy print ? //——————————————————————————  //      General Definitions (previously in ff.h)  //——————————————————————————    #define _FATFS_TINY 0  /* When _FATFS_TINY is set to 1, fatfs is compiled in Tiny mode / Else, it is compiled in normal mode  / Tiny FatFs feature : Very low memory consumption, suitable for small memory  / system. (1KB RAM) : Supports only single drive, no disk format,  / only read functions, no write functions */    //——————————————————————————  //      Definitions for normal FATFS (previously in ff.h)  //——————————————————————————    #if _FATFS_TINY == 0    #define _MCU_ENDIAN     2  /* The _MCU_ENDIAN defines which access method is used to the FAT structure. /  1: Enable word access. /  2: Disable word access and use byte-by-byte access instead. /  When the architectural byte order of the MCU is big-endian and/or address /  miss-aligned access results incorrect behavior, the _MCU_ENDIAN must be set to 2. /  If it is not the case, it can also be set to 1 for good code efficiency. */    #define _FS_READONLY    0  /* Setting _FS_READONLY to 1 defines read only configuration. This removes /  writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename, /  f_truncate and useless f_getfree. */    #define _FS_MINIMIZE    0  /* The _FS_MINIMIZE option defines minimization level to remove some functions. /  0: Full function. /  1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename are removed. /  2: f_opendir and f_readdir are removed in addition to level 1. /  3: f_lseek is removed in addition to level 2. */    #define _USE_STRFUNC    0  /* To enable string functions, set _USE_STRFUNC to 1 or 2. */    #define _USE_FSINFO 1  /* To enable FSInfo support on FAT32 volume, set _USE_FSINFO to 1. */    #define _USE_SJIS   1  /* When _USE_SJIS is set to 1, Shift-JIS code transparency is enabled, otherwise /  only US-ASCII(7bit) code can be accepted as file/directory name. */    #define _USE_NTFLAG 1  /* When _USE_NTFLAG is set to 1, upper/lower case of the file name is preserved. /  Note that the files are always accessed in case insensitive. */    #define _USE_MKFS   1  /* When _USE_MKFS is set to 1 and _FS_READONLY is set to 0, f_mkfs function is /  enabled. */    #define _DRIVES     2  /* Number of logical drives to be used. This affects the size of internal table. */    #define _MULTI_PARTITION    0  /* When _MULTI_PARTITION is set to 0, each logical drive is bound to same /  physical drive number and can mount only 1st primaly partition. When it is /  set to 1, each logical drive can mount a partition listed in Drives[]. */    //——————————————————————————  //      Definitions for normal FATFS TINY (previously in tff.h)  //——————————————————————————    #else    #define _MCU_ENDIAN     2  /* The _MCU_ENDIAN defines which access method is used to the FAT structure. /  1: Enable word access. /  2: Disable word access and use byte-by-byte access instead. /  When the architectural byte order of the MCU is big-endian and/or address /  miss-aligned access results incorrect behavior, the _MCU_ENDIAN must be set to 2. /  If it is not the case, it can also be set to 1 for good code efficiency. */    #define _FS_READONLY    1  /* Setting _FS_READONLY to 1 defines read only configuration. This removes /  writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename, /  f_truncate, f_getfree and internal writing codes. */    #define _FS_MINIMIZE    0  /* The _FS_MINIMIZE option defines minimization level to remove some functions. /  0: Full function. /  1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename are removed. /  2: f_opendir and f_readdir are removed in addition to level 1. /  3: f_lseek is removed in addition to level 2. */    #define _USE_STRFUNC    0  /* To enable string functions, set _USE_STRFUNC to 1 or 2. */    #define _USE_FSINFO 1  /* To enable FSInfo support on FAT32 volume, set _USE_FSINFO to 1. */    #define _USE_SJIS   1  /* When _USE_SJIS is set to 1, Shift-JIS code transparency is enabled, otherwise /  only US-ASCII(7bit) code can be accepted as file/directory name. */    #define _USE_NTFLAG 1  /* When _USE_NTFLAG is set to 1, upper/lower case of the file name is preserved. /  Note that the files are always accessed in case insensitive. */    #define _USE_FORWARD    0  /* To enable f_forward function, set _USE_FORWARD to 1. */    #define _FAT32  1  /* To enable FAT32 support in addition of FAT12/16, set _FAT32 to 1. */    #endif    //——————————————————————————  //      Other definitions  //——————————————————————————    /*———————————————————————–*/  /* Correspondence between drive number and physical drive                */  /* Note that Tiny-FatFs supports only single drive and always            */  /* accesses drive number 0.                                              */    #define DRV_MMC          0  #define DRV_SDRAM        1  #define DRV_ATA          2  #define DRV_USB          3      #define SECTOR_SIZE_SDRAM  512  #define SECTOR_SIZE_SDCARD 512   //------------------------------------------------------------------------------ // General Definitions (previously in ff.h) //------------------------------------------------------------------------------ #define _FATFS_TINY 0 /* When _FATFS_TINY is set to 1, fatfs is compiled in Tiny mode / Else, it is compiled in normal mode / Tiny FatFs feature : Very low memory consumption, suitable for small memory / system. (1KB RAM) : Supports only single drive, no disk format, / only read functions, no write functions */ //------------------------------------------------------------------------------ // Definitions for normal FATFS (previously in ff.h) //------------------------------------------------------------------------------ #if _FATFS_TINY == 0 #define _MCU_ENDIAN 2 /* The _MCU_ENDIAN defines which access method is used to the FAT structure. / 1: Enable word access. / 2: Disable word access and use byte-by-byte access instead. / When the architectural byte order of the MCU is big-endian and/or address / miss-aligned access results incorrect behavior, the _MCU_ENDIAN must be set to 2. / If it is not the case, it can also be set to 1 for good code efficiency. */ #define _FS_READONLY 0 /* Setting _FS_READONLY to 1 defines read only configuration. This removes / writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename, / f_truncate and useless f_getfree. */ #define _FS_MINIMIZE 0 /* The _FS_MINIMIZE option defines minimization level to remove some functions. / 0: Full function. / 1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename are removed. / 2: f_opendir and f_readdir are removed in addition to level 1. / 3: f_lseek is removed in addition to level 2. */ #define _USE_STRFUNC 0 /* To enable string functions, set _USE_STRFUNC to 1 or 2. */ #define _USE_FSINFO 1 /* To enable FSInfo support on FAT32 volume, set _USE_FSINFO to 1. */ #define _USE_SJIS 1 /* When _USE_SJIS is set to 1, Shift-JIS code transparency is enabled, otherwise / only US-ASCII(7bit) code can be accepted as file/directory name. */ #define _USE_NTFLAG 1 /* When _USE_NTFLAG is set to 1, upper/lower case of the file name is preserved. / Note that the files are always accessed in case insensitive. */ #define _USE_MKFS 1 /* When _USE_MKFS is set to 1 and _FS_READONLY is set to 0, f_mkfs function is / enabled. */ #define _DRIVES 2 /* Number of logical drives to be used. This affects the size of internal table. */ #define _MULTI_PARTITION 0 /* When _MULTI_PARTITION is set to 0, each logical drive is bound to same / physical drive number and can mount only 1st primaly partition. When it is / set to 1, each logical drive can mount a partition listed in Drives[]. */ //------------------------------------------------------------------------------ // Definitions for normal FATFS TINY (previously in tff.h) //------------------------------------------------------------------------------ #else #define _MCU_ENDIAN 2 /* The _MCU_ENDIAN defines which access method is used to the FAT structure. / 1: Enable word access. / 2: Disable word access and use byte-by-byte access instead. / When the architectural byte order of the MCU is big-endian and/or address / miss-aligned access results incorrect behavior, the _MCU_ENDIAN must be set to 2. / If it is not the case, it can also be set to 1 for good code efficiency. */ #define _FS_READONLY 1 /* Setting _FS_READONLY to 1 defines read only configuration. This removes / writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename, / f_truncate, f_getfree and internal writing codes. */ #define _FS_MINIMIZE 0 /* The _FS_MINIMIZE option defines minimization level to remove some functions. / 0: Full function. / 1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename are removed. / 2: f_opendir and f_readdir are removed in addition to level 1. / 3: f_lseek is removed in addition to level 2. */ #define _USE_STRFUNC 0 /* To enable string functions, set _USE_STRFUNC to 1 or 2. */ #define _USE_FSINFO 1 /* To enable FSInfo support on FAT32 volume, set _USE_FSINFO to 1. */ #define _USE_SJIS 1 /* When _USE_SJIS is set to 1, Shift-JIS code transparency is enabled, otherwise / only US-ASCII(7bit) code can be accepted as file/directory name. */ #define _USE_NTFLAG 1 /* When _USE_NTFLAG is set to 1, upper/lower case of the file name is preserved. / Note that the files are always accessed in case insensitive. */ #define _USE_FORWARD 0 /* To enable f_forward function, set _USE_FORWARD to 1. */ #define _FAT32 1 /* To enable FAT32 support in addition of FAT12/16, set _FAT32 to 1. */ #endif //------------------------------------------------------------------------------ // Other definitions //------------------------------------------------------------------------------ /*-----------------------------------------------------------------------*/ /* Correspondence between drive number and physical drive */ /* Note that Tiny-FatFs supports only single drive and always */ /* accesses drive number 0. */ #define DRV_MMC 0 #define DRV_SDRAM 1 #define DRV_ATA 2 #define DRV_USB 3 #define SECTOR_SIZE_SDRAM 512 #define SECTOR_SIZE_SDCARD 512

转载请注明原文地址: https://www.6miu.com/read-200390.html

最新回复(0)