STM32的FATFS文件系统移植笔记一、序言经常在网上、群里看到很多人问关于STM32的FATFS文件系统移植的问题,刚好自己最近也在调试这个程序,为了让大家少走弯路,我把我的调试过程和方法也贡献给大家。二、FATFS简介FatFsModule是一种完全免费开源的FAT文件系统模块,专门为小型的嵌入式系统而设计。它完全用标准C语言编写,所以具有良好的硬件平台独立性,可以移植到8051、PIC、AVR、SH、Z80、H8、ARM等系列单片机上而只需做简单的修改。它支持FATl2、FATl6和FAT32,支持多个存储媒介;有独立的缓冲区,可以对多个文件进行读/写,并特别对8位单片机和16位单片机做了优化。三、移植准备1、FATFS源代码的获取,可以到官网下载:http://elm-chan.org/fsw/ff/00index_e.html最新版本是R0.09版本,我们就移植这个版本的。2、解压文件会得到两个文件夹,一个是doc文件夹,这里是FATFS的一些使用文档和说明,以后在文件编程的时候可以查看该文档。另一个是src文件夹,里面就是我们所要的源文件。3、建立一个STM32的工程,为方便调试,我们应重载printf()底层函数实现串口打印输出。可以参考已经建立好的printf()打印输出工程:http://www.viewtool.com/bbs/foru...d=77&extra=page%3D1四、开始移植1、在已经建立好的工程目录User文件夹下新建两个文件夹,FATFS_V0.09和SPI_SD_Card,FATFS_V0.09用于存放FATFS源文件,SPI_SD_Card用于存放SPI的驱动文件。2、如图1将ff.c添加到工程文件夹中,并新建diskio.c文件,在diskio.c文件中实现五个函数:1.DSTATUSdisk_initialize(BYTE);//SD卡的初始化2.DSTATUSdisk_status(BYTE);//获取SD卡的状态,这里可以不用管3.DRESULTdisk_read(BYTE,BYTE*,DWORD,BYTE);//从SD卡读取数据4.DRESULTdisk_write(BYTE,constBYTE*,DWORD,BYTE);//将数据写入SD卡,若该文件系统为只读文件系统则不用实现该函数5.DRESULTdisk_ioctl(BYTE,BYTE,void*);//获取SD卡文件系统相关信息6.复制代码图13、初步实现以上五个函数FATFS初始化函数:1.DSTATUSdisk_initialize(2.BYTEdrv/*Physicaldrivenmuber(0..)*/3.)4.{5.switch(drv)6.{7.case0:8.returnRES_OK;9.case1:10.returnRES_OK;11.case2:12.returnRES_OK;13.case3:14.returnRES_OK;15.default:16.returnSTA_NOINIT;17.}18.}复制代码FATFS状态获取函数:1.DSTATUSdisk_status(2.BYTEdrv/*Physicaldrivenmuber(0..)*/3.)4.{5.switch(drv)6.{7.case0:8.returnRES_OK;9.case1:10.returnRES_OK;11.case2:12.returnRES_OK;13.default:14.returnSTA_NOINIT;15.}16.}复制代码FATFS底层读数据函数:1.DRESULTdisk_read(2.BYTEdrv,/*Physicaldrivenmuber(0..)*/3.BYTE*buff,/*Databuffertostorereaddata*/4.DWORDsector,/*Sectoraddress(LBA)*/5.BYTEcount/*Numberofsectorstoread(1..255)*/6.)7.{8.if(!count)9.{10.returnRES_PARERR;/*count不能等于0,否则返回参数错误*/11.}12.switch(drv)13.{14.case0:15.if(count==1)/*1个sector的读操作*/16.{17.returnRES_OK;18.}19.else/*多个sector的读操作*/20.{21.returnRES_OK;22.}23.case1:24.if(count==1)/*1个sector的读操作*/25.{26.returnRES_OK;27.}28.else/*多个sector的读操作*/29.{30.returnRES_OK;31.}32.33.default:34.returnRES_ERROR;35.}36.}复制代码FATFS底层写数据函数:1.DRESULTdisk_write(2.BYTEdrv,/*Physicaldrivenmuber(0..)*/3.constBYTE*buff,/*Datatobewritten*/4.DWORDsector,/*Sectoraddress(LBA)*/5.BYTEcount/*Numberofsectorstowrite(1..255)*/6.)7.{8.if(!count)9.{10.returnRES_PARERR;/*count不能等于0,否则返回参数错误*/11.}12.switch(drv)13.{14.case0:15.if(count==1)/*1个sector的写操作*/16.{17.returnRES_OK;18.}19.else/*多个sector的写操作*/20.{21.returnRES_OK;22.}23.case1:24.if(count==1)/*1个sector的写操作*/25.{26.returnRES_OK;27.}28.else/*多个sector的写操作*/29.{30.returnRES_OK;31.}32.33.default:returnRES_ERROR;34.}35.}复制代码FATFS磁盘控制函数:1.DRESULTdisk_ioctl(2.BYTEdrv,/*Physicaldriven...