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); //底層初始化2.1.2 在diskio.c中,是對上述函式的實現,等等(包括一些中間函式)。而其中,使用者在使用時需要注意的是: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*);
dstatus disk_initialize (byte drv) /* physical drive nmuber (0..) */2.1.3 flash_init();被定義在flash.c檔案中。內部的spi_flash_init(); 是使用spi與flash溝通的引腳定義(gpio)。return sta_noinit;
}
u8 flash_init(void)2.1.4 spi_flash_init(); 定義在spi.c中。return 0;
}
/*pb13,14,15 pb12是片選訊號*/下方藍色文字表示 fatfs module 涉及的內容。void spi_flash_init(void)
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 */2.2.1 相關檔案操作函式的具體功能請自行查詢和理解。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 */
學習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....