【STM32】使用SDIO進行SD卡讀寫,包含文件管理FatFs(終)-配合內存管理來遍歷SD卡


 

【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
有問題的話,可以在評論區留言,我能幫的我盡量幫
這里也謝謝大家的閱讀
View Code

 

 

由於遍歷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 }
View Code

當然,你這么寫的話,會牽扯到正點原子的另一個源文件《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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM