使用Cubemx 创建SD的文件系统工程
软件工具
1、 STM32CubeMX 6.2.1 2、 Keil MDK5.35 3、 CubeMX 引用固件库版本 STM32Cube_FW_F1_V1.8.4
创建 CubeMX 工程
SDIO 配置
SDIO 配置,如果通信出现 IO 层的错误,可以尝试增大分频系数来减小时钟
FATFS配置
选择 SD 卡 1、 长文件夹名存储位置 我们设置在栈空间 STACK(在生成工程是需要调整栈空间大小) 2、 文件夹名的长度 3、 FS_RPATH 该参数与部分函数使能有关 详细查看 ffconf.h 文件中的注释
创建工程
引用 Middlewares 的 FatFs 分析
Fatfs 概述
在 CUbeMX 中引用的文件系统版本为 0.11
官方 0.11 版本中的内容
文件名 | 文件内容 | 修改需求 |
---|
00readme.txt | 当前文件 | | history.txt | 修订历史 | | ffconf.h | FatFs 模块的配置文件 | | ff.h | FatFs 和应用程序模块的通用包含文件 | | ff.c | FatFs 模块 | | diskio.h | FatFs 和磁盘 I/O 模块的通用包含文件 | | diskio.c | 将现有磁盘 I/O 模块附加到 FatFs 的粘合函数示例 | | integer.h | FatFs 的整数类型定义 | | option | 可选的外部函数 | 支持简体中文的cc963.c文件 |
在 CubeMX 的引用中多的文件
关键结构体与枚举数据
文件系统对象结构体(FATFS)
typedef struct {
union{
UINT d32[_MAX_SS/4];
BYTE d8[_MAX_SS];
}win;
BYTE fs_type;
BYTE drv;
BYTE csize;
BYTE n_fats;
BYTE wflag;
BYTE fsi_flag;
WORD id;
WORD n_rootdir;
#if _MAX_SS != _MIN_SS
WORD ssize;
#endif
#if _FS_REENTRANT
_SYNC_t sobj;
#endif
#if !_FS_READONLY
DWORD last_clust;
DWORD free_clust;
#endif
#if _FS_RPATH
DWORD cdir;
#endif
DWORD n_fatent;
DWORD fsize;
DWORD volbase;
DWORD fatbase;
DWORD dirbase;
DWORD database;
DWORD winsect;
} FATFS;
文件对象结构体(FIL)
typedef struct {
#if !_FS_TINY
union{
UINT d32[_MAX_SS/4];
BYTE d8[_MAX_SS];
}buf;
#endif
FATFS* fs;
WORD id;
BYTE flag;
BYTE err;
DWORD fptr;
DWORD fsize;
DWORD sclust;
DWORD clust;
DWORD dsect;
#if !_FS_READONLY
DWORD dir_sect;
BYTE* dir_ptr;
#endif
#if _USE_FASTSEEK
DWORD* cltbl;
#endif
#if _FS_LOCK
UINT lockid;
#endif
} FIL;
目录对象结构体(DIR)
typedef struct {
#if !_FS_TINY
union{
UINT d32[_MAX_SS/4];
BYTE d8[_MAX_SS];
}buf;
#endif
FATFS* fs;
WORD id;
WORD index;
DWORD sclust;
DWORD clust;
DWORD sect;
BYTE* dir;
BYTE* fn;
#if _FS_LOCK
UINT lockid;
#endif
#if _USE_LFN
WCHAR* lfn;
WORD lfn_idx;
#endif
#if _USE_FIND
const TCHAR* pat;
#endif
} DIR;
文件信息结构体(FILINFO)
typedef struct {
DWORD fsize;
WORD fdate;
WORD ftime;
BYTE fattrib;
TCHAR fname[13];
#if _USE_LFN
TCHAR* lfname;
UINT lfsize;
#endif
} FILINFO;
文件函数返回码(FRESULT)
typedef enum {
FR_OK = 0,
FR_DISK_ERR,
FR_INT_ERR,
FR_NOT_READY,
FR_NO_FILE,
FR_NO_PATH,
FR_INVALID_NAME,
FR_DENIED,
FR_EXIST,
FR_INVALID_OBJECT,
FR_WRITE_PROTECTED,
FR_INVALID_DRIVE,
FR_NOT_ENABLED,
FR_NO_FILESYSTEM,
FR_MKFS_ABORTED,
FR_TIMEOUT,
FR_LOCKED,
FR_NOT_ENOUGH_CORE,
FR_TOO_MANY_OPEN_FILES,
FR_INVALID_PARAMETER
} FRESULT;
使用注意事项
如果对文件进行了任何更改之后未关闭文件或掉电前未关闭文件,会导致数据写入失败 在电脑上查看不存在写入数据 可以使用 f_write 函数与 f_sync 函数配合将数据刷新到文件对象中
FRESULT f_sync ( FIL* fp );
|