STM32 SDIO FATFS文件系统 野火diskio.c文件解析

本文介绍STM32微控制器与FATFS文件系统的集成过程,包括配置宏定义参数、实现低级磁盘I/O操作及初始化SD卡等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#define _FS_TINY  0 /* 0:Normal or 1:Tiny 完整的FATFS 精简版的是Tiny */

#define _FS_READONLY 0 /* 0:Read/Write or 1:Read only 能读能写*/

#define _FS_MINIMIZE 1 /* 0 to 3 简单的裁剪f_mkdir, f_chmod..这些功能没法用的*/
/* The _FS_MINIMIZE option defines minimization level to remove some functions.
/
/   0: Full function.
/   1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename
/      are removed.
/   2: f_opendir and f_readdir are removed in addition to 1.
/   3: f_lseek is removed in addition to 2. */


#define _USE_STRFUNC 0 /* 0:Disable or 1/2:Enable是否使用字符串文件接口 */
/* To enable string functions, set _USE_STRFUNC to 1 or 2. */


#define _USE_MKFS  0 /* 0:Disable or 1:Enable  制作文件系统我在PC上一般已经格式化好了*/
/* To enable f_mkfs function, set _USE_MKFS to 1 and set _FS_READONLY to 0 */


#define _USE_FORWARD 0 /* 0:Disable or 1:Enable 发文件流?*/
/* To enable f_forward function, set _USE_FORWARD to 1 and set _FS_TINY to 1. */


#define _USE_FASTSEEK 0 /* 0:Disable or 1:Enable 搜索*/
/* To enable fast seek feature, set _USE_FASTSEEK to 1. */

#define _CODE_PAGE 1 / /1    - ASCII only (Valid for non LFN cfg.)

#define _USE_LFN 0  /* 0 to 3 */
#define _MAX_LFN 255  /* Maximum LFN length to handle (12 to 255) 这些都是长文件名或是汉字文件支持很费资源所以不开启这些*/

#define _FS_SHARE 0 /* 0:Disable or >=1:Enable 不使用相对路径*/

#define _FS_SHARE 0 /* 0:Disable or >=1:Enable 文件共享多任务的操作系统会用到的*/

#define _FS_REENTRANT 0  /* 0:Disable or 1:Enable 这些是啥用?同步什么呢?默认就好了*/
#define _FS_TIMEOUT  1000 /* Timeout period in unit of time ticks */
#define _SYNC_t   HANDLE /* O/S dependent type of sync object. e.g. HANDLE, OS_EVENT*, ID and etc.. */

integer.h主要定义了文件的类型 若是最新的可以不用修改。

都说要移植5个函数 。

/*-----------------------------------------------------------------------*/
/* Low level disk I/O module skeleton for FatFs     (C)ChaN, 2011        */
/*-----------------------------------------------------------------------*/
/* This is a stub disk I/O module that acts as front end of the existing */
/* disk I/O modules and attach it to FatFs module with common interface. */
/*-----------------------------------------------------------------------*/

#include "diskio.h"
#include "stm32f10x.h"
#include "stm32_eval_sdio_sd.h"

#define BLOCK_SIZE            512 /* Block Size in Bytes */

 

/*-----------------------------------------------------------------------*/
/* Inidialize a Drive                                                    */

DSTATUS disk_initialize (
 BYTE drv    /* Physical drive nmuber (0..) */
)
{
 SD_Error  Status;
 /* Supports only single driveFATFS支持多个设备 所以有个设备号drive nmuber当然了我就一个SD卡所以只有零号 */
 if (drv)
 {
  return STA_NOINIT;
 }
/*-------------------------- SD Init ----------------------------- */
  Status = SD_Init();
 if (Status!=SD_OK )
 {
  return STA_NOINIT;
 }
 else
 {
  return RES_OK;
 }

}

 

/*-----------------------------------------------------------------------*/
/* Return Disk Status                                                    */

DSTATUS disk_status (
 BYTE drv  /* Physical drive nmuber (0..) */
)
{
 return RES_OK; //懒的管了 有空写写 可以加个
}

 

/*-----------------------------------------------------------------------*/
/* Read Sector(s)                                                        */

DRESULT disk_read (
 BYTE drv,  /* Physical drive nmuber (0..) */
 BYTE *buff,  /* Data buffer to store read data */
 DWORD sector, /* Sector address (LBA) 注意这个是扇区地址也就是第几个扇区*/
 BYTE count  /* Number of sectors to read (1..255) 读取的扇区数*/
)
{
// SD_Error Status;
 if (count > 1)
 {
  SD_ReadMultiBlocks(buff, sector*BLOCK_SIZE, BLOCK_SIZE, count); //扇区地址*512就是实际地址 默认一个扇区就是512个字节
 }
 else
 {
  SD_ReadBlock(buff, sector*BLOCK_SIZE, BLOCK_SIZE);
 }
 return RES_OK;
}

 

