(46)STM32——FATFS文件系统实验

news2025/1/12 5:51:41

目录

学习目标

运行结果

文件系统

常用系统

FATFS

特点

结构图

移植步骤

disk_initialize

disk_status

 disk_read

 disk_write

disk_ioctl

get_fattime

代码

总结 


学习目标

        我们要来介绍的是FATFS文件系统,这是一个为嵌入式设计的文件系统,甚至8051系列也可以使用,好了,我们开始介绍吧!

运行结果

 

文件系统

        负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。即在磁盘上组织文件的方法。

常用系统

  • FAT/FATFS
  • NTFS:基于安全性的文件系统,是Windows NT所采用的独特的文件系统结构。
  • CDFS:CDFS是大部分的光盘的文件系统。
  • exFAT

FATFS

        FATFS文件系统FATFS是一个完全免费开源的FAT文件系统模块,专门为小型的嵌入式系统而设计。完全用标准的C语言编写,所以具有良好的硬件平台独立性。可以移植到8051、PIC、AVR、SH、Z80、H8、ARM等系列单片机上而只需做简单的修改。它支持FAT12、FAT16和FAT32,支持多个存储媒介:有独立的缓冲区,可以对多个文件进行读/写,并特别对8位单片机和16位单片机做了优化。并且FATFS是可裁剪的文件系统,所以可以适配一些内存小的MCU,只需要删掉一些功能即可。

特点

  • Windows 兼容的 FAT 文件系统(支持 FAT12/FAT16/FAT32)
  • 与平台无关,移植简单
  • 代码量少、效率高
  • 多种配置选项
    • 支持多卷(物理驱动器或分区,最多 10 个卷)
    • 多个 ANSI/OEM 代码页包括 DBCS
    • 支持长文件名、ANSI/OEM 或 Unicode
    • 支持 RTOS
    • 支持多种扇区大小
    • 只读、最小化的 API 和 I/O 缓冲区等
  • 免费、开源

结构图

  1. 底层接口,包括存储媒介读或写接口(disk I/O)和供给文件创建修改时间的实时时钟,需要我们根据平台和存储介质编写移植代码。
  2. 中间层FATFS模块,实现了FAT文件读或写协议。FATFS模块提供的是ff.c和ff.h。除非有必要,使用者一般不用修改,使用时将头文件直接包含进去即可。
  3. 最顶层是应用层,使用者无需理会FATFS的内部结构和复杂的FAT协议,只需要调用FATFS模块提供给用户的一系列应用接口函数,如f_open  f_read  f_write和f_close等,就可以像在PC上读/写文件那样简单。

        这个就是FATFS文件系统包的结构,diskio 是我们需要与硬件相关的,需要我们来修改。ff 是核心系统代码,不需要修改。然后还有 ffconf 需要我们修改相应的配置。

        FATFS 模块在移植的时候,我们一般只需要修改 2 个文件,即 ffconf.h 和 diskio.c。FATFS 模块的所有配置项都是存放在 ffconf.h 里面,我们可以通过配置里面的一些选项,来满足自己的需求。接下来简单介绍几个配置选项。

  1. _FS_TINY。我们使用 FATFS,所以把这个选项定义为 0 即可。如果使用Tiny FATFS,就定义为1。
  2. _FS_READONLY。这个用来配置是不是只读,我们需要读写都用,所以这里设置为 0 即可。
  3. _USE_STRFUNC。这个用来设置是否支持字符串类操作,比如 f_putc,f_puts 等,比较耗内存,我们需要用到,故设置这里为 1。
  4. _USE_MKFS。这个用来定时是否使能格式化,我们需要用到,所以设置这里为 1。
  5. _USE_FASTSEEK。这个用来使能快速定位,我们设置为 1,使能快速定位。
  6. _USE_LABEL。这个用来设置是否支持磁盘盘符(磁盘名字)读取与设置。我们设置 为 1,使能,就可以通过相关函数读取或者设置磁盘的名字了。
  7. _CODE_PAGE。这个用于设置语言类型,包括很多选项,我们这里设置为 936,即简体中文(GBK 码,需要 c936.c 文件支持,该文件在 option 文件夹)。
  8. _USE_LFN。该选项用于设置是否支持长文件名(还需要_CODE_PAGE 支持),取值范围为 0~3。0,表示不支持长文件名,1~3 是支持长文件名,但是存储地方不一样,我们选择使用 3,通过 ff_memalloc 函数来动态分配长文件名的存储区域。
  9. _VOLUMES。用于设置 FATFS 支持的逻辑设备数目,我们设置为 2,即支持 2 个设备。
  10. _MAX_SS。扇区缓冲的最大值,一般设置为 512。

