1.簡介
FatFs 是用于小型嵌入式系統的通用 FAT/exFAT 文件系統模塊。FatFs 模塊是按照 ANSI C (C89) 編寫的,與磁盤 I/O 層完全分離。因此它獨立于平臺。它可以集成到資源有限的小型微控制器中,例如 8051、PIC、AVR、ARM、Z80、RX 等。
特性
DOS/Windows 兼容 FAT/exFAT 文件系統。
平臺獨立。易于移植。
程序代碼和工作區的占用空間非常小。
支持的各種配置選項:
支持多卷(物理驅動器或分區);
多個 ANSI/OEM 代碼頁包括 DBCS;
支持長文件名, ANSI/OEM 或 Unicode;
支持 RTOS;
支持多種扇區大小;
只讀、最小化的 API 和 I/O 緩沖區等。
FATFS應用范圍
支持 FAT12、 FAT16 和 FAT32;
可打開的文件:無限制,依賴于有效的存儲器;
支持最多 10 個卷;
文件大小:與 FAT 類型有關(upto 4G-1 bytes);
卷大小:與 FAT 類型有關(upto 2T bytes on 512 bytes/sector);
簇大小:與 FAT 類型有關(upto 64K bytes on 512 bytes/sector);
扇區大小:與 FAT 類型有關(upto 4K bytes)
2.軟件硬件平臺
3.FAT源碼下載
下載地址:FATFS下載
![watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center](https://file.elecfans.com//web2/M00/46/E0/pYYBAGKWv4aAMDqJAAJ9bFsIbxY760.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center)
4.FATFS文件系統移植
移植FATFS文件系統只需要提供硬件讀寫扇區函數即可。
??1.FATFS源碼文件
![watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center](https://file.elecfans.com//web2/M00/46/E1/poYBAGKWv4aAXHOwAAD-V6hAhnE416.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center)
2.打開工程,將FATFS源碼文件添加到工程中,添加頭文件路徑。
![watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center](https://file.elecfans.com//web2/M00/46/E0/pYYBAGKWv4eAUR93AAC81Zgs4p4838.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center)
![watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center](https://file.elecfans.com//web2/M00/46/E1/poYBAGKWv4eANNArAAGLVXHMfeA087.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center)
5.修改硬件接口文件diskio.c
??1.添加SD卡驅動頭文件和驅動設備卷標號設置。
![watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center](https://file.elecfans.com//web2/M00/46/E0/pYYBAGKWv4iADWQWAACm2zyYCww493.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center)
2.獲取設置狀態
![在這里插入圖片描述](https://file.elecfans.com//web2/M00/46/E0/pYYBAGKWv4iADWQWAACm2zyYCww493.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center)
3.初始化設備
![在這里插入圖片描述](https://file.elecfans.com//web2/M00/46/E1/poYBAGKWv4iAJ98kAADVScAwITA364.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center)
DSTATUS disk_initialize (
BYTE pdrv /* Physical drive nmuber to identify the drive */
)
{
DSTATUS stat;
switch (pdrv) {
case DEV_SD :
stat=SD_Init();//SD卡初始化
return stat;
}
return STA_NOINIT;
}
4.讀扇區函數
![在這里插入圖片描述](https://file.elecfans.com//web2/M00/46/E0/pYYBAGKWv4iAZ5CUAAGFctdqorM526.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center)
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 */
)
{
int result;
switch (pdrv) {
case DEV_SD :
result=SD_ReadDisk(buff,sector,count);//讀扇區
if(result==0)return RES_OK;
}
return RES_PARERR;
}
5.寫扇區函數
![在這里插入圖片描述](https://file.elecfans.com//web2/M00/46/E1/poYBAGKWv4mAK5OSAAGcsIWcbq0747.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center)
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 */
)
{
int result;
switch (pdrv) {
case DEV_SD :
result=SD_WriteDisk((u8 *)buff,sector,count);//寫扇區
if(result==0)return RES_OK;
}
return RES_PARERR;
}
6.其他函數
![在這里插入圖片描述](https://file.elecfans.com//web2/M00/46/E0/pYYBAGKWv4mAQJmHAAHzzQ1TyCM252.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center)
DRESULT disk_ioctl (
BYTE pdrv, /* Physical drive nmuber (0..) */
BYTE cmd, /* Control code */
void *buff /* Buffer to send/receive control data */
)
{
switch (pdrv) {
case DEV_SD :
switch(cmd)
{
case GET_SECTOR_COUNT://獲取扇區數量
*(DWORD *)buff=SDCardInfo.CardCapacity/512;
break;
case GET_SECTOR_SIZE://獲取扇區大小
*(DWORD *)buff=512;
break;
case GET_BLOCK_SIZE://塊大小
*(DWORD *)buff=SDCardInfo.CardBlockSize;
break;
}
return RES_OK;
}
return RES_PARERR;
}
7.時間函數,為文件訪問提供時間。
![在這里插入圖片描述](https://file.elecfans.com//web2/M00/46/E1/poYBAGKWv4qADol5AAD4wzRj-PE233.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center)
6.裁剪FATFS文件系統,修改ffconf.h
1.打開格式化功能
![watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center](https://file.elecfans.com//web2/M00/46/E0/pYYBAGKWv4qANS95AAIiFnaeZpg252.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center)
2.編碼格式選擇
![watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center](https://file.elecfans.com//web2/M00/46/E1/poYBAGKWv4uAWFEmAAHCwTd_8Gs999.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center)
3.打開長文件名支持。使用中文編碼需要長文件名支持。
![在這里插入圖片描述](https://file.elecfans.com//web2/M00/46/E0/pYYBAGKWv4uAFdbWAAERz7eVdCw771.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center)
選擇3時需要提供動態分配空間接口函數,在ffsystem.c中
![watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center](https://file.elecfans.com//web2/M00/46/E1/poYBAGKWv4yAbI1bAAI95DiH1Nw913.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center)
修改堆空間大小,在startup_stm32f103_hd.s中
![在這里插入圖片描述](https://file.elecfans.com//web2/M00/46/E0/pYYBAGKWv42AFWJpAAIUkAH8leQ242.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center)
4.獲取時間支持
![在這里插入圖片描述](https://file.elecfans.com//web2/M00/46/E1/poYBAGKWv42AB3oCAAMOOceVwEs371.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center)
7.主函數
??編寫測試函數,讀寫文件。
#include "ff.h" /* Obtains integer types */
FATFS fs;
u8 buff_tx[512]="SD卡扇區讀寫測試,文件系統讀寫測試sdfghj23456790\r\n";
u8 buff_rx[512];
void Fatfs_WriteData(const TCHAR *file_name,u8 *buff,u32 len);
void Fatfs_ReadData(const TCHAR *file_name,u8 *buff,u32 len);
int main()
{
u8 stat=0;
Beep_Init();
Led_Init();
Key_Init();
Usartx_Init(USART1,115200,72);
TIMx_Init(TIM2,72,20*1000);
RTC_Init();
stat=f_mount(&fs,"0:",1);//SD卡掛載
printf("stat=%d\r\n",stat);
if(stat==0) printf("磁盤掛載成功\r\n");
Fatfs_WriteData("0:/FAT文件系統.doc",buff_tx,strlen((char *)buff_tx));
Fatfs_ReadData("0:/FAT文件系統.doc",buff_rx,strlen((char *)buff_tx));
printf("rx:%s\r\n",buff_rx);
while(1)
{
}
?寫數據函數
/**************FATFS寫數據****************/
void Fatfs_WriteData(const TCHAR *file_name,u8 *buff,u32 len)
{
/*1.打開文件*/
FIL fp;
FRESULT res;
UINT bw;
res=f_open(&fp,file_name,FA_WRITE|FA_CREATE_ALWAYS);//寫+創建
if(res!=FR_OK)
{
printf("文件打開或創建失敗:ERR%d\r\n",res);
return ;
}
printf("文件創建或打開成功\r\n");
res=f_write(&fp,buff,len,&bw);
if(res==FR_OK)
{
printf("數據寫入成功 %d Byte\r\n",bw);
}
else printf("寫入失敗ERR:%d\r\n",res);
f_close(&fp);//關閉文件
}
讀數據函數
/****************FATFS讀數據*************/
void Fatfs_ReadData(const TCHAR *file_name,u8 *buff,u32 len)
{
/*1.打開文件*/
FIL fp;
FRESULT res;
UINT br;
res=f_open(&fp,file_name,FA_READ);//讀
if(res!=FR_OK)
{
printf("文件打開失敗:ERR%d\r\n",res);
return ;
}
printf("文件打開成功\r\n");
res=f_read(&fp,buff,len,&br);
if(res!=FR_OK)
{
printf("讀取數據失敗ERR:%d \r\n",res);
}
else
{
printf("讀取數據成功 %d byte\r\n",br);
}
f_close(&fp);//關閉文件
}
8.運行效果
![watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center](https://file.elecfans.com//web2/M00/46/E0/pYYBAGKWv46AYV7fAACNSLtyR60886.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center)
9.相關接口函數
1.f_open函數
函數原型:FRESULT f_open (FIL* fp, const TCHAR* path, BYTE mode); ![]() 返回值:成功返回FR_OK,失敗其它值。 |
2.f_read函數
函數原型:FRESULT f_read (FIL* fp, void* buff, UINT btr, UINT* br); 函數功能:讀文件 形參:fp 文件指針 ?buff 讀取數據緩沖區 ?btr 讀取的字節數 ?br 指向返回的已經讀取的字節數 UINT 變量的指針,不管此函數掉調用后返回的結果如何,這個值始終有效。如果返回值等于btr,則函數返回值為FR_OK。 返回值:成功返回FR_OK,失敗返回其它值 |
3.f_write函數
函數原型:FRESULT f_write (FIL* fp, const void* buff, UINT btw, UINT* bw); 函數功能:寫文件 形參:fp 文件指針 ?buff 要寫的數據內容 ?btw?寫入是字節數 ?br 指向接收寫入字節數的UINT變量的指針。無論函數返回代碼如何,該值在函數調用后始終有效。如果返回值等于btw,則函數返回值為FR_OK。 返回值:成功返回FR_OK,失敗返回其它值 |
4.f_close函數
函數原型:FRESULT f_close (FIL* fp); 函數功能:關閉文件 形參:fp ?文件指針 返回值:成功返回FR_OK,失敗返回其它值 |
-
STM32
+關注
關注
2273文章
10926瀏覽量
357767 -
SD卡
+關注
關注
2文章
566瀏覽量
64144 -
FATFS
+關注
關注
0文章
44瀏覽量
18399 -
FatFS文件系統
+關注
關注
0文章
12瀏覽量
7581
發布評論請先 登錄
相關推薦
STM32+SD NAND(貼片SD卡)完成FATFS文件系統移植與測試
![STM32+SD NAND(貼片SD卡)完成<b class='flag-5'>FATFS</b><b class='flag-5'>文件系統</b><b class='flag-5'>移植</b>與測試](https://file1.elecfans.com/web2/M00/8C/F1/wKgZomS1CK2AAzLyABwp9OkgvqM195.jpg)
FATFS文件系統移植----基于STM32F10x控制芯片的
STM32的FATFS文件系統移植筆記
FATFS文件系統移植日志
FATFS文件系統如何移植工程
FATFS文件系統移植的相關資料推薦
如何進行FatFs文件系統的移植
![如何進行<b class='flag-5'>FatFs</b><b class='flag-5'>文件系統</b>的<b class='flag-5'>移植</b>](https://file.elecfans.com/web1/M00/90/C2/o4YBAFzHwXSAdmteAACfpmJDXx4184.png)
MSP430、STM32、8051單片機fatfs 文件系統移植 W25Q128
![MSP430、STM32、8051單片機<b class='flag-5'>fatfs</b> <b class='flag-5'>文件系統</b><b class='flag-5'>移植</b> W25Q128](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
基于STM32+CS創世 SD NAND(貼片SD卡)完成FATFS文件系統移植與測試(下篇)
![基于STM32+CS創世 SD NAND(貼片SD卡)完成<b class='flag-5'>FATFS</b><b class='flag-5'>文件系統</b><b class='flag-5'>移植</b>與測試(下篇)](https://file.elecfans.com/web2/M00/95/29/poYBAGQBbYSARRnKAACbA2j7Zq8852.png)
評論