FATFS文件系统移植

描述

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.软件硬件平台

  • 开发板:STM32F103ZE
  • FLASH:SD卡一张
  • 完整SD卡驱动工程(这里选择SDIO驱动方式)
  • FATFS源码

3.FAT源码下载

下载地址:FATFS下载

SD卡

4.FATFS文件系统移植

移植FATFS文件系统只需要提供硬件读写扇区函数即可。
  1.FATFS源码文件

SD卡

2.打开工程,将FATFS源码文件添加到工程中,添加头文件路径。

SD卡SD卡

5.修改硬件接口文件diskio.c

  1.添加SD卡驱动头文件和驱动设备卷标号设置。

SD卡

2.获取设置状态

SD卡

3.初始化设备

SD卡
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.读扇区函数

SD卡
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.写扇区函数
 

SD卡
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.其他函数

SD卡
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.时间函数,为文件访问提供时间。

SD卡

6.裁剪FATFS文件系统,修改ffconf.h

1.打开格式化功能

SD卡

2.编码格式选择

SD卡

3.打开长文件名支持。使用中文编码需要长文件名支持。

SD卡

    选择3时需要提供动态分配空间接口函数,在ffsystem.c中

SD卡

修改堆空间大小,在startup_stm32f103_hd.s中

SD卡

4.获取时间支持

SD卡

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.运行效果

SD卡

9.相关接口函数

  1.f_open函数

函数原型:FRESULT f_open (FIL* fp, const TCHAR* path, BYTE mode);
函数功能: 打开文件
形参: fp  文件指针
   path  文件名
  mode  文件操作权限
文件操作权限有下列几种

SD卡

返回值:成功返回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,失败返回其它值


 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分