移植過程網上有很多,直接參考就可以了。
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就會被執行。而且...