在STM32中移植FATFS文件系统之欧阳理创编.docx

上传人:b****8 文档编号:9621755 上传时间:2023-02-05 格式:DOCX 页数:24 大小:404.61KB
下载 相关 举报
在STM32中移植FATFS文件系统之欧阳理创编.docx_第1页
第1页 / 共24页
在STM32中移植FATFS文件系统之欧阳理创编.docx_第2页
第2页 / 共24页
在STM32中移植FATFS文件系统之欧阳理创编.docx_第3页
第3页 / 共24页
在STM32中移植FATFS文件系统之欧阳理创编.docx_第4页
第4页 / 共24页
在STM32中移植FATFS文件系统之欧阳理创编.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

在STM32中移植FATFS文件系统之欧阳理创编.docx

《在STM32中移植FATFS文件系统之欧阳理创编.docx》由会员分享,可在线阅读,更多相关《在STM32中移植FATFS文件系统之欧阳理创编.docx(24页珍藏版)》请在冰豆网上搜索。

在STM32中移植FATFS文件系统之欧阳理创编.docx

在STM32中移植FATFS文件系统之欧阳理创编

STM32的FATFS文件系统移植笔记

时间:

2021.03.05

创作:

欧阳理

一、序言

  经常在网上、群里看到很多人问关于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()打印输出工程:

...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卡文件系统相关信息

复制代码

图1

  3、初步实现以上五个函数

      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.                default:

33.                      returnRES_ERROR;

34.          }

35.      }

复制代码

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.                default:

returnRES_ERROR;

33.          }

34.      }

复制代码

FATFS磁盘控制函数:

1.DRESULTdisk_ioctl(

2.          BYTEdrv,          /*Physicaldrivenmuber(0..)*/

3.          BYTEctrl,          /*Controlcode*/

4.          void*buff          /*Buffertosend/receivecontroldata*/

5.      )

6.      {

7.          if(drv==0)

8.          {  

9.                switch(ctrl)

10.                {

11.                      caseCTRL_SYNC:

12.                          returnRES_OK;

13.                      caseGET_SECTOR_COUNT:

14.                      returnRES_OK;

15.                      caseGET_BLOCK_SIZE:

16.                      returnRES_OK;      

17.                      caseCTRL_POWER:

18.                          break;

19.                      caseCTRL_LOCK:

20.                          break;

21.                      caseCTRL_EJECT:

22.                          break;

23.                /*MMC/SDCcommand*/

24.                      caseMMC_GET_TYPE:

25.                          break;

26.                      caseMMC_GET_CSD:

27.                          break;

28.                      caseMMC_GET_CID:

29.                          break;

30.                      caseMMC_GET_OCR:

31.                          break;

32.                      caseMMC_GET_SDSTAT:

33.                          break;      

34.                }

35.        }elseif(drv==1){

36.                switch(ctrl)

37.                {

38.                      caseCTRL_SYNC:

39.                          returnRES_OK;

40.                      caseGET_SECTOR_COUNT:

41.                      returnRES_OK;

42.                      caseGET_SECTOR_SIZE:

43.                          returnRES_OK;

44.                      caseGET_BLOCK_SIZE:

45.                      returnRES_OK;      

46.                      caseCTRL_POWER:

47.                          break;

48.                      caseCTRL_LOCK:

49.                          break;

50.                      caseCTRL_EJECT:

51.                          break;

52.                /*MMC/SDCcommand*/

53.                      caseMMC_GET_TYPE:

54.                          break;

55.                      caseMMC_GET_CSD:

56.                          break;

57.                      caseMMC_GET_CID:

58.                          break;

59.                      caseMMC_GET_OCR:

60.                          break;

61.                      caseMMC_GET_SDSTAT:

62.                          break;      

63.                }      

64.          }

65.          else{                      

66.                returnRES_PARERR;  

67.          }

68.          returnRES_PARERR;

69.      }

复制代码

以上函数都只是实现一个框架,并没有做实际的事情,下一步就需要把操作SD卡的程序填充在这个框架里面。

  4、实现disk_initialize()函数

      该函数在挂载文件系统的时候会被调用,主要是实现读写SD卡前对SD卡进行初始化,根据SD卡的传输协议,我们按照如下步骤初始化SD卡:

      a、判断SD卡是否插入,可以通过检查SD卡卡座的CD脚电平进行判断,一般插入卡后该引脚会变成低电平。

      b、稍微延时一段时间后发送至少74个时钟给SD卡。

      c、发送CMD0命令给SD卡,直到SD卡返回0x01为止,这里可以循环多次发送。

          程序如下:

1.  /*StartsendCMD0tillreturn0x01meansinIDLEstate*/

2.          for(retry=0;retry<0xFFF;retry++)

3.          {

4.                r1=MSD0_send_

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1