【STM32】使用SDIO進行SD卡讀寫,包含文件管理FatFs(六)-FatFs使用的思路介紹


【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

這是一個日本人寫的,除了文件管理以外,還有其他的,例如解碼JPEG、紅外遙控等

在官網鏈接內,最下方有個Return,點擊后就可以看到相關的開源庫

 

以下開始正題(本文里提到的媒介,其實就是設備了,我不想改圖了...)

打開官方網站,頁面簡單明了,就分為4個區塊(以下圖片為FatFs官網上截取的圖片)

第一區塊、介紹及特性(Features):FatFs是文件管理系統,可用於SD卡、硬盤(ATA)、RTC時鍾,FTL和etc不清楚是什么,另外,也可以用於Flash或是EEPROM

 

第二區塊、應用接口(Application Interface):FatFs提供了接口,使得我們的應用可以和它交互。官網左側為一些接口的介紹,分四個部分

 第一部分:File Access(文件存取)

f_open 打開/創建文件
f_close 關閉文件
f_read 讀取文件
f_write 寫入文件
f_lseek 移動讀/寫指針,擴展大小
f_truncate 截斷文件
f_sync 刷新緩存數據
f_forward 轉移文件數據到一個數據流
f_expand 為文件分配一個連續的塊
f_gets 讀取一個字符串(string)
f_putc 寫入一個字符(character)
f_puts 寫入一個字符串(string)
f_printf 寫入一個格式化字符串
f_tell 獲取當前讀/寫指針
f_eof 文件結束測試
f_size 獲取長度
f_error 測試錯誤

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

第二部分:Directory Access(目錄訪問)

f_opendir 打開一個目錄
f_closedir 關閉一個已打開的目錄
f_readdir 讀取目錄
f_findfirst 打開一個目錄並讀取匹配的第一個項目
f_findnext 查找下一個匹配的項目

 

 

 

 

 

 

 

第三部分:File and Dirextor Management(文件和目錄管理)

f_stat 檢查文件或子目錄是否存在
f_unlink 刪除文件或子目錄
f_rename 重命名/移動文件或子目錄
f_chmod 更改文件或子目錄的屬性
f_utime 更改文件或子目錄的時間戳
f_mkdir 創建子目錄
f_chdir 更改當前目錄
f_chdive 更改當前驅動
f_getcwd 檢索當前目錄和驅動

 

 

 

 

 

 

 

 

 

 

 

第四部分:Volume Management and System Configuration(卷管理和系統配置)

f_mount 注冊/注銷一個工作區(掛起與否)
f_mkfs 在邏輯驅動上創建一個FAT卷
f_fdisk 在物理驅動上創建分區
f_getfree 獲取卷上的可用空間
f_getlabel 獲取卷標
f_setlabel 設置卷標
f_setcp 設置活動代碼頁

 

 

 

 

 

 

 

 

 

第三區塊、媒介訪問接口(Media Access Interface):你想管理的存儲設備,必須要和FatFs鏈接。官網左側為一些接口的介紹,分兩個部分

 第一部分:Storage Device Controls(存儲設備控件)

disk_status 獲取設備狀態
disk_initialize 初始化設備
disk_read 讀取數據
disk_write 寫入數據
disk_ioctl 控制設備相關功能

 

 

 

 

 

 

 

第二部分:Real Time Clock(實時時鍾)

get_fattime 獲取當前時間

 

 

 

第四區塊、資源(Resources):

 

 

在這4個區塊里,第2、3區塊就算是說明文檔了

我們先看第4個區塊:資源

下載一個FatFs版本看看,就《FatFs R0.11a》這個吧

解壓后,里面有2個檔案,doc和src

doc(documents)其實不用看,因為文件夾里面的網頁鏈接,其實就是文章開頭的官方鏈接

src(source)源碼,核心和接口都在這了,打開文件夾,里面的內容如下圖

圖片內《ffconf.h》說的精簡功能,指的是如果你只需要讀,不需要寫,那么可以在此頭文件里設置,最終調用《f_open》《f_close》《f_read》即可,可節約文件管理,所需占用的空間

《diskio》指的底層就是你想讀或寫的設備,可能是SD卡,或是Flash...等等

 

 

其實文章到這里,該說的都差不多了,下面這張圖,只是更詳細描繪了各文件的功用

像是《f_open()》《disk_read()》這些函數,分別在第二區塊和第三區塊都能找到

 

其實最終,我們完成三個任務就好(了解第2、3點的紅字,就能了解如何使用FatFs文件管理)

1、設定好《ffconf.h》的配置

2、連接我們的設備,修改《diskio.c》達成連接的目的(開源庫FatFs需要連接我們的設備

3、未來在我們的應用里,完全使用接口,來處理任何事情(調用開源庫,實現文件管理的功能

 

最后,來細講一下《diskio.c》,文章前面提到的第三區塊

如果你的應用,只要讀的功能就好,那么你實現(修改)下面三個函數就好

《disk_status》

《disk_initialize》

《disk_read》

 

如果還想要寫的功能,還必須額外實現下面三個函數

《disk_write》

《get_fattime》

《Disk_ioctl(CTRL_SYNC)》

 

如果想要格式化的功能,要實現下面兩個函數

《Disk_ioctl(GET_SECTOR_COUNT)》

《Disk_ioctl(GET_SECTOR_SIZE)》

 

還有一些其他的,有時間再補上吧

2021.01.16修改:我上方寫着第四區塊、資源(Resources)的圖片,里面的FatFs module application note鏈接點擊一下,就會發現如下這張圖》

圖片明確指示,如果你開啟了哪個宏定義,需要調用哪個接口函數,一行一行來理解,disk_ioctl我統一用控制函數來代稱

【1、不管任何時候(Always)】,你都需要實現三個函數:狀態(disk_status)、初始化(disk_initialize)和讀取(disk_read)

【2、如果只讀 == 0(FF_FS_READONLY == 0)(0為否,意思就是:只讀 == 否)】,你要實現三個函數:寫入(disk_write)、讀取當前時間(get_fattime)、控制函數(CTRL_SYNC,確保設備已完成掛起)

【3、如果需要格式化的功能(FF_USD_MKFS == 1)】,需要實現控制函數(GET_SECTOR_COUNT,檢測可用扇區)、控制函數(GET_BLOCK_SIZE,檢測塊的大小)

【4、如果扇區扇區大小不同(FF_MAX_SS  != FF_MIN_SS)】,需要實現控制函數(GET_SECTOR_SIZE)

【5、如果要擦除扇區上不需要的數據(FF_USE_TRIM == 1)】,需要實現控制函數(CTRL_TRIM)

【6、如果需要長文件名(FF_USE_LFN != 0)】,需要實現三個函數,ff_uni2oem、ff_oem2uni、ff_wtoupper

【7、如果需要重入功能(FF_FS_REENTRANT  == 1)】,需要實現ff_cre_syncobj、ff_del_syncobj、ff_req_grant、ff_rel_grant

【8、如果設定長文件名時,宏定義設置3(FF_USE_LFN == 3)】,你額外還需要實現兩個函數,ff_mem_alloc、ff_mem_free

 

 

本篇到這里就結束了,下一章開始移植的工作

 


免責聲明!

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



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