当前位置: 首页 > news >正文

FATFS备忘

概述

FATFS文件系统可以挂载SD卡也可以挂载FLASH eMMC等设备

SD卡需要格式化为FAT32模式 块大小默认即可

image-20250401131154037

移植

SD卡

SD卡扇区大小是 512B

SD卡 SDIO模式 可以直接在cubeMX里一键设置

先设置好SD卡的设置

这个是选择支持中文 其余是默认

image-20250401144906909

这个是检测引脚可以留空

当SD卡插入拔出时会引起检测脚的变化

image-20250401144931735

FLASH

FLASH接入FATFS需要自行修改接口,选用自定义模式

建议配合USB MSC功能使用

cubeMX配置

使用自定义模式,将扇区大小改为从512到4096都可

image-20250406164521203

设置内容

全在cubeMX生成的user_diskio.c

先导入头文件和设置扇区大小

image-20250406165626285

需要设置的APIs

全在cubeMX生成的user_diskio.c

初始化
描述名称功能
BYTE(uint8_t)pdrv磁盘编号
DSTATUS输出错误码
DSTATUS USER_initialize (BYTE pdrv)

成功返回RES_OK 失败返回RES_ERROR

根据自己初始化写入函数

例子

这里不需要初始化直接返回成功即可

DSTATUS USER_initialize(
    BYTE pdrv /* Physical drive nmuber to identify the drive */
)
{
  /* USER CODE BEGIN INIT */
  UNUSED(pdrv);

  return RES_OK;
  /* USER CODE END INIT */
}
获取磁盘状态
描述名称功能
BYTE(uint8_t)pdrv磁盘编号
DSTATUS输出错误码
DSTATUS USER_status(BYTE pdrv)

成功返回RES_OK 失败返回RES_ERROR

不使用返回即可

例子

DSTATUS USER_status(
    BYTE pdrv /* Physical drive number to identify the drive */
)
{
  /* USER CODE BEGIN STATUS */
  UNUSED(pdrv);

  return RES_OK;
  /* USER CODE END STATUS */
}
读取扇区
描述名称功能
BYTE(uint8_t)pdrv磁盘编号
BYTE(uint8_t)buff缓冲区
DWORDsector扇区编号
UINT (uint32_t)count扇区数量
DSTATUS输出错误码
DRESULT USER_read(BYTE pdrv,BYTE *buff,DWORD sector,UINT count)

示例

这个函数 W25Qxx_Read_Data输入的是FLASH的地址和byte数量,因此要乘上扇区大小

DRESULT USER_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 */
)
{
  /* USER CODE BEGIN READ */

  W25Qxx_Read_Data(sector * USER_SECTOR_SIZE, buff, count * USER_SECTOR_SIZE);

  return RES_OK;
  /* USER CODE END READ */
}
写入扇区
描述名称功能
BYTE(uint8_t)pdrv磁盘编号
BYTE(uint8_t)buff缓冲区
DWORDsector扇区编号
UINT (uint32_t)count扇区数量
DSTATUS输出错误码
DRESULT USER_write(BYTE pdrv,const BYTE *buff,DWORD sector,UINT count)

示例

这个函数W25Qxx_Write 输入的是FLASH的地址和byte数量,因此要乘上扇区大小

DRESULT USER_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 */
)
{
  /* USER CODE BEGIN WRITE */
  /* USER CODE HERE */

  W25Qxx_Write(sector * USER_SECTOR_SIZE, (uint8_t *)buff, count * USER_SECTOR_SIZE, 0);
  return RES_OK;
  /* USER CODE END WRITE */
}
控制操作
描述名称功能
BYTE(uint8_t)pdrv磁盘编号
BYTE(uint8_t)cmd命令
void *buff缓冲区
DSTATUS输出错误码
DRESULT USER_ioctl(BYTE pdrv,BYTE cmd,void *buff)

必须要响应的命令

描述功能
GET_SECTOR_COUNT扇区数量
GET_SECTOR_SIZE扇区大小 单位byte
GET_BLOCK_SIZE区块大小

例子

使用W25Q128 16MB

扇区大小为4096=4KB

扇区数为 4096 这里写4095

区块直接写1 即可

DRESULT USER_ioctl(
    BYTE pdrv, /* Physical drive nmuber (0..) */
    BYTE cmd,  /* Control code */
    void *buff /* Buffer to send/receive control data */
)
{
  /* USER CODE BEGIN IOCTL */

  DRESULT res = RES_OK;
  switch (cmd)
  {
  case CTRL_SYNC:
    res = RES_OK;
    break;
  case CTRL_TRIM:
    res = RES_OK;
    break;

  case GET_SECTOR_COUNT:
    *(DWORD *)buff = 4095;
    break;
  case GET_SECTOR_SIZE:
    *(DWORD *)buff = USER_SECTOR_SIZE;
    break;
  case GET_BLOCK_SIZE:
    *(DWORD *)buff = 1;
    break;
  }

  return res;
  /* USER CODE END IOCTL */
}

