【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
本篇到這里就結束了,下一章開始移植的工作