移植步骤

  1. 数据类型:在 integer.h 里面去定义好数据的类型。这里需要了解你用的编译器的数 据类型,并根据编译器定义好数据类型。
  2. 配置:通过 ffconf.h 配置 FATFS 的相关功能,以满足你的需要。
  3. 函数编写:打开 diskio.c,进行底层驱动编写,一般需要编写 6 个接口函数。

        第一步,我们使用的是 MDK5.11a 编译器,器数据类型和 integer.h 里面定义的一致,所以此步,我们不需要做任何改动。

        第二步,关于 ffconf.h 里面的相关配置,我们在前面已经有介绍(之前介绍的 10 个配置),我们将对应配置修改为我们介绍时候的值即可,其他的配置用默认配置。

        第三步,因为 FATFS 模块完全与磁盘 I/O 层分开,因此需要下面的函数来实现底层物理磁盘的读写与获取当前时间。底层磁盘 I/O 模块并不是 FATFS 的一部分,并且必须由用户提供。这些函数一般有 6 个,在 diskio.c 里面。

disk_initialize

        主要用来初始化磁盘。 

disk_status

         返回磁盘状态。

 disk_read

         首先选择磁盘,然后需要读的数据大小,所以需要做好适配。

 disk_write

        同上。 

disk_ioctl

        除了读写之外的其他参数。 

get_fattime

        获取时间。 

代码

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "key.h"  
#include "sram.h"   
#include "malloc.h" 
#include "usmart.h"  
#include "sdio_sdcard.h"    
#include "malloc.h" 
#include "w25qxx.h"    
#include "ff.h"  
#include "exfuns.h"    
int main(void)
{        
	FIL fp;
	FRESULT result;
	UINT bww;
	char buf[100];
 	u32 total,free;
	u8 t=0;	
	u8 res=0;	

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
	delay_init(168);  //初始化延时函数
	uart_init(115200);		//初始化串口波特率为115200
	LED_Init();					//初始化LED 
	usmart_dev.init(84);		//初始化USMART
 	LCD_Init();					//LCD初始化  
 	KEY_Init();					//按键初始化 
	W25QXX_Init();				//初始化W25Q128
	my_mem_init(SRAMIN);		//初始化内部内存池 
	my_mem_init(SRAMCCM);		//初始化CCM内存池
	
 	POINT_COLOR=RED;//设置字体为红色 
	LCD_ShowString(30,90,200,16,16,"Explorer STM32F4");	
	LCD_ShowString(30,110,200,16,16,"FATFS TEST");	  
	LCD_ShowString(30,130,200,16,16,"Use USMART for test");	   
 	while(SD_Init())//检测不到SD卡
	{
		LCD_ShowString(30,150,200,16,16,"SD Card Error!");
		delay_ms(500);					
		LCD_ShowString(30,150,200,16,16,"Please Check! ");
		delay_ms(500);
		LED0=!LED0;//DS0闪烁
	}
 	exfuns_init();							//为fatfs相关变量申请内存				 
  	f_mount(fs[0],"0:",1); 					//挂载SD卡 
 	res=f_mount(fs[1],"1:",1); 				//挂载FLASH.	
	if(res==0X0D)//FLASH磁盘,FAT文件系统错误,重新格式化FLASH
	{
		LCD_ShowString(30,150,200,16,16,"Flash Disk Formatting...");	//格式化FLASH
		res=f_mkfs("1:",1,4096);//格式化FLASH,1,盘符;1,不需要引导区,8个扇区为1个簇
		if(res==0)
		{
			f_setlabel((const TCHAR *)"1:ALIENTEK");	//设置Flash磁盘的名字为:ALIENTEK
			LCD_ShowString(30,150,200,16,16,"Flash Disk Format Finish");	//格式化完成
		}else LCD_ShowString(30,150,200,16,16,"Flash Disk Format Error ");	//格式化失败
		delay_ms(1000);
	}													    
	LCD_Fill(30,150,240,150+16,WHITE);		//清除显示			  
	while(exf_getfree("0",&total,&free))	//得到SD卡的总容量和剩余容量
	{
		LCD_ShowString(30,150,200,16,16,"SD Card Fatfs Error!");
		delay_ms(200);
		LCD_Fill(30,150,240,150+16,WHITE);	//清除显示			  
		delay_ms(200);
		LED0=!LED0;//DS0闪烁
	}													  			    
 	POINT_COLOR=BLUE;//设置字体为蓝色	   
	LCD_ShowString(30,150,200,16,16,"FATFS OK!");	 
	LCD_ShowString(30,170,200,16,16,"SD Total Size:     MB");	 
	LCD_ShowString(30,190,200,16,16,"SD  Free Size:     MB"); 	    
 	LCD_ShowNum(30+8*14,170,total>>10,5,16);				//显示SD卡总容量 MB
 	LCD_ShowNum(30+8*14,190,free>>10,5,16);					//显示SD卡剩余容量 MB			    
	
	result  = f_open (& fp, "0:1.txt", FA_CREATE_ALWAYS | FA_WRITE);
	
	f_write (&fp," test" , 50, & bww);
	
	f_close(&fp);
	
	result  = f_open (& fp, "0:1.txt", FA_READ);
	
	f_read (& fp, buf,100, & bww);
	
	f_close(&fp);
	
	LCD_ShowString(30,210,230,16,16,(u8 *)buf);
	while(1)
	{
		t++; 
		delay_ms(200);		 			   
		LED0=!LED0;
	} 
}





