0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FATFS文件系统移植

嵌入式技术 来源:嵌入式技术 作者:嵌入式技术 2022-06-06 09:28 次阅读

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下载

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

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

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_centerwatermark,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

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

在这里插入图片描述

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

1.打开格式化功能

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

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

在这里插入图片描述

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

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center

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

在这里插入图片描述

4.获取时间支持

在这里插入图片描述

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

9.相关接口函数

1.f_open函数

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

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70#pic_center

返回值:成功返回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
    +关注

    关注

    2232

    文章

    10650

    浏览量

    347889
  • SD卡
    +关注

    关注

    2

    文章

    526

    浏览量

    62965
  • FATFS
    +关注

    关注

    0

    文章

    43

    浏览量

    18132
  • FatFS文件系统

    关注

    0

    文章

    12

    浏览量

    7460
收藏 人收藏

    评论

    相关推荐

    基于STM32完成FATFS文件系统移植与运用

    这篇文章主要演示FATFS文件系统如何移植到自己的工程,并完成文件的读写。 因为SD卡采用的是SPI模拟时序,所以,其他单片机一样可以照着移植
    的头像 发表于 03-08 09:17 5190次阅读
    基于STM32完成<b class='flag-5'>FATFS</b><b class='flag-5'>文件系统</b><b class='flag-5'>移植</b>与运用

    STM32+SD NAND(贴片SD卡)完成FATFS文件系统移植与测试

    这篇文章就手把手教大家,在STM32上完成FATFS文件系统移植;主控芯片采用STM32F103ZET6, 存储芯片我这里采用(雷龙) CS创世 SD NAND 。 SD NAND 简单来说就是
    的头像 发表于 07-17 17:24 4069次阅读
    STM32+SD NAND(贴片SD卡)完成<b class='flag-5'>FATFS</b><b class='flag-5'>文件系统</b><b class='flag-5'>移植</b>与测试

    FATFS文件系统移植----基于STM32F10x控制芯片的

    前一周做了FATFS文件系统移植,当初用的是STM32库里的评估板的SD卡驱动。当然,库的驱动是比较好的。听说能支持到16G的SD卡。不过可惜,没移植成功。后来用了我同学给的SD卡的驱
    发表于 08-08 09:36

    FATFS文件系统移植

    这是本人,整理的FATFS文件系统移植资料,很少的一部分,希望大家把自己搜到的比较好的资料,分享一下,本人正在学习fatfs文件系统,希望和
    发表于 09-11 16:05

    STM32的FATFS文件系统移植笔记

    一、序言 经常在网上、群里看到很多人问关于STM32的FATFS文件系统移植的问题,刚好自己最近也在调试这个程序,为了让大家少走弯路,我把我的调试过程和方法也贡献给大家。二、FATFS
    发表于 01-09 15:18

    FATFS文件系统移植日志

    按照原有的结构进行编写即可。这样就基本完成FATFS移植工作了,接下来就是直接使用文件系统提供的函数即可完成功能。需要注意的是:当扇区改变是需要进行格式化操作才能完成设备的挂载。不然若扇区于上次
    发表于 08-12 23:33

    转:SPIFLASH后之FATFS文件系统移植

    :}不扯淡了,切入正题,关于什么是文件系统,请各位直接找度娘或狗哥哥吧。老规矩,直接上代码!前几天已经在论坛发布了SPI和DSPI驱动W25QXX系列SPIFlash的帖子,需要的自己去看,本部分的用到
    发表于 07-06 17:10

    FATFS文件系统如何移植工程

    STM32F103ZET6系统板、一个SPI接口的SD卡卡槽模块、一张SD卡工程完整源码下载地址这篇文章主要演示FATFS文件系统如何移植到自己的工程,并完成
    发表于 08-24 06:34

    FatFs文件系统的原理是什么?如何对FATFS进行移植

    FatFs文件系统的原理是什么?FatFs文件系统移植方法是什么?如何实现eMMC卡中文件的读
    发表于 11-25 07:52

    Fatfs文件系统移植要经过哪几个步骤呢

    Fatfs文件系统有何特点?Fatfs文件系统移植要经过哪几个步骤呢?
    发表于 12-01 07:33

    FATFS文件系统移植的相关资料推荐

    FATFS文件系统移植(FLASH)一、说明1、在移植文件系统前需先验证FLASH的全部扇区读写是否没问题,将全部扇区读写一遍。2、可在
    发表于 01-11 06:57

    如何进行FatFs文件系统移植

    FatFs 的底层可以写一次命令,读写多个扇区。FatFs的设计的读写的思想就很好,小块的数据,我就经过Buffer来存储,大块的数据,我就直接进行存取,那样速度,效率高了很多,看图:
    发表于 04-30 18:24 3次下载
    如何进行<b class='flag-5'>FatFs</b><b class='flag-5'>文件系统</b>的<b class='flag-5'>移植</b>

    MSP430、STM32、8051单片机fatfs 文件系统移植 W25Q128

    MSP430、STM32、8051单片机fatfs 文件系统移植 W25Q128
    发表于 11-15 16:21 29次下载
    MSP430、STM32、8051单片机<b class='flag-5'>fatfs</b> <b class='flag-5'>文件系统</b><b class='flag-5'>移植</b> W25Q128

    Fatfs文件系统移植

    Fatfs文件系统移植)一、文件系统介绍二、移植条件、说明1、FatFs模块在可
    发表于 11-15 18:51 22次下载
    <b class='flag-5'>Fatfs</b>(<b class='flag-5'>文件系统</b>的<b class='flag-5'>移植</b>)

    基于STM32+CS创世 SD NAND(贴片SD卡)完成FATFS文件系统移植与测试(下篇)

    四、移植FATFS文件系统前面第3章,完成了SDNAND的驱动代码编写,这一章节实现FATFS文件移植
    的头像 发表于 03-03 13:52 790次阅读
    基于STM32+CS创世 SD NAND(贴片SD卡)完成<b class='flag-5'>FATFS</b><b class='flag-5'>文件系统</b><b class='flag-5'>移植</b>与测试(下篇)