STM32學習 使用檔案系統FAT

2021-08-19 06:34:02 字數 4367 閱讀 9446

1、我在使用stm32進行檔案操作時,學習和使用了fatfs檔案系統。如下圖所示,關鍵在於 fatfs module 和 lowlevel disk i/o layer。

2、在專案中需要將fatfs module 和 lowlevel disk i/o layer 各自 的內容分別定義好。我所涉及的專案,就包含了這樣的檔案。如下圖所示:

下方綠色文字,表示  lowlevel disk i/o layer   涉及的內容:

2.1.1 在diskio.h中,定義了很多的變數和巨集,也包括幾個關鍵的函式宣告:

dstatus disk_initialize (byte);    //底層初始化

dstatus disk_status (byte);

dresult disk_read (byte, byte*, dword, byte);

#if_readonly == 0

dresult disk_write (byte, const byte*, dword, byte);

#endif

dresult disk_ioctl (byte, byte, void*);

2.1.2 在diskio.c中,是對上述函式的實現,等等(包括一些中間函式)。而其中,使用者在使用時需要注意的是:

dstatus disk_initialize (byte drv)    /* physical drive nmuber (0..) */

return sta_noinit;

}

2.1.3 flash_init();被定義在flash.c檔案中。內部的spi_flash_init(); 是使用spi與flash溝通的引腳定義(gpio)。

u8 flash_init(void) 

return 0;

}

2.1.4 spi_flash_init(); 定義在spi.c中。

/*pb13,14,15   pb12是片選訊號*/

void spi_flash_init(void)

下方藍色文字表示 fatfs module  涉及的內容

2.2 首先要明確,fatfs module 使用的基礎函式 就是在  lowlevel disk i/o layer 中定義的函式。

fatfs module 將 基礎函式 封裝成 對應功能的 各種檔案操作函式:

fresult f_open (fil* fp, const tchar* path, byte mode);/* open or create a file */

fresult f_close (fil* fp);/* close an open file object */

fresult f_read (fil* fp, void* buff, uint btr, uint* br);/* read data from the file */

fresult f_write (fil* fp, const void* buff, uint btw, uint* bw);/* write data to the file */

fresult f_lseek (fil* fp, fsize_t ofs);/* move file pointer of the file object */

fresult f_truncate (fil* fp);/* truncate the file */

fresult f_sync (fil* fp);/* flush cached data of the writing file */

fresult f_opendir (dir* dp, const tchar* path);/* open a directory */

fresult f_closedir (dir* dp);/* close an open directory */

fresult f_readdir (dir* dp, filinfo* fno);/* read a directory item */

fresult f_findfirst (dir* dp, filinfo* fno, const tchar* path, const tchar* pattern);/* find first file */

fresult f_findnext (dir* dp, filinfo* fno);/* find next file */

fresult f_mkdir (const tchar* path);/* create a sub directory */

fresult f_unlink (const tchar* path);/* delete an existing file or directory */

fresult f_rename (const tchar* path_old, const tchar* path_new);/* rename/move a file or directory */

fresult f_stat (const tchar* path, filinfo* fno);/* get file status */

fresult f_chmod (const tchar* path, byte attr, byte mask);/* change attribute of a file/dir */

fresult f_utime (const tchar* path, const filinfo* fno);/* change timestamp of a file/dir */

fresult f_chdir (const tchar* path);/* change current directory */

fresult f_chdrive (const tchar* path);/* change current drive */

fresult f_getcwd (tchar* buff, uint len);/* get current directory */

fresult f_getfree (const tchar* path, dword* nclst, fatfs** fatfs);/* get number of free clusters on the drive */

fresult f_getlabel (const tchar* path, tchar* label, dword* vsn);/* get volume label */

fresult f_setlabel (const tchar* label);/* set volume label */

fresult f_forward (fil* fp, uint(*func)(const byte*,uint), uint btf, uint* bf);/* forward data to the stream */

fresult f_expand (fil* fp, fsize_t szf, byte opt);/* allocate a contiguous block to the file */

fresult f_mount (fatfs* fs, const tchar* path, byte opt);/* mount/unmount a logical drive */

fresult f_mkfs (const tchar* path, byte opt, dword au, void* work, uint len);/* create a fat volume */

fresult f_fdisk (byte pdrv, const dword* szt, void* work);/* divide a physical drive into some partitions */

int f_putc (tchar c, fil* fp);/* put a character to the file */

int f_puts (const tchar* str, fil* cp);/* put a string to the file */

int f_printf (fil* fp, const tchar* str, ...);/* put a formatted string to the file */

tchar* f_gets (tchar* buff, int len, fil* fp);/* get a string from the file */

2.2.1 相關檔案操作函式的具體功能請自行查詢和理解。

學習fatfs的**:

3. 未完待續

基於stm32移植FATFS檔案系統

2.ff14a source 下就是需要的檔案。ff.c fatfs模組。ffconf.h fatfs模組的配置檔案。ff.h fatfs和應用程式模組的通用包含檔案。diskio.h fatfs 和disk i o模組的公用包含檔案。diskio.c 將現有disk i o模組連線到fatfs的粘...

stm32專題十九 FatFs檔案系統簡介

fatfs檔案系統簡介 但是,這樣直接儲存資料會帶來極大的不便,如難以記錄有效資料的位置,難以確定儲存介質的剩餘空間,以及應以何種格式來解讀資料。就如同乙個巨大的圖書館無人管理,雜亂無章地存放著各種書籍,難以查詢所需的文件。對於spi flash晶元或者sd卡之類的大容量裝置,我們需要一種高效的方式...

STM32的SD驅動 FATFS檔案系統

2 stlink v2 3 cp2102 usb轉串列埠 4 8g sd卡 5 stm32cubemx 6 keil mdk 匯出的工程可以直接編譯。最終程式執行順序為 主函式 檔案系統應用程式 檔案系統 晶元sdio介面驅動。我們需要編寫的只有主函式 main.c 和檔案系統應用程式 fatfs....