宏定義和存儲設備狀態獲取函數
列表4:代碼清單:24_2 disk_ioctl函數
/*-----------------------------------------------------------------------*//* Get Drive Status *//*-----------------------------------------------------------------------*/DSTATUS disk_status(BYTE pdrv /* Physical drive nmuber to identify the drive */){DSTATUS stat;switch (pdrv) {case DEV_FLASH :QSPI_Flash_WaitForWriteEnd(); //等待Flash 芯片內部操作完成cstat = RES_OK;return stat;}return STA_NOINIT;}
存儲設備初始化函數
列表5:代碼清單:24_3 disk_ioctl函數
/*-----------------------------------------------------------------------*//* Inidialize a Drive *//*-----------------------------------------------------------------------*/DSTATUS disk_initialize(BYTE pdrv /* Physical drive nmuber to identify?,→the drive */){DSTATUS stat;switch (pdrv) {case DEV_FLASH :QSPI_Flash_Init();stat = RES_OK;return stat;}return STA_NOINIT;}
存儲設備數據讀取函數
列表6:代碼清單:24_4 disk_ioctl函數
/*-----------------------------------------------------------------------*//* Read Sector(s) *//*-----------------------------------------------------------------------*/DRESULT disk_read(BYTE pdrv, /* Physical drive nmuber to identify the drive?,→*/BYTE *buff, /* Data buffer to store read data */LBA_t sector, /* Start sector in LBA */UINT count /* Number of sectors to read */){DRESULT res;switch (pdrv) {case DEV_FLASH :// translate the arguments hereQSPI_Flash_BufferRead(buff, sector<<12, count<<12); //1 sector ==?,→4096 bytesres = RES_OK;return res;}return RES_PARERR;}
存儲設備數據寫入函數
列表7:代碼清單:24_5 disk_ioctl函數
DRESULT disk_write(BYTE pdrv, /* Physical drive nmuber to identify?,→the drive */const BYTE *buff, /* Data to be written */LBA_t sector, /* Start sector in LBA */UINT count /* Number of sectors to write */){DRESULT res;uint32_t write_addr;switch (pdrv) {case DEV_FLASH :write_addr = sector << 12;QSPI_Flash_SectorErase(write_addr);QSPI_Flash_BufferWrite(buff, write_addr, count<<12);res = RES_OK;return res;}return RES_PARERR;}
IO控制函數
列表8:代碼清單:24_6 disk_ioctl函數
DRESULT disk_ioctl(BYTE pdrv, /* Physical drive nmuber (0..) */BYTE cmd, /* Control code */void *buff /* Buffer to send/receive control data */){DRESULT res;switch (pdrv) {case DEV_FLASH :switch (cmd) {case GET_SECTOR_COUNT: /* 扇區數量:1024*4096/1024/1024 = 4(MB) */*(DWORD *)buff = 1024;break;case GET_SECTOR_SIZE: /* 扇區大小*/*(WORD *)buff = 4096;break;case GET_BLOCK_SIZE: /* 同時擦除扇區個數*/*(DWORD *)buff = 1;break;}res = RES_OK;return res;}return RES_PARERR;}
get_fattime函數
列表9:代碼清單:24_7 disk_ioctl函數
DWORD get_fattime(void){/* 返回當前時間戳*/return (DWORD)(2022 - 80) << 25 | /* Year */(DWORD)(1 + 1) << 21 | /* Month */(DWORD)1 << 16 | /* Mday */(DWORD)1 << 11 | /* Hour */(DWORD)1 << 5 | /* Min */(DWORD)1 >> 1; /* Sec */}
由于之前在配置文件關閉了RTC和時間戳功能,因此其實不需要實現這個返回當前時間戳函數。由FF_FS_NORTC決定是否啟用,FF_FS_NORTC設置為1以禁用時間戳功能。
FatFs基本API函數說明
24.4.5.1
f_mount
f_mount函數原型如下:
FRESULT f_mount(FATFS* fs, /* [IN] Filesystem object */const TCHAR* path, /* [IN] Logical drive number */BYTE opt /* [IN] Initialization option */);
FatFs需要每個邏輯驅動器(FAT卷)的工作區域(文件系統對象)。在執行任何文件/目錄操作之前,需要使用邏輯驅動器的f_mount函數注冊文件系統對象。完成此過程后,文件/目錄API函數已準備好工作。某些卷管理功能(f_mkfs、f_fdisk和f_setcp)不需要文件系統對象。
f_mount函數將文件系統對象注冊/注銷到FatFs模塊,如下所示:
確定由path指定的邏輯驅動器。
清除并注銷卷的已注冊工作區(如果存在)。
如果fs不為NULL,則清除新工作區并將其注冊到卷中。
如果指定了強制裝入,則對卷執行卷裝入過程。
opt:安裝選項。
0:現在不掛載(要在第一次訪問卷時掛載)
1:強制掛載卷以檢查它是否準備好工作。
24.4.5.2
f_mkfs
f_mkfs函數原型如下:
FRESULT f_mkfs(const TCHAR* path, /* [IN] Logical drive number */const MKFS_PARM* opt,/* [IN] Format options */void* work, /* [-] Working buffer */UINT len /* [IN] Size of working buffer */);
簇(cluster):由于扇區的空間比較小且數目眾多,在尋址時比較困難,所以操作系統就將多個的扇區組合在一起,形成一個更大的單位,再對這個單位進行整體的操作。也可以理解為文件的磁盤空間分配單位。當簇的大小為32768字節時,大小為100字節的文件將占用32768字節的磁盤空間。隨著簇大小的增加,磁盤使用的空間效率會變得很低,但與此同時,讀/寫效率也會提高。因此,簇的大小是空間效率和讀/寫效率之間的權衡。
opt:若為NULL,則啟用默認參數
列表10:f_mkfs opt默認參數
staticconst MKFS_PARM defopt = {FM_ANY, 0, 0, 0, 0}; /* Default?,→parameter */
由work來指向用于格式化過程的工作緩沖區的指針。
由len來確定工作緩沖區的大小(以字節為單位)。至少需要FF_MAX_SS。
注
當FF_FS_READONLY==0且FF_USE_MKFS==1時可用。

如您在使用瑞薩MCU/MPU產品中有任何問題,可識別下方二維碼或復制網址到瀏覽器中打開,進入瑞薩MCU/MPU官方技術論壇尋找答案或獲取在線技術支持。
https://bbs.21ic.com/renesas
未完待續
推薦閱讀

FatFs的官網源碼結構及已知問題以及解決方法或補丁——瑞薩RA系列FSP庫開發實戰指南(86)

FatFs的官網源碼結構及已知問題以及解決方法或補丁——瑞薩RA系列FSP庫開發實戰指南(87)

FatFs路徑名格式說明——瑞薩RA系列FSP庫開發實戰指南(88)

