使用STM32CubeMX配置生成FATFS文件系统,该文件系统的代码是ST根据FTAFS官网源码修改封装而来的,关于FATFS官网源码移植方法可参考:
SD卡之FATFS库移植
下面介绍STM32CubeMX方法的FATFS文件系统使用方法,对于STM32F103系列,只支持STM32CubeMX支持SD和用户自定义两种配置如下:
其中Set Defines为关于ffconf.h中的先关宏定义的配置,对一些功能进行使能/失能配置等操作。每个宏定义的解释可以参看官网:
宏定义配置解释
如果硬件的SD卡使用的是SDIO传输模式,那么可以配置SDIO,并选择SD的FATFS配置模式
如果用的是其他存储介质比如flash或者SD卡用的是SPI传输模式,那么我们选择使用用户自定义来生成FATFS。下面以用户自定义方式来说明。生成代码结构如下:
/***************************************重要的设备结构体*****************************/
typedef struct
{
DSTATUS (*disk_initialize) (BYTE); /*磁盘初始化函数指针 */
DSTATUS (*disk_status) (BYTE); /*获取磁盘状态 */
DRESULT (*disk_read) (BYTE, BYTE*, DWORD, UINT); /*磁盘读函数指针 */
#if _USE_WRITE == 1
DRESULT (*disk_write) (BYTE, const BYTE*, DWORD, UINT); /*磁盘写函数指针_USE_WRITE = 0 */
#endif /* _USE_WRITE == 1 */
#if _USE_IOCTL == 1
DRESULT (*disk_ioctl) (BYTE, BYTE, void*); /*!< I/O控制函数指针 _USE_IOCTL = 1 */
#endif /* _USE_IOCTL == 1 */
}Diskio_drvTypeDef;
/*******************全局磁盘IO驱动程序结构定义**************************/
typedef struct
{
uint8_t is_initialized[_VOLUMES];
Diskio_drvTypeDef *drv[_VOLUMES];//可以定义_VOLUMES个存储设备
uint8_t lun[_VOLUMES];
__IO uint8_t nbr;
}Disk_drvTypeDef;
/**********************fatfs.c fatfs应用程序代码**********************/
void MX_FATFS_Init(void)
{
/* FatFS: Link the USER driver */
retUSER = FATFS_LinkDriver(&USER_Driver, USERPath);//初始化设备驱动,这里用的是结构体+函数指针的形式进行了封装
}
/**********************diskio.c fatfs底层磁盘I/O驱动**********************/
/* 获取存储介质的状态 */
DSTATUS disk_status (BYTE pdr){}
/* 初始化驱动*/
DSTATUS disk_initialize (BYTE pdrv){}
/*磁盘读*/
DRESULT disk_read (
BYTE pdrv, /* Physical drive nmuber to identify the drive */
BYTE *buff, /* Data buffer to store read data */
DWORD sector, /* Sector address in LBA */
UINT count /* Number of sectors to read */
)
/*磁盘写*/
DRESULT disk_write (
BYTE pdrv, /* Physical drive nmuber to identify the drive */
const BYTE *buff, /* Data to be written */
DWORD sector, /* Sector address in LBA */
UINT count /* Number of sectors to write */
)
/*I/O控制*/
DRESULT disk_ioctl (
BYTE pdrv, /* Physical drive nmuber (0..) */
BYTE cmd, /* Control code */
void *buff /* Buffer to send/receive control data */
)
//以上几个函数最终调用的还是函数指针
/**********ff.c fatfs的私有的模块定义**************/
//比如f_open、f_mount、f_write、f_read、f_close
/*********ff_gen_drv.c fatfs通用底层驱动程序**************/
uint8_t FATFS_LinkDriverEx(Diskio_drvTypeDef *drv, char *path, uint8_t lun)
{ /*用于加载存储介质的底层驱动*/
uint8_t ret = 1;
uint8_t DiskNum = 0;
if(disk.nbr <= _VOLUMES)
{
disk.is_initialized[disk.nbr] = 0;
disk.drv[disk.nbr] = drv;
disk.lun[disk.nbr] = lun;
DiskNum = disk.nbr++;
path[0] = DiskNum + '0';
path[1] = ':';
path[2] = '/';
path[3] = 0;
ret = 0;
}
return ret;
}
/*对上面的函数又封装了一下*/
uint8_t FATFS_LinkDriver(Diskio_drvTypeDef *drv, char *path)
{
return FATFS_LinkDriverEx(drv, path, 0);
}
/********syscall.c fatfs依赖于操作系统的控件示例代码与官网源码中的ffsystem.c等价,暂时不要关心********/
/********ccsbcs.c与官网源码ffunicode.c等价 Unicode -本地代码双向转换器*/
/********user_diskio.c 用户自定义的存储器设备驱动*********/
//实例化Diskio_drvTypeDef变量USER_Driver ,最终的USER_Driver被MX_FATFS_Init挂载
Diskio_drvTypeDef USER_Driver =
{
USER_initialize,
USER_status,
USER_read,
#if _USE_WRITE
USER_write,
#endif /* _USE_WRITE == 1 */
#if _USE_IOCTL == 1
USER_ioctl,
#endif /* _USE_IOCTL == 1 */
};
//并由用户依次实现USER_initialize,USER_status,
//USER_read,USER_write,USER_ioctl函数
文件结构图如下
至此已经梳理完STM32CubeMX生成的fatfs文件系统,结合SD卡之FATFS库移植可以看出,我们只需要修改的文件为user_diskio.c,即实现自定义的驱动编写即可。