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)
下载地址:FATFS下载
移植FATFS文件系统只需要提供硬件读写扇区函数即可。
1.FATFS源码文件
2.打开工程,将FATFS源码文件添加到工程中,添加头文件路径。
1.添加SD卡驱动头文件和驱动设备卷标号设置。
2.获取设置状态
3.初始化设备
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.读扇区函数
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.写扇区函数
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.其他函数
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.时间函数,为文件访问提供时间。
1.打开格式化功能
2.编码格式选择
3.打开长文件名支持。使用中文编码需要长文件名支持。
选择3时需要提供动态分配空间接口函数,在ffsystem.c中
修改堆空间大小,在startup_stm32f103_hd.s中
4.获取时间支持
编写测试函数,读写文件。
#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);//关闭文件
}
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,失败返回其它值 |
全部0条评论
快来发表一下你的评论吧 !