Fatfs文件系统学习

来源:互联网 发布:大学生常用电脑软件 编辑:程序博客网 时间:2024/06/06 12:47

      移植过程网上有很多,直接参考就可以了。

1、学习过程对API重新理解

      f_mout();  

      f_mout(&fs,"0:",0);  // 挂载

      f_mout(0,"0:",0);   // 卸载

      一直对卸载有错误的认识,一直以为卸载的时候第一个形参还是&fs。  

2、英文长文件名的实现

      http://blog.csdn.net/lan120576664/article/details/48344311英文长文件名的实现参考了这个朋友的帖子。

     #define _CODE_PAGE  437    选择不同的编码格式

     #define _USE_LFN    3    长文件名的使能,文件名不同格式的转换需要内存区进行格式的转换。

        0 不使用长文件名,文件的名的长度最大12个字节包括格式(.txt)。

        1  使用长文件名,在bss段上开辟静态的工作存储区。

        2  使用长文件名,在栈上使用动态的工作区

        3  使用长文件名,在堆上使用动作的工作区

    #define _MAX_LFN  255   长文件名的最大字节个数。

   另外工程中还需要包括syscall.c  unicode.c  ccsbcs.c,编译过程中根据编译错误的提示进行修改即可。

    编译没有错误,使用f_open() 函数新建一个文件时,可能会返回错误FR_NOT_ENOUGH_CORE 长文件名没有足够的工作区,根据 _USE_LFN  的值去修改启动文件.s中堆或栈的大小,修改好后就可以使用长文件名了。

3、中文的支持

      #define _CODE_PAGE  936  

      #define _LFN_UNICODE   0    // 看有的网友说这里设置为1,设置为1后TCHAR的类型就变了,设置成0也能用我就没改,以后遇到问题再说。

       将cc936.c添加到文件中,编译提示ccsbcs.c和cc936.c文件的两个转换函数重复了,将ccsbcs.c中的两个转换函数屏蔽。

       cc936.c包含了两个转换数组,数组非常大,如果单片机的flash小的话放不下,可以将数组放到外挂的 spi的flash中,在转换函数中读数组得到数据进行解码(这个我还没做测试,现在单片机flash够用)。

4、目录的遍历

      实现中文名和长文件名以后,做了下目录的遍历,目前只测试了第一级目录的遍历。程序可以在网上搜一下做参考,主要记录一下做的过程中出现的问题。

     程序实现了第一级目录的遍历,通过printf()函数将目录内容输出到串口助手也是正确的。但是我将目录的内容在显示屏上显示的时候,出了点问题,如果名字是字符可以正确显示,但是只要遇到中文文件名字第一个中文的文件名字可以在lcd上显示,但是遍历直接就直接停止在这了,错误显示FR_INVALID_OBJECT。

     我将汉字的字库放在了sd卡上,显示汉字的时候通过算出汉字的偏移量,挂载SD卡,打开字库文件,做指针偏移,然后读出汉字的点阵,保存在数组中,关闭文件,函数返回。

     如果单独调用函数显示汉字显示多行也没有问题,但是只要遍历目录就会遇到问题。我想应该是读取汉字库的函数出了问题,最后确实是这里出了问题,在读汉字库的函数中,将挂载sd卡的语句就可以了。

      挂载sd卡,打开目录,读目录->显示目录。显示目录的函数中又挂载了sd卡,多次SD卡的挂载导致了显示完汉字目录后,再一次读目录的时候出错了,所有尽量在整个工程中只挂载一次SD卡。或者直接将字库写在SPI flash里,不用fatfs的函数操作SD卡避免错误的发生。

5、打开或者读写文件的时候,如果用的是文件指针,那么定义文件指针的时候必须给文件指针赋值。

     FIL *file;

    f_open(file,"0:a",FA_READ);

   因为没有给指针变量赋值,打开的时候将会返回FR_INVALID_OBJECT。可以定义一个数组,把数组的地址赋给file就行了。

   uint8_t  filebuff[sizeof(FIL)];

   FIL *file=(FIL *)filebuff;

  这样再用指针的时候就不会出错了。



原创粉丝点击