配置 FATFS 支持长文件名

FATFS 版本:Nov 09 14 R0.10c

在 FATFS 已经移植好的基础上,首先打开 ffconf.h 配置文件,找到如下图配置项:

1319058-20180417191442187-1493459063.png

可以将此值从 0 改为 1 使用 static working buffer on the BSS,但官方不建议这么做,会产生线程安全问题(Always NOT thread-safe.);
我采用的配置 2,使用栈来分配 LFN working buffer,官方提示的(take care on stack overflow)很良心,当时我是用 STM32RCT6 来做的此实验,发现无法输出 SD 卡内的文件名,百思不得其解,后来突然想到了这个提示,故将栈区放大试一试,果然成功了。修改方法如下(在 STM32 的启动文件中修改):

1319058-20180417191121620-1477715531.png

初始值为 0x00000400 为 1kbytes,改为 0x00001000 4kbytes。

当然我们可以在单片机上模拟出个内存管理,实现 mallock free 等函数,这时我们就可以将此项配置为 3 ,以堆的方式来实现(Enable LFN with dynamic working buffer on the HEAP.),这里我们不做此介绍。

为了能够支持中文,还需要把 _CODE_PAGE 的值改为 936,并把 option/cc936.c 文件添加到工程中, 如下图所示:

1319058-20180417191455729-2035336417.png

实例演示:

调用如下代码:

u8 scan_files(u8 * path)
{
    FRESULT res;
    char buf[512] = {0};    
  char *fn;
    
#if _USE_LFN
    fileinfo.lfsize = _MAX_LFN * 2 + 1;
    fileinfo.lfname = buf;
#endif        

    res = f_opendir(&dir,(const TCHAR*)path);
    if (res == FR_OK) 
    {   
        printf("\r\n"); 
        
        while(1){
            
            res = f_readdir(&dir, &fileinfo);                
            if (res != FR_OK || fileinfo.fname[0] == 0) break;  

#if _USE_LFN
            fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;
#else                              
            fn = fileinfo.fname;
#endif      
        
            /* 输出目录及文件名 */
            printf("%s/", path);            
            printf("%s\r\n", fn);           
        } 
  }   

    return res;   
}
串口输出如下:

1319058-20180417191253385-1347821542.png

转载于:https://www.cnblogs.com/GyForever1004/p/8868922.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值