【STM32】使用SDIO進行SD卡讀寫,包含文件管理FatFs(一)-初步認識SD卡
【STM32】使用SDIO進行SD卡讀寫,包含文件管理FatFs(二)-了解SD總線,命令的相關介紹
【STM32】使用SDIO進行SD卡讀寫,包含文件管理FatFs(三)-SD卡的操作流程
【STM32】使用SDIO進行SD卡讀寫,包含文件管理FatFs(四)-介紹庫函數,獲取一些SD卡的信息
【STM32】使用SDIO進行SD卡讀寫,包含文件管理FatFs(五)-文件管理初步介紹
【STM32】使用SDIO進行SD卡讀寫,包含文件管理FatFs(六)-FatFs使用的思路介紹
【STM32】使用SDIO進行SD卡讀寫,包含文件管理FatFs(七)-准備移植FatFs
【STM32】使用SDIO進行SD卡讀寫,包含文件管理FatFs(八)-認識內存管理
【STM32】使用SDIO進行SD卡讀寫,包含文件管理FatFs(終)-配合內存管理來遍歷SD卡
FatFs官網:http://elm-chan.org/fsw/ff/00index_e.html
終於要結束了,由於我的項目只要實現SD卡的讀取,所以我並不會執行SD卡寫入的相關CMD
至於FatFs,SD卡也只有做到讀取的功能
但未來我想寫個存儲器W25Qxx+FatFs,研究下FatFs格式化和FatFs如何寫入,就不局限於FatFs只做讀取的功能了
以下是我這幾篇博客的回顧,和一些牢騷....不想看的可以略過

【第一篇】介紹SD卡有兩種通訊模式,SPI和SDIO,以及介紹寄存器 【第二篇】介紹發送CMD所需的格式(SD卡聽從CMD命令來執行相關的操作),以及不同CMD的作用是什么 【第三篇】SD卡操作流程,經過一系列的操作,得知用戶的SD卡是哪個版本,以及相關信息 【第四篇】我使用的是STM32,所以來看它的庫函數,使用代碼實現第三篇的流程 【第五篇】文件管理如何運作,但對於我們使用第三方庫的來說,不一定要了解 【第六篇】FatFs思路介紹,有了思路,我們才知道要添加哪個文件,要修改哪個代碼 【第七篇】准備移植FatFs,但目前我只需要讀的功能,寫和初始化的接口,並沒有去實現 【第八篇】內存管理研究,因為想遍歷SD卡的內容 【終篇】嘗試遍歷SD卡 我在寫這幾篇博客,我參考和查閱了大量資料 其中幫助最大的,就是正點原子和野火 我這里實話實說,我只買了原子的開發板(探索者板子) 以道德上來講,我欠野火一個板子 我為什么會買正點原子的板子呢?因為我需要的一個功能,他有錄視頻,而野火沒有 在買開發板前,我也看過了兩家的視頻教程 其實,在前面幾章的視頻(講時鍾、講如何點亮LED之類的),相差不會很大 但是!后面幾章就不一樣了,我覺得正點原子錄到進階篇、高級篇這種的,越錄越懶。。。 野火講SDIO-SD卡,用了9個視頻,正點原子只用了1個.... 當然不止SDIO,FatFs也只用了1個.... 更令人不能接受的,我感覺他好像一直照着PPT念,那我直接看PPT就好了? 正點原子也不全都是缺點,在他的論壇里,活躍人數是比野火論壇還多的,有問題的話也可以在上面提問,得到答案的幾率會高那么一點點吧? 作為同樣是苦逼的程序員,以上這些只能算是個人建議(觀點僅僅代表個人) 希望大家能找到適合自己的學習方式吧 這里順便放上正點原子和野火的論壇 【正點原子】http://www.openedv.com/forum.php 【野火】https://www.firebbs.cn/forum.php 有問題的話,可以在評論區留言,我能幫的我盡量幫 這里也謝謝大家的閱讀
由於遍歷SD卡,我擔心用戶SD卡內,有長文件名的檔案,所以研究了這個東西
是否使用長文件名的設定,在《ffconf.h》里面,宏定義《_USE_LFN》就是了
它總共有4個數字可以設置,0、1、2、3
【0】下載開源庫FatFs時,默認的值,只有0是不使用長文件名的,因為可以節省資源
【1】使用長文件名,用全局變量(BSS)的方式
【2】使用長文件名,用棧(STACK)的方式
【3】使用長文件名,用堆(HEAP)的方式,這需要內存管理,也就是malloc(內存申請)和free(內存釋放)
至於長度(_MAX_LFN),按默認的值(255)吧
關於2、3點的地址,可以在這里修改(但我沒嘗試修改過,只是提供修改的地方在哪)
一旦我們決定使用長文件名的功能,還必須注意幾點
首先,我使用的是《10b》版本,我原先用的是11a的,但是讀取長文件名時(f_readdir),一直發生《FR_INVALID_OBJECT, /* (9) The file/directory object is invalid */》錯誤
后來改回10b版本才正常,當初我腦子真是進水了,我是真的參照正點原子和野火的版本,但不知道為什么,就是看走眼,看到11a版本。。。
不說了,回到正題,我每篇有涉及到FatFs的博客,在開頭都有給出FatFs官網
但請記住,官網會更新的,你所看到的圖片,也都是最新版本的
如果你用的是舊版本的FatFs,那么你應該去看下載的開源庫里,doc這個文件夾,如下圖
對比你會發現,有些出入的,我這里只說右半邊的,因為我使用的是《10b》這個版本
回到長文件的設定,官方說了,如果你要使用長文件(_USE_LFN >= 1),那么你要注意兩個函數
《ff_convert》編碼轉換
《ff_wtoupper》字符轉換
這兩個函數,在下圖可以找到,把某一個編碼添加到項目即可
至於你是要添加哪一個呢?看你的應用
《cc932》日文
《cc936》簡體中文
《cc949》韓文
《cc950》繁體中文
《ccsbcs》英文
正點原子用的是《_USE_LFN == 3》,用內存的方式來實現
你要使用《_USE_LFN == 3》的方式來實現,上圖doc內也說了,要額外實現兩個函數(對比《_USE_LFN == 1 或 2》的情況)
《ff_mem_alloc》內存申請
《ff_mem_free》內存釋放
這兩個函數,需要添加到《diskio.c》里面,代碼如下

1 //動態分配內存 2 void *ff_memalloc (UINT size) 3 { 4 return (void*)mymalloc(SRAMIN,size); 5 } 6 //釋放內存 7 void ff_memfree (void* mf) 8 { 9 myfree(SRAMIN,mf); 10 }
當然,你這么寫的話,會牽扯到正點原子的另一個源文件《malloc.c》,上一篇博客有
然后就內存申請吧,下圖截至正點原子源碼《源碼 實驗45 視頻播放器實驗》
紅框處是內存申請
第181行:f_readdir,就是遍歷了,並且有使用長文件名的功能
至於《_USE_LFN == 1》《_USE_LFN == 2》
我在看野火的視頻教程,里面有提到
是429挑戰者的視頻《25-SPI-FatFs文件系統(第3節-FATFS文件系統移植—包含超級詳細的移植過程)》
野火資料:http://doc.embedfire.com/products/link/zh/latest/index.html
正點原子資料:http://www.openedv.com/docs/index.html
其實我腦子再次進水了,我發現,根本不需要長文件名,因為我設備沒地方讓我顯示。。。
暫時先這樣吧
未來去研究W25Qxx + FatFs