配置 FATFS 支持長文件名

FATFS 版本:Nov 09 14 R0.10c

在 FATFS 已經移植好的基礎上,首先打開 ffconf.h 配置文件,找到如下圖配置項:

可以將此值從 0 改爲 1 使用 static working buffer on the BSS,但官方不建議這麼做,會產生線程安全問題(Always NOT thread-safe.);
我採用的配置 2,使用棧來分配 LFN working buffer,官方提示的(take care on stack overflow)很良心,當時我是用 STM32RCT6 來做的此實驗,發現無法輸出 SD 卡內的文件名,百思不得其解,後來突然想到了這個提示,故將棧區放大試一試,果然成功了。修改方法如下(在 STM32 的啓動文件中修改):

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

當然我們可以在單片機上模擬出個內存管理,實現 mallock free 等函數,這時我們就可以將此項配置爲 3 ,以堆的方式來實現(Enable LFN with dynamic working buffer on the HEAP.),這裏我們不做此介紹。

爲了能夠支持中文,還需要把 _CODE_PAGE 的值改爲 936,並把 option/cc936.c 文件添加到工程中, 如下圖所示:

實例演示:

調用如下代碼:

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;	  
}

串口輸出如下:

感謝花費寶貴的時間瀏覽, 轉載請註明出處。 本人將在[資源共享]分類下陸續加入學習過程中一些比較重要且有用處的資料、源碼,大家可前往下載,一起進步。 感謝支持!

配置 FATFS 支持長文件名 - Lance丶丶 - 博客園
https://www.cnblogs.com/GyForever1004/p/8868922.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章