STM32之HAL开发——CubeMX串行Flash文件系统源码讲解

前提

本次源码讲解是根据FatFS文件系统使用的流程进行

注册设备函数

uint8_t FATFS_LinkDriver(Diskio_drvTypeDef *drv, char *path)
{return FATFS_LinkDriverEx(drv, path, 0);
}
---------------------------------------------------------------------------------------------------
typedef struct
{DSTATUS (*disk_initialize) (BYTE);                     /*!< Initialize Disk Drive                     */DSTATUS (*disk_status)     (BYTE);                     /*!< Get Disk Status                           */DRESULT (*disk_read)       (BYTE, BYTE*, DWORD, UINT);       /*!< Read Sector(s)                            */
#if _USE_WRITE == 1 DRESULT (*disk_write)      (BYTE, const BYTE*, DWORD, UINT); /*!< Write Sector(s) when _USE_WRITE = 0       */
#endif /* _USE_WRITE == 1 */
#if _USE_IOCTL == 1  DRESULT (*disk_ioctl)      (BYTE, BYTE, void*);              /*!< I/O control operation when _USE_IOCTL = 1 */
#endif /* _USE_IOCTL == 1 */}Diskio_drvTypeDef;

在使用FatFS文件系统前需要对使用的设备进行注册,需要传入俩个参数一个是Diskio_drvTypeDef,一个是文件路径参数可以是这样的:char SPIFLASHPath[4]。而其中的Diskio_drvTypeDef是一个结构体,里面定义了三个函数指针,需要在创建结构体时声明对应的函数。

设备挂载函数

FRESULT f_mount (FATFS* fs,			/* Pointer to the file system object (NULL:unmount)*/const TCHAR* path,	/* Logical drive number to be mounted/unmounted */BYTE opt			/* 0:Do not mount (delayed mount), 1:Mount immediately */
)

设备注册成功后,需要在串行FLASH挂载文件系统,文件系统挂载时会对串行FLASH初始化。如果要取消挂载, 则在第一个参数传入NULL即可

文件系统格式化函数

FRESULT f_mkfs (const TCHAR* path,	/* Logical drive number */BYTE sfd,			/* Partitioning rule 0:FDISK, 1:SFD */UINT au				/* Size of allocation unit in unit of byte or sector */
)

在创建文件系统前,需要对文件系统进行格式化,第一个传入路径,第二三个参数传入0,0即可。

au:簇大小,即每个簇所包含的扇区数。在创建文件系统时,需要指定簇大小。簇大小会影响文件系统的性能和空间利用率。一般情况下,簇大小应该根据磁盘容量进行选择。例如,对于1GB以下的磁盘,可以选择4KB的簇大小;对于1GB到32GB的磁盘,可以选择8KB的簇大小;对于32GB以上的磁盘,可以选择16KB的簇大小。如果au为0,则会自动选择簇大小。

简单使用函数

打开/创建文件
FRESULT f_open (FIL* fp,			/* Pointer to the blank file object */const TCHAR* path,	/* Pointer to the file name */BYTE mode			/* Access mode and file open mode flags */
)

示例:可以配合sprintf实现路径拼接,进而打开或者创建文件

sprintf(tempfilepath,"%s%s",SPIFLASHPath,"FatFs读写测试文件.txt"); //拼接出带逻辑驱动器名的完整路径名
f_res = f_open(&file, tempfilepath,FA_CREATE_ALWAYS | FA_WRITE );
写文件
FRESULT f_write (FIL* fp,			/* Pointer to the file object */const void *buff,	/* Pointer to the data to be written */UINT btw,			/* Number of bytes to write */UINT* bw			/* Pointer to number of bytes written */
)

示例:传入一个char数组作为要写入的数据,fnum作为函数返回写入成功的字节数

  f_res=f_write(&file,WriteBuffer,sizeof(WriteBuffer),&fnum);
读文件
FRESULT f_read (FIL* fp, 		/* Pointer to the file object */void* buff,		/* Pointer to data buffer */UINT btr,		/* Number of bytes to read */UINT* br		/* Pointer to number of bytes read */
)

示例:传入一个空char数组作为缓冲区用于接收数据,fnum作为函数返回读出成功的字节数

      f_res = f_read(&file, ReadBuffer, sizeof(ReadBuffer), &fnum); 
关闭文件
FRESULT f_close (FIL *fp		/* Pointer to the file object to be closed */
)
注销设备

在注销设备前,需要先取消挂载的文件路径。

uint8_t FATFS_UnLinkDriver(char *path)
{ return FATFS_UnLinkDriverEx(path, 0);
}

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

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

相关文章

MySQL学习-非事务相关的六大日志、InnoDB的三大特性以及主从复制架构

一. 六大日志 慢查询日志:记录所有执行时间超过long_query_time的查询&#xff0c;方便定位并优化。 # 查询当前慢查询日志状态 SHOW VARIABLES LIKE slow_query_log; #启用慢查询日志 SET GLOBAL slow_query_log ON; #设置慢查询文件位置 SET GLOBAL slow_query_log_file …

Linux(磁盘管理与文件系统)

目录 1. 磁盘基础 1.1 磁盘结构 1.2 MBR 1.3 磁盘分区结构 2. 文件系统类型 2.1 XFS文件系统 2.2 SWAP 2.3 fdisk命令 2.4 创建新硬盘 3.创建文件系统 3.1 mkfs 3.2 挂载、卸载文件系统 3.3 查看磁盘使用情况 1. 磁盘基础 1.1 磁盘结构 磁盘的物理结构 盘片:硬…

工业相机曝光、增益、自动曝光、自动增益参数功能介绍和设置指南

工业相机曝光、增益、自动曝光、自动增益参数功能介绍和设置指南 工业相机基本参数介绍工业相机曝光、增益、亮度等介绍工业相机如何设置曝光参数工业相机如何设置增益参数 工业相机基本参数介绍 在使用工业相机时&#xff0c;曝光、增益、亮度和信噪比之间有密切的相互关系。…

大数据:【学习笔记系列】flink和spark的区别

Apache Flink 和 Apache Spark 是两种流行的大数据处理框架&#xff0c;它们在架构、性能和使用场景等方面都有各自的特点和优势。下面是对 Flink 和 Spark 主要区别的详细对比&#xff1a; 1. 处理方式&#xff1a;流处理 vs 微批处理 Apache Flink&#xff1a; Flink 被设计…

35. UE5 RPG制作火球术技能

接下来&#xff0c;我们将制作技能了&#xff0c;总算迈进了一大步。首先回顾一下之前是如何实现技能触发的&#xff0c;然后再进入正题。 如果想实现我之前的触发方式的&#xff0c;请看此栏目的31-33篇文章&#xff0c;讲解了实现逻辑&#xff0c;这里总结一下&#xff1a; …

微服务拆分:打造高性能、高扩展的未来架构

目录 一、微服务介绍 二、主链路规划 2.1 业务完整性 2.2 转化率重因子 2.3 流量端占比 2.4 现金水库 三、如何识别主链路 3.1 导流端 3.2 转化端 3.3 漏斗中部&#xff1a;订单转化 3.4 漏斗底部&#xff1a;下单 四、总结 一、微服务介绍 单体应用将所有的功能都…

微服务架构与Dubbo

一、微服务架构 微服务架构是一种架构概念&#xff0c;旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦。 分布式系统式若干独立系统的集合&#xff0c;但是用户使用起来好像是在使用一套系统。 和微服务对应的是单体式开发&#xff0c;即所有的功能打包在一个WAR…

静默拷贝U盘里的ppt/pptx

专门用于拷贝老师讲课的课件&#xff01;&#xff01;&#xff01;本程序需要编译&#xff0c;运行后无界面&#xff0c;如果需要关闭的话&#xff0c;请从任务管理器里关闭 附上代码&#xff1a; import os import shutil import time import psutil# 获取本机硬盘盘符列表 …

搭建Zookeeper完全分布式集群(CentOS 9 )

ZooKeeper是一个开源的分布式协调服务&#xff0c;它为分布式应用提供了高效且可靠的分布式协调服务&#xff0c;并且是分布式应用保证数据一致性的解决方案。该项目由雅虎公司创建&#xff0c;是Google Chubby的开源实现。 分布式应用可以基于ZooKeeper实现诸如数据发布/订阅…

Vue的生命周期的详解

Vue的生命周期是每个使用Vue框架的前端人员都需要掌握的知识&#xff0c;以此作为记录。 Vue的生命周期就是vue实例从创建到销毁的全过程&#xff0c;也就是new Vue() 开始就是vue生命周期的开始。Vue 实例有⼀个完整的⽣命周期&#xff0c;也就是从开始创建、初始化数据、编译…

算法|最大堆、最小堆和堆排序的实现(JavaScript)

一些概念 堆&#xff1a;特殊的完全二叉树&#xff0c;具有特定性质的完全二叉树。大根堆&#xff1a;父节点 > 子节点小根堆&#xff1a;父节点 < 子节点 二叉堆也属于完全二叉树&#xff0c;所以可以用数组表示。 若下标从1开始&#xff0c;左节点为 2*i &#xff0…

树莓派4B+Debian(Raspbian)+开机自启动Python文件

非系统全面的教程&#xff0c;只是记录操作过程中的问题和解决方案。 说明1&#xff1a;树莓派的不同版本&#xff0c;要查看CPU的位数、内存大小&#xff1b;从而确定安装的raspbian的对应版本 若是对应64位的OS&#xff0c;安装成了32位的OS&#xff0c;可能会对系统中安装…

ChatGPT助手:写作无忧

ChatGPT无限次数:点击直达 ChatGPT助手&#xff1a;写作无忧 在当今信息爆炸的时代&#xff0c;写作已经成为了各行各业不可或缺的技能。无论是学术论文、技术博客还是市场推广文案&#xff0c;文字的质量往往决定了一篇作品的成败。然而&#xff0c;对于许多人来说&#xff0…

5、JVM-G1详解

G1收集器 -XX:UseG1GC G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征. G1将Java堆划分为多个大小相等的独立区域&#xff08;Region&#xff09;&#xff0c;JVM目标…

Qt中定时器的3种实现方法

一.使用QTimer定时器类&#xff08;首选&#xff09; 1.示例代码&#xff1a; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); ui->setupUi(this); time1 new QTimer(); time1->setInterval(1000…

SQL书写顺序与执行顺序

1、书写顺序 sql语句的书写顺序: select >> from >> where >> group by >> having >> order by >> limit select [ALL | DISTINCT | DISTINCTROW | TOP] 字段 from 表 [inner join right join | left join 表2] [on 连接条件] [where …

代码学习记录25---单调栈

随想录日记part45 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.04.17 主要内容&#xff1a;今天开始要学习单调栈的相关知识了&#xff0c;今天的内容主要涉及&#xff1a;每日温度 &#xff1b;下一个更大元素 I 739. 每日温度 496.下一个更大元素 I Topic…

pytorch中unsqueeze用法说明

在指定的位置插入一个维度&#xff0c;有两个参数&#xff0c;input是输入的tensor&#xff0c;dim是要插到的维度 需要注意的是dim的范围是[-input.dim()-1, input.dim()1)&#xff0c;是一个左闭右开的区间&#xff0c;当dim为负值时&#xff0c;会自动转换为dim diminput.…

书生·浦语大模型全链路开源体系-第4课

书生浦语大模型全链路开源体系-第4课 书生浦语大模型全链路开源体系-第4课相关资源XTuner 微调 LLMXTuner 微调小助手认知环境安装前期准备启动微调模型格式转换模型合并微调结果验证 将认知助手上传至OpenXLab将认知助手应用部署到OpenXLab使用XTuner微调多模态LLM前期准备启动…

Mac电脑上有什么好玩的格斗游戏 《真人快打1》可以在苹果电脑上玩吗

你是不是喜欢玩格斗游戏&#xff1f;你是不是想在你的Mac电脑上体验一些刺激和激烈的对战&#xff1f;在这篇文章中&#xff0c;我们将介绍Mac电脑上有什么好玩的格斗游戏&#xff0c;以及《真人快打1》可以在苹果电脑上玩吗。 一、Mac电脑上有什么好玩的格斗游戏 格斗游戏是…