APIs

地址问题

根据初始化顺序,驱动器的根地址分别为0:/ 1:/

比如这个例子里 SD卡的根地址是0:/ USER(可以设为FLASH等) 地址为1:/

image-20250401151430074

挂载

输入输出
描述名称功能
FATFS*fs句柄
const TCHAR*path地址
BYTEopt是否立即加载(一般写1)
FRESULT输出错误码
FRESULT f_mount (FATFS* fs,const TCHAR* path,BYTE opt)

挂载例子

f_mount(&hFatfs, "0:/", 1);

打开文件

输入输出
描述名称功能
FIL*fp文件
const TCHAR*path地址
BYTEmode模式
FRESULT输出错误码
mode
描述功能
FA_READ只读
FA_WRITE只写
FA_OPEN_EXISTING如果文件存在,则打开;否则打开失败
FA_CREATE_NEW创建一个文件,如果文件存在,则创建失败
FA_CREATE_ALWAYS创建一个文件,如果文件存在,则覆盖原文件
FA_OPEN_ALWAYS如果文件存在,则打开,如果不存在则创建一个文件并打开

可以输入 FA_READ | FA_WRITE 来使用读写

FRESULT f_open (FIL* fp,const TCHAR* path,BYTE mode)

打开后光标指向开头

关闭文件

输入输出
描述名称功能
FIL*fp文件
FRESULT输出错误码
FRESULT f_close (FIL* fp)

读文件

输入输出
描述名称功能
FIL*fp文件
void*buff缓冲区
UINTbtr操作数量
UINT*br已操作数量
FRESULT输出错误码
FRESULT f_read (FIL* fp,void* buff,UINT btr,UINT* br)

会从光标处开始读取 指针自增

写文件

输入输出
描述名称功能
FIL*fp文件
void*buff缓冲区
UINTbtr操作数量
UINT*br已操作数量
FRESULT输出错误码
FRESULT f_write (FIL* fp,const void* buff,UINT btw,UINT* bw)

会从光标处开始写入 指针自增

打印到文件

输入输出
描述名称功能
FIL*fp文件
const TCHAR*fmt规则格式串
.........
int输出写入数量
int f_printf (FIL* fp,const TCHAR* fmt,...)

会从光标处开始写入 指针自增

获取文件大小

输入输出
描述名称功能
FIL*fp文件
FSIZE_t输出大小
f_size(fp)

改变光标位置

输入输出
描述名称功能
FIL*fp文件
FSIZE_tofs从顶部开始的偏移
FRESULT输出错误码
FRESULT f_lseek (FIL* fp,FSIZE_t ofs)

删除文件

输入输出
描述名称功能
const TCHAR*path路径
FRESULT输出错误码
FRESULT f_unlink (const TCHAR* path)

检查文件是否存在

输入输出
描述名称功能
const TCHAR*path路径
FILINFO*fno信息
FRESULT输出不存在FR_NO_FILE,存在FR_OK
FRESULT f_stat (const TCHAR* path,FILINFO* fno)

相关文章:

  • MySQL——DQL的多表查询
  • 【谷歌设置】chrome打开页面在新tab设置(新版)
  • 基于高云fpga实现的fir串行滤波器
  • C语言【删除前导空格】
  • Scala语言基础:开启你的 Flink 之旅
  • 手搓多模态-04 归一化介绍
  • PDF 转图片,一行代码搞定!批量支持已上线!
  • C++中的内联函数
  • 嵌入式rodata段
  • 解锁异步编程潜能:如何利用 `asyncio` 模块构建高并发 IO 密集型服务
  • PDFBox渲染生成pdf文档
  • 近期Lerobot资料汇总,待整理
  • 在 Ubuntu24.04 LTS 上 Docker Compose 部署基于 Dify 重构二开的开源项目 Dify-Plus
  • 尚硅谷2019版Java集合和泛型
  • Docker 从入门到进阶 (Win 环境) + Docker 常用命令
  • 【Android安卓移动计算】实现项目一[模拟器启动项目]
  • CSRF漏洞利用的小点总结
  • JVM 参数调优指南_优化 Java 应用性能
  • nginx中的limit_req 和 limit_conn
  • WPS宏开发手册——常见问题
  • 东营网站建设公司/qq代刷网站推广免费
  • 计算机应用技术是学什么的/网站关键词搜索排名优化
  • 自己的电脑可以做网站服务器/苏州百度搜索排名优化
  • 做房源网站/吉林seo排名公司
  • 个人型网站开站费用/网站搭建平台都有哪些
  • 做网页推广的网站/西安分类信息seo公司