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

devtools/2024/11/15 4:57:10/

前提

本次源码讲解是根据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.ppmy.cn/devtools/5915.html

相关文章

【QT学习】7.事件,把文本显示在页面中(文本可变),鼠标指针切换,鼠标左键右键按下,qt设置背景样式

0.创建项目&#xff0c;事件的创建 1.事件的位置 2.这就是多态&#xff0c;子类重写父类函数&#xff0c;子类调用子类函数&#xff0c;也可以调用父类函数。但同函数名 1.要求&#xff1a;文本显示在页面中&#xff08;文本可变&#xff09; 1.文本显示在页面的核心代码 主要步…

深入了解 Gitea:轻量级的自托管 Git 服务

在软件开发和团队协作中&#xff0c;版本控制系统是不可或缺的工具。Git 是目前最流行的分布式版本控制系统之一&#xff0c;而 Gitea 则是基于 Git 的一个轻量级、自托管的 Git 服务。本文将介绍 Gitea 的特点、功能和使用方法&#xff0c;帮助读者更好地了解和使用这一工具。…

电子元件替换原则

由于降低BOM的成本&#xff08;比如国产化&#xff09;、电子元件已经停产、维修时电子元件的损坏更换等原因&#xff0c;我们需要做同类电子元件的替换工作。那么替换有什么原则呢&#xff1f;本内容将不间断更新一些原则。紫色文字是超链接&#xff0c;点击自动跳转至相关博文…

[阅读笔记15][Orca]Progressive Learning from Complex Explanation Traces of GPT-4

接下来是微软的Orca这篇论文&#xff0c;23年6月挂到了arxiv上。 目前利用大模型输出来训练小模型的研究都是在模仿&#xff0c;它们倾向于学习大模型的风格而不是它们的推理过程&#xff0c;这导致这些小模型的质量不高。Orca是一个有13B参数的小模型&#xff0c;它可以学习到…

vlan 和 trunk实验

VLAN&#xff08;Virtual Local Area Network&#xff09;&#xff0c;即虚拟局域网&#xff0c;是一种网络技术&#xff0c;它的主要原理是将物理网络划分为多个逻辑子网&#xff0c;每个子网形成一个独立的广播域。这样&#xff0c;VLAN内的主机间通信就像在同一个局域网内一…

gazebo中vins-fusion在仿真小车上的部署

软件要求&#xff1a;Ubuntu 20.04 ros的noetic版本&#xff0c;我是在虚拟机vitrualbox上运行的 这几天在学ROS&#xff0c;跟着赵虚左老师过了一遍之后&#xff0c;感觉还是有很多不懂的地方&#xff0c;xtdrone上仿真跟着文档走了一遍&#xff0c;好像没学到什么东西&#…

Web后端-请求响应

黑马程序员JavaWeb开发教程 文章目录 一、请求1、简单参数2、实体参数3、数组集合参数&#xff08;1&#xff09;数组参数&#xff08;2&#xff09;集合参数 4、日期参数5、json参数&#xff08;1&#xff09;在Postman中怎么发起请求来传递JSON格式的请求参数&#xff08;2&a…

【网络安全技术】——网络安全设备(学习笔记)

&#x1f4d6; 前言&#xff1a;网络防火墙&#xff08;简称为“防火墙”&#xff09;是计算机网络安全管理中应用最早和技术发展最快的安全产品之一。随着互联应用的迅猛发展&#xff0c;各种安全问题和安全隐患日渐突出。防火墙及相关安全技术能够最大可能地解决各类安全问题…