微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32的FATFS文件系统移植笔记

STM32的FATFS文件系统移植笔记

时间:11-26 来源:互联网 点击:
一、序言

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

二、FATFS简介
FatFs Module是一种完全免费开源的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. DSTATUS disk_initialize (BYTE);//SD卡的初始化
  2. DSTATUS disk_status (BYTE);//获取SD卡的状态,这里可以不用管
  3. DRESULT disk_read (BYTE, BYTE*, DWORD, BYTE);//从SD卡读取数据
  4. DRESULT disk_write (BYTE, const BYTE*, DWORD, BYTE);//将数据写入SD卡,若该文件系统为只读文件系统则不用实现该函数
  5. DRESULT disk_ioctl (BYTE, BYTE, void*);//获取SD卡文件系统相关信息

复制代码

图1
3、初步实现以上五个函数
FATFS初始化函数:

  1. DSTATUS disk_initialize (
  2. BYTE drv /* Physical drive nmuber (0..) */
  3. )
  4. {
  5. switch (drv)
  6. {
  7. case 0 :
  8. return RES_OK;
  9. case 1 :
  10. return RES_OK;
  11. case 2 :
  12. return RES_OK;
  13. case 3 :
  14. return RES_OK;
  15. default:
  16. return STA_NOINIT;
  17. }
  18. }

复制代码

FATFS状态获取函数:

  1. DSTATUS disk_status (
  2. BYTE drv /* Physical drive nmuber (0..) */
  3. )
  4. {
  5. switch (drv)
  6. {
  7. case 0 :
  8. return RES_OK;
  9. case 1 :
  10. return RES_OK;
  11. case 2 :
  12. return RES_OK;
  13. default:
  14. return STA_NOINIT;
  15. }
  16. }

复制代码

FATFS底层读数据函数:

  1. DRESULT disk_read (
  2. BYTE drv, /* Physical drive nmuber (0..) */
  3. BYTE *buff, /* Data buffer to store read data */
  4. DWORD sector, /* Sector address (LBA) */
  5. BYTE count /* Number of sectors to read (1..255) */
  6. )
  7. {
  8. if( !count )
  9. {
  10. return RES_PARERR;/* count不能等于0,否则返回参数错误 */
  11. }
  12. switch (drv)
  13. {
  14. case 0:
  15. if(count==1) /* 1个sector的读操作 */
  16. {
  17. return RES_OK;
  18. }
  19. else /* 多个sector的读操作 */
  20. {
  21. return RES_OK;
  22. }
  23. case 1:
  24. if(count==1) /* 1个sector的读操作 */
  25. {
  26. return RES_OK;
  27. }
  28. else /* 多个sector的读操作 */
  29. {
  30. return RES_OK;
  31. }
  32. default:
  33. return RES_ERROR;
  34. }
  35. }

复制代码

FATFS底层写数据函数:

  1. DRESULT disk_write (
  2. BYTE drv, /* Physical drive nmuber (0..) */
  3. const BYTE *buff, /* Data to be written */
  4. DWORD sector, /* Sector address (LBA) */
  5. BYTE count /* Number of sectors to write (1..255) */
  6. )
  7. {
  8. if( !count )
  9. {
  10. return RES_PARERR;/* count不能等于0,否则返回参数错误 */
  11. }
  12. switch (drv)
  13. {

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top