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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/76940.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

唯美社区源码AM社区同款源码

源码介绍 唯美社区源码AM社区同款源码 后端修改application.properties文件内容为你的数据库 前端修改/config/config.js文件内容为你的后端地址 这两个文件里要修改的地方我已经用中文标注出来了 截图 源码免费下载 唯美社区源码AM社区同款源码

现代Web应用的多标签选择组件:设计哲学与工程实践

引言:标签选择的重要性与挑战 在信息爆炸时代,标签系统已成为内容组织的核心基础设施。研究表明: 使用标签系统的平台用户留存率提高35% 良好的标签选择体验可提升内容发现效率58% 80%的用户更倾向于使用提供可视化标签选择的应用 本文将…

P3799 小 Y 拼木棒

题目背景 上道题中,小 Y 斩了一地的木棒,现在她想要将木棒拼起来。 题目描述 有 n 根木棒,现在从中选 4 根,想要组成一个正三角形,问有几种选法? 答案对 1097 取模。 输入格式 第一行一个整数 n。 第…

Perl 条件语句

Perl 条件语句 引言 在编程中,条件语句是执行分支逻辑的关键部分。Perl 作为一种强大的脚本语言,提供了丰富的条件语句,使得开发者能够根据不同的条件执行不同的代码块。本文将深入探讨 Perl 中的条件语句,包括 if、unless、els…

流量特征分析-蚁剑流量分析

任务: 木马的连接密码是多少 这是分析蚁剑流量,可能是网站的,wireshark过滤http 追踪流http得到 1就是连接密码 flag{1}黑客执行的第一个命令是什么 取最后的执行命令。base64解密得 除了id不是蚁剑自带的命令,其他的都是&…

问题1:Sinal 4在开启PAC检查的设备崩溃

​ 问题信息 硬件不支持PAC(Pointer Authentication),此类错误就是signal 11的错误,崩溃信息如下: Build fingerprint: google/sdk_gphone64_arm64/emu64a:16/BP22.250221.010/13193326:userdebug/dev-keys Revision: 0 ABI: arm64 Timestamp: 2025-04-06 11:33:13.923…

FreeRTOS移植笔记:让操作系统在你的硬件上跑起来

一、为什么需要移植? FreeRTOS就像一套"操作系统积木",但不同硬件平台(如STM32、ESP32、AVR等)的CPU架构和外设差异大,需要针对目标硬件做适配配置。移植工作就是让FreeRTOS能正确管理你的硬件资源。 二、…

【C++11(下)】—— 我与C++的不解之缘(三十二)

前言 随着 C11 的引入,现代 C 语言在语法层面上变得更加灵活、简洁。其中最受欢迎的新特性之一就是 lambda 表达式(Lambda Expression),它让我们可以在函数内部直接定义匿名函数。配合 std::function 包装器 使用,可以…

JavaScript中的Proxy详解

1. 什么是Proxy? Proxy是ES6引入的一个强大特性,它允许你创建一个对象的代理,从而可以拦截和自定义该对象的基本操作。Proxy提供了一种机制,可以在对象的基本操作,如属性查找、赋值、枚举、函数调用等之前或之后执行自…

【git】VScode修改撤回文件总是出现.lh文件,在 ​所有 Git 项目 中全局忽略特定文件

VScode里面powershell被迫关闭 场景解决办法 场景 系统:Windows IDE:Visual Studio Code 一旦修改代码,就算撤回也会显示 解决办法 第一步:“C:\Users\用户名字.gitignore_global”:在该路径下新建.gitignore_glo…

为什么 LoRA 梯度是建立在全量参数 W 的梯度之上

🧠 首先搞清楚 LoRA 是怎么做微调的 我们原来要训练的参数矩阵是 W W W,但 LoRA 说: 别动 W,我在它旁边加一个低秩矩阵 Δ W U V \Delta W UV ΔWUV,只训练这个部分! 也就是说,LoRA 用一个…

Nginx负载均衡时如何为指定ip配置固定服务器

大家在用Nginx做负载均衡时,一般是采用默认的weight权重指定或默认的平均分配实现后端服务器的路由,还有一种做法是通过ip_hash来自动计算进行后端服务器的路由,但最近遇到一个问题,就是希望大部分用户采用ip_hash自动分配后端服务…

Llama 4 家族:原生多模态 AI 创新的新时代开启

0 要点总结 Meta发布 Llama 4 系列的首批模型,帮用户打造更个性化多模态体验Llama 4 Scout 是有 170 亿激活参数、16 个专家模块的模型,同类中全球最强多模态模型,性能超越以往所有 Llama 系列模型,能在一张 NVIDIA H100 GPU 上运…

【硬件开发技巧】如何通过元器件丝印反查型号

目录 一、在线数据库查询 二、官方资料匹配 三、专业软件辅助 四、实物比对与场景推断 五、社区与人工支持 注意事项 一、在线数据库查询 专业元器件平台 Digi-Key、Mouser、ICMaster等平台支持直接输入丝印代码检索,可获取芯片型号、技术文档及替代型号。例如…

【算法/c++】利用中序遍历和后序遍历建二叉树

目录 题目:树的遍历前言题目来源树的数组存储基本思想存储规则示例 建树算法关键思路代码总代码 链表法 题目:树的遍历 前言 如果不是完全二叉树,使用数组模拟树,会很浪费空间。 题目来源 本题来自 PTA 天梯赛。 题目链接: 树…

李臻20242817_安全文件传输系统项目报告_第6周

安全文件传输系统项目报告(第 1 周) 1. 代码链接 Gitee 仓库地址:https://gitee.com/li-zhen1215/homework/tree/master/Secure-file 代码结构说明: project-root/├── src/ # 源代码目录│ ├── main.c # 主程序入口│ ├…

嵌入式rodata段

在嵌入式软件开发中,将数据放入只读数据段(.rodata)具有以下好处及典型应用示例: 好处 数据保护 .rodata段的内容在程序运行时不可修改,防止意外或恶意篡改,提升系统稳定性。 节省RAM资源 只读数据可直接…

InfoSec Prep: OSCP靶场渗透

InfoSec Prep: OSCP InfoSec Prep: OSCP ~ VulnHubInfoSec Prep: OSCP, made by FalconSpy. Download & walkthrough links are available.https://www.vulnhub.com/entry/infosec-prep-oscp,508/ 1,将两台虚拟机网络连接都改为NAT模式 2,攻击机上做…

【JavaWeb-Spring boot】学习笔记

目录 <<回到导览Spring boot1. http协议1.1.请求协议1.2.响应协议 2.Tomcat2.1.请求2.1.1.apifox2.1.2.简单参数2.1.3.实体参数2.1.4.数组集合参数2.1.5.日期参数2.1.6.(重点)JSON参数2.1.7.路径参数 2.2.响应2.3.综合练习 3.三层架构3.1.三层拆分3.2.分层解耦3.3.补充 &…

C++的多态-上

目录 多态的概念 多态的定义及实现 1.虚函数 2. 多态的实现 2.1.多态构成条件 2.2.虚函数重写的两个例外 (1)协变(基类与派生类虚函数返回值类型不同) (2)析构函数的重写(基类与派生类析构函数的名字不同) 2.3.多态的实现 2.4.多态在析构函数中的应用 2.5.多态构成条…