Fatfs檔案系統學習

2021-08-01 23:10:34 字數 1884 閱讀 2557

移植過程網上有很多,直接參考就可以了。

1、學習過程對api重新理解

f_mout();  

f_mout(&fs,"0:",0);  // 掛載

f_mout(0,"0:",0);   // 解除安裝

一直對解除安裝有錯誤的認識,一直以為解除安裝的時候第乙個形參還是&fs。  

2、英文長檔名的實現

英文長檔名的實現參考了這個朋友的帖子。

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

這樣再用指標的時候就不會出錯了。

fatfs檔案系統

使用stm32cubemx新增fatfs下的user defined,開啟工程,檢視 可以發現 中先呼叫了mx fatfs init 函式,而此函式又呼叫了 fatfs linkdriver 函式,繼續查詢fatfs linkdriver 函式,發現此函式第乙個變數為diskio drvtypede...

FATFS檔案系統

二 修改fatfs 主要修改底層裝置驅動函式 diskio.c 目的 就是把 diskio.c 中的函式介面與spi flash 晶元驅動連線起來。總共有五個函式,分別為裝置狀態獲取 disk status 裝置初始化 disk initialize 扇區讀取 disk read 扇區寫入 disk...

檔案系統學習(3)

一 說在前面 在嵌入式中呢,首先uboot的最終目的是啟動我們的核心,核心的目的是啟動我們的應用程式。怎麼啟動的呢?我們來分析下init post 這個函式 static int noinline init post void 如果uboot中的bootargs中有設定init,if就會被執行。而且...