总结 

        文件系统,目前感觉用不太到,而且都是偏向工程类的,其实不能像例程写的这么简单,但用来了解一下还是可以的。

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

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

相关文章

大学科目网课搜题接口

大学科目网课搜题接口 本平台优点: 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 查题校园题库:查题校园题库后台(点…

【1024社区大奖】让你一小时内狂揽大奖[保姆级教程①]

四层挑战,一小时内拿捏!(上)一、龙蜥社区大奖二、战前准备1.注册码云Gitee2.注册龙蜥社区三、开始挑战,包揽大奖!①第一层:小龙推荐 [15分钟]②第二层随机试炼 [15分钟]一、龙蜥社区大奖 活动分…

【论文笔记】Transformer-based deep imitation learning for dual-arm robot manipulation

【论文笔记】Transformer-based deep imitation learning for dual-arm robot manipulation Abstract 问题:In a dual-arm manipulation setup, the increased number of state dimensions caused by the additional robot manipulators causes distractions and …

微信小程序入门与实战之更多电影列表与电影搜索

wx.request的更多参数详解 在网络请求中我们可以采用下面这种形式: 如果我们可以不采用直接写在url的方式我们可以采用data的方式: 默认请求方式是GET我们可以通过设置method修改请求方式: 更多电影页面 我们要实现的效果:…

应用层——HTTP协议

文章目录一、应用层1.1 应用层概念1.2 再谈协议二、网络版本的计算器网络计算器编码部分版本1:原生版本版本2:引入序列化和反序列化三、HTTP协议3.1 URL3.2 urlencode和urldecode3.3 HTTP协议格式3.3.1 请求报文3.3.2 响应报文3.4 HTTPDemo3.4.1改进3.4.…

这里不适合做技术

6点,の,下班了又是一个差不多一样的星期过去了,又是一个差不多的周末要到来了。我也差不多要离开这家公司了,入职4年多,那时候雄心壮志,决定干一番大事业,那个时候的自己,技术的炉火…

【图像融合】基于 DCT结合拉普拉斯金字塔的图像融合附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

论文理解与笔记【CVPR_2022.6】Region-Aware Face Swapping

论文理解与笔记【CVPR_2022】Region-Aware Face Swapping论文的缩写全拼:一、贡献二、介绍三、提出问题,也是论文解决的问题四、具体实现方案五、实验六、最终感想和总结论文地址:传送门或者传送门2 先看看效果: 论文的缩写全拼…

【单片机毕业设计】【mcuclub-jj-003】基于单片机的八层电梯的设计

最近设计了一个项目基于单片机的八层电梯系统,与大家分享一下: 一、基本介绍 项目名:八层电梯 项目编号:mcuclub-jj-003 单片机类型:STC89C52、STM32F103C8T6 功能简介: 1、通过3*4矩阵键盘实现电梯内部…

【Linux修炼】5.vim详解

每一个不曾起舞的日子,都是对生命的辜负。 Linux-yum&vim工具的使用本节目标1. Linux 软件包管理器 yum1.1 什么是软件包1.2 关于rzsz1.3 查看软件包1.4 如何安装软件1.5 如何卸载软件2. Linux编辑器-vim的使用(重点)2.1 什么是vim&#…

C++内存管理

1.C内存分布 学习C内存分布之前,先小试牛刀一下。 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd&quo…

webpack--》webpack底层深入讲解,从初识到精通,真正实现从0到1的过程

目录 webpack webpack的基本使用 安装 配置 修改自定义打包的入口与出口 优化js或图片的存放路径 配置webpack中符号的使用 webpack中相关插件安装 webpack-dev-server html-webpack-plugin clean-webpack-plugin webpack中的loader 打包处理css文件 打包处理les…

TPM分析笔记(十二)TPM PCR操作

目录一、PCR初始化(Initializing PCR)二、PCR的扩展(Extend of a PCR)2.1 其他PCR命令三、使用PCR Banks进行扩展(Using Extend with PCR Banks)四、事件记录(Recording Events)五、…

Java递归实现树形结构的两种方式

目录0、引言1、数据准备2、类型转化3、递归实现方法3.1、Java7及以下纯Java递归实现3.2、Java8及以上借助lamda表达式实现0、引言 在开发的过程中,很多业务场景需要一个树形结构的结果集进行前端展示,也可以理解为是一个无限父子结构,常见的…

【老师见打系列】:我只是写了一个自动回复讨论的脚本~

文章目录🌟好久不见⛳️实现过程🌴老操作了兄弟们~🐢一步拿捏讨论💖美图结束语专栏Python零基础入门篇💥Python网络蜘蛛💥Python数据分析Django基础入门宝典💥小玩意儿💥Web前端学习…

2022海德堡桂冠论坛(HLF)见闻录

今年9月下旬,我前往德国参加了第九届海德堡桂冠论坛。因疫情原因停摆两年后,海德堡桂冠论坛再次以线下形式举办,会场热闹非凡,作为计算机与数学界的社交盛宴当之无愧。 海德堡桂冠论坛(Heidelberg Laureate Forum, HLF…

IGV-GSAman |「功能基因组时代」的高效率科研工具

写在前面 今天周末,转眼10月份只剩一周。万万没想到,一个月下去,我还是花了不少时间在完善「GSAman」。至于为什么本来「两个小时」就干完的事情,可以干成「22天」?到底还是我对前面的版本,不太满意。当然…

Attack Lab

Attack Lab 从CMU官网下载完所需实验包后,内有官方文档以及.tar压缩包,使用tar -xvf targetk.tar解压后,得到如下文件 The fifiles in targetk include: README.txt: A fifile describing the contents of the directory ctarget: An execut…

web自动化测试框架

本文介绍web自动化测试框架 ●Base:用来对Selenium API进行二次封装。 对Selenium API进行二次封装的目的是简化一些复杂的操作,但是千万不要为了封装而封装。 封装好后,其他页面类可以集成basepage,调用这些方法。 from sele…

【iOS】—— 仿写知乎日报第一周总结

目录知乎日报第一周完成情况遇到的问题:1.线程问题:2.SDWebImage加载图片3.实现无限刷新界面4.点击主界面cell进入后的界面知乎日报第一周完成情况 在这周开始了仿写知乎日报的任务,在第一周里,我完成了主界面,以及滚…