/*-----------------------------------------------------------------------*/
/* Write Sector(s)                                                       */

#if _READONLY == 0
DRESULT disk_write (
 BYTE drv,   /* Physical drive nmuber (0..) */
 const BYTE *buff, /* Data to be written */
 DWORD sector,  /* Sector address (LBA) */
 BYTE count   /* Number of sectors to write (1..255) */
)
{
 if (count > 1)
 {
  SD_WriteMultiBlocks((uint8_t *)buff, sector*BLOCK_SIZE, BLOCK_SIZE, count);

/*这里大家看到了有个地址转换 因为DMA仅仅支持4字节指针的所以在函数内部还是有个转换的这里最好优化一下能提高效率*/
 }
 else
 {
  SD_WriteBlock((uint8_t *)buff,sector*BLOCK_SIZE, BLOCK_SIZE);
 }
 return RES_OK;
}
#endif /* _READONLY */

 


/*-----------------------------------------------------------------------*/
/* Miscellaneous Functions                                               */

DRESULT disk_ioctl (
 BYTE drv,  /* Physical drive nmuber (0..) */
 BYTE ctrl,  /* Control code */
 void *buff  /* Buffer to send/receive control data 若是用到擦除函数这个函数一定要补完的有空再写写吧我这简单的返回就好了*/
)
{
 return RES_OK;
}
        
/*-----------------------------------------------------------------------*/
/* Get current time                                                      */
/*-----------------------------------------------------------------------*/ 
DWORD get_fattime(void)
{
return ((2011UL-1980) << 25)       // Year = 2011
| (3UL << 21)       // Month = Mar
| (26UL << 16)       // Day = 26
| (13U << 11)       // Hour = 13
| (19U << 5)       // Min =19
| (0U >> 1)       // Sec = 0
;

STM32平台上移植Fatfs文件系统,通过SDIO接口与MicroSD卡通信,并利用DMA模式提升数据传输速度,是嵌入式系统开发中的一个常见需求。要完成这一过程,你需要对STM32的硬件结构、Fatfs库的工作原理、以及DMA的工作机制都有深入的理解。《STM32高级篇:Fatfs-0.09移植教程详解》将是你学习和实践过程中的重要参考资料。 参考资源链接:[STM32高级篇:Fatfs-0.09移植教程详解](https://wenku.csdn.net/doc/3ggy2vmpqs?spm=1055.2569.3001.10343) 首先,确保你拥有一个适合实验的STM32开发板,例如野火STM32开发板,以及一张MicroSD卡和相应的读卡器。在硬件连接方面,你需要正确配置SDIO接口的引脚连接到MicroSD卡,并确保所有必要的电源和地线连接。 接下来,是软件层面的设置。你需要配置STM32的时钟系统、SDIO硬件抽象层(HAL),并正确初始化SDIO接口。在此基础上,结合DMA模式,可以实现数据的高效传输。具体来说,你需要在SDIO数据传输函数中启用DMA,并在Fatfs库的底层API中进行相应的调用,这样可以减少CPU的干预,提高数据传输速率。 在软件层面,移植Fatfs库涉及到编写或修改几个关键的驱动文件,如`diskio.c`、`ff.c`和`cc936.c`等,这些文件将负责与Fatfs库进行交云,实现文件系统的功能。在这些文件中,你需要根据STM32的硬件特性来实现相应的接口函数,使得Fatfs库能够正确地与SDIO接口配合工作。 此外,在DMA模式下,你还需要编写相应的DMA中断服务函数,用于处理传输完成后的后续操作。同时,注意在编写程序时要考虑到错误处理机制,确保在出现错误时能够及时响应并处理。 完成以上步骤后,你应该能够在STM32平台上成功移植并运行Fatfs文件系统,通过SDIO接口与MicroSD卡进行高效的数据交换。如果你希望对STM32文件系统、硬件通信和库开发有更深入的理解和掌握,可以继续阅读《零死角玩转STM32-高级篇2:文件系统(Fatfs-0.09 图解移植过程)》后续的内容。这本书不仅为你提供了详细的移植步骤,还通过图解和实例,帮助你更好地理解整个系统的运作。 参考资源链接:[STM32高级篇:Fatfs-0.09移植教程详解](https://wenku.csdn.net/doc/3ggy2vmpqs?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值