FAT32 学习及注意事项

1 移植fatfs开源库

1.1 获取fatfs源码

从官网上取得源码: FatFs R0.14,网址为 http://elm-chan.org/fsw/ff/00index_e.html

1.2 实现diskio.c

首先确定使用设备的是属于什么类型,默认支持的类型有RAM,MMC,USB,不管使用什么类型,其实都可以在RAM类型中去实现接口,使用RAM类型,对应的驱动器号就是0,但是当使用MMC类型时,需要改一下配置,那就是 #define FF_VOLUMES 2 //MMC卡的驱动好是1,这里为2就足够

1.3 配置fatfs支持中文

#define FF_USE_LFN 1
#define FF_LFN_UNICODE 2 //使用utf-8编码的方式处理文件名
#define FF_CODE_PAGE 936 //支持简体中文
注:当编译的文件使用utf-8编码时,开启这两个选项会将utf-8转换为unicode以支持中文,另外不开启这两个选项,短文件名的方式也可以用一下方式创建中文文件名,但是文件名的长度就受到8.3规则的限制了。

    FIL fnew;
    FRESULT res_sd;                /* 文件操作结果 */
    path[0] = 0xc4;
    path[1] = 0xe3;
    path[2] = 0xba;
    path[3] = 0xc3;
    path[4] = '.';
    path[5] = 't';
    path[6] = 'x';
    path[7] = 't';
    path[8] = 0;
    res_sd = f_open(&fnew, path,FA_CREATE_ALWAYS | FA_WRITE );
    f_close(&fnew);

1.4 配置fatfs支持格式化

#define FF_USE_MKFS 1 //支持格式化

		res_sd=f_mkfs("1:",0,0,4096);
		if(res_sd == FR_OK){
           printf("》SD卡已成功格式化文件系统。\r\n");
           /* 格式化后,先取消挂载 */
           res_sd = f_mount(NULL,"1:",1);
           /* 重新挂载	*/
           res_sd = f_mount(&fs,"1:",1);
		}else{
			printf("《《格式化失败。》》\r\n");
			while(1);
		}

2 FAT32 目录项学习

2.1 FAT32 目录项分类

FAT32的目录项分为短文件名目录项和长文件名目录项,长文件名时,由多个长文件名目录项和一个短文件名目
录项组成。不管是长文件名目录项还是短文件目录项,大小都是32个字节。

2.2 短文件名目录项

截取至fatfs官网 FAT32说明注:使用短文件名时,文件名的长度为11个字节。
短文件需要符合8.3规则:文件名不得长于8个字节 扩展名不得长于3个字节,
文件名中的字符必须同时大写或者小写,扩展名中的字符必须同时大小或者小写。如果不满足条件,FAT32将用长文件名目录项描述该文件。
FAT32目录项都是使用大写字符的,当我们创建文件时
假如:
1、文件名大写,扩展名大写,DIR_NTRes值为0x00.
2、文件名大写,扩展名小写,DIR_NTRes值为0x10.
3、文件名小写,扩展名大写,DIR_NTRes值为0x08.
4、文件名小写,扩展名大写,DIR_NTRes值为0x18.
这是我经过测试所得到的数据,根据数据不妨假设如果文件名小写DIR_NTRes | 0x08,扩展名小写DIR_NTRes | 0x10。
另外FAT32对于ABC.txt以及Abcd.txt视为相同文件,尽管采用了不同目录项描述。
注意事项:
要特别注意mName [0]的值,有些文件系统如果没有对0xE5做一个转换,可能会导致创建文件失败。
当某些短文件名第一个字节为0xE5时,需要将0xE5替换为0x05。
1、如果mName [0] 为 0xE5,表示当前入口是已经删除了的。
2、 如果mName [0] 为 0x00,表示当前入口没有使用过,在这以后也没有分配目录入口了,如果是遍历的话,到这里就可以结束了。
3、 如果mName [0] 为 0x05,则实际文件名在这里的字符应该是0xE5。0xE5是 KANJI 引导字符。
4、如果文件名或扩展名字符数不够的话则以空格(0x20)填充。
5、 在mName中的英文字符都是以大写的形式存储。

2.3 长文件名目录项

长文件名存储在长文件名入口(LONG_DIR_ENTRY简写LDE)中,通常一个长文件名的完整数据需要一个SDE和一系列的LDE组成,LDE逆序存放。一个LDE大小为32字节。截取至fatfs官网 FAT32说明

LDIR_Ord:表示长文件序号,当LDIR_Ord & 0x40 = 0x40时,表示当前项是最后一个长文件的目录项,如下图所示,有长文件名逆序排放,则为2,1,短文件名目录项(携带文件属性)
截取至fatfs官网 FAT32说明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值