首先,第一次在CSDN上面开通博客,这也算是我的第一篇博文吧,写的不好的地方还请大家不吝赐教,笔者现大二在校学生,之所以会选择在这里使用博客,是在一位嵌入式大虾的渲染下,和小伙伴一起分享学习的话,我相信可以学的更多。
废话不多说,进入主题。
首先,FATFS 是一个完全免费开源的 FAT 文件系统模块,专门为小型的嵌入式系统而设计的,使用标准的C语言编写,具有很强的独立性,可以轻松的移植到8位,16位,及其我正在用的32位ARM系列的STM32上面。即FATFS是可裁剪的文件系统。这点,尤为重要。
FATFS模块的层次结构图如下,这里,参考了部分正点原子的资料,感谢原子大大
其中底层接口,包括存储媒介读/写接口(disk I/O)和供给文件创建修改时间的实时时钟,需要我们根据平台和存储介质编写移植代码。
而中间层FATFS模块,实现了FAT 文件读/写协议。FATFS模块提供的是ff.c和ff.h。除非有必要,使用者一般不用修改,使用时将头文件直接包含进去即可。
最顶层是应用层,使用者无需理会FATFS复杂的FAT 协议和内部结构,只需要调用FATFS模块提供给用户的一系列应用API接口函数。
那么,下面就来介绍下 我对FATFS文件系统的常用API接口函数的一些理解。(以下是我直接在WPS里面写好的,故直接cp过来了,往理解)
/* FRESULT f_open函数mode全部打开方式说明
---------------------------------------------------------------------------------
FA_READ | 读模式,( 读写模式可同时生效)
FA_WRITE | 写模式,( 读写模式可同时生效)
FA_OPEN_EXISTING | 默认打开方式
FA_OPEN_ALWAYS | 打开文件,如果文件不存在,则创建一个新文件;
| 用此种方式,可以用 f_lseek 在文件后追加数据
|
FA_CREATE_NEW | 新建文件,如果文件已存在,则新建失败
FA_CREATE_ALWAYS | 新建文件,如果文件已存在,覆盖旧文件
|
---------------------------------------------------------------------------------
*/
/*---------------------------------------------------------------------------------
/①以下测试 f_write 通过程序写入数据 即通过程序新建txt文档且有数据
res=f_open (&fil,"0:/写入.txt", FA_CREATE_ALWAYS|FA_WRITE); //新建文件和写操作
f_write (&fil, "This is a new file, the data is just written in!", 48, &bww);//前提是以写文件的形式打开文件
f_close(&fil);//关闭文件,必须和 f_open 函数成对出现,同下
res=f_open (&fil,"0:/写入.txt", FA_READ);
f_read (&fil, buf,48,&bww);
f_close(&fil);//不论打开还是新建文件啊,一定记得关闭
LCD_ShowString(10,210,280,24,24,(u8 *)buf);//
①以下测试通过程序写入数据 即通过程序新建txt文档且有数据
--------------------------------------------------------------------------------- */
/*---------------------------------------------------------------------------------
②以下测试FRESULT f_lseek()移动文件指针,此函数在对已打开的文件进行读或写时,可以移动当前指针位置 即可以加入或者减去某些不需要的数据
res=f_open (&fil,"0:/写入.txt", FA_WRITE);
res = f_lseek (&fil , 25); ////指针指向第 25 个字节
res = f_write (&fil , "40" ,2 , &bw);//2为表示写入数据为2字节
// res = f_lseek (&fil , fil.fptr + 10); ////指针向前移动 10 个字节
res = f_lseek (&fil , 28); ////指针指向第 28个字节
res = f_write (&fil , "forward" ,8 , &bw);
// res = f_lseek (&fil , fil.fptr - 20); ////指针向后移动 20 个字节
res = f_lseek (&fil , 37); ////指针指向第 37 个字节
res = f_write (&fil , "backward" , 9, &bw);//写入数据为9字节
res = f_lseek (&fil , fil.fsize); ////指针指向文件末尾
res = f_write (&fil , "end" ,3 , &bw);
res = f_close ( &fil );
--------------------------------------------------------------------------------- */
/*---------------------------------------------------------------------------------
③以下测试FRESULT f_truncate()截断文件,此函数可以在将文件在当前指针处截断,也可以延长文件长度
res = f_open (&fil ,"0:/写入.txt", FA_WRITE);//打开文件和写操作
res = f_lseek (&fil , 60); ////指针指向第 60 个字节
res = f_truncate (&fil ); ////将文件在此截断,在60字节以后的数据都会消失,即截断文件
res = f_sync ( &fil ); ////关闭文件
-------------------------------------------------------------------------------- */
/*---------------------------------------------------------------------------------
④刷新缓存信息FRESULT f_sync (FIL* FileObject )函数,* FileObject==指向文件对象结构体的指针
例如:res=f_sync(&fil);
函数说明:此函数功能兼容f_close,它与f_close的区别就是在执行后,当前文件是否有效.
调用该函数后,当前文件仍然可读可写可查询.
使用方法:当文件长期处于写模式,如数据记录时,定期调用此函数,或者在写入数据后立即调用
此函数,可以减少因为断电等意外情况带来的数据损失,有点WORD中后台定期保存的意思.
--------------------------------------------------------------------------------- */
/*---------------------------------------------------------------------------------
⑤新建文件夹FRESULT f_mkdir (const TCHAR* DirName)函数,*DirName==指向将要创建的文件夹名的指针
函数说明:新建一个文件夹,
注意:文件名应符合 fatfs 标准,不能包含非法字符,
文件名长度不能大于8,否则新建不成功
例:f_mkdir("new");//新建一个文件名为new的文件夹
--------------------------------------------------------- */
/*---------------------------------------------------------------------------------
⑥删除文件和文件夹FRESULT f_unlink()函数,*FileName : 指向文件或文件夹的名称的指针
函数说明:此函数可以删除一个文件或者文件夹
使用注意项:
删除文件夹时:1.不能为当前文件夹
2.不能为非空文件夹
删除文件时: 1.不能为已打开文件
2.不能为只读文件
例如:f_unlink("new");//删除“new”这个文件夹
f_unlink("TEXT/写入.txt");//删除“TEXT”这个文件夹下的“写入”txt文本
删除文件的时候必须注意一点 此外的所有尾巴都必须是以png txt结束的
--------------------------------------------------------- */
/*---------------------------------------------------------------------------------
⑦重命名\移动文件或文件夹FRESULT f_rename (const TCHAR* OldName,const TCHAR* NewName)
函数说明:此函数可以移动或者重命名一个文件或者文件夹
参数说明:*OldName : 指向旧文件名的指针
*NewName : 指向新文件名的指针
使用注意项:
1.此函数可以重命名 文件或者文件夹,而不论文件夹是否为空.
2.此函数可以移动 文件或者文件夹,而不论文件夹是否为空.
例如: res = f_rename("测试.txt","测试1.txt"); //重命名测试.txt文件,
res = f_rename("测试1.txt","PAINT/测试2.txt");
//将测试1.txt文件移动到文件夹PAINT中并重命名为测试2.txt
--------------------------------------------------------- */
/*---------------------------------------------------------------------------------
⑧获取文件信息 FRESULT f_stat(const TCHAR* FileName,FILINFO* FileInfo)
函数说明:此函数可以获取文件的最近修改时间,属性等信息,获取的信息存储在fileninfo结构体中
参数说明:*FileName: 指向文件名的指针
*FileInfo: 指向保存文件信息的结构体的指针 类型必须为FileInfo
使用注意项:
1.如果目标是文件夹,获取的大小为0.
2.此函数对根目录无效.
3.时间和日期均为两字节,存储格式如下:
a) 日期:
i. bit15…bit9: 年 计算后的十进制数应该加上1980
ii. bit8 … bit5: 月
iii. bit4 … bit0: 日
b) 时间:
i. bit15… bit11 : 时
ii. bit10… bit5 : 分
iii. bit4 … bit0 : 秒 算出的十进制数应 *2
举例:
i. 日期: 0000001 0001 00001, 表示 1981 年 1 月 1 日
ii.时间: 00001 000001 00001,表示 1 点 1 分 2 秒
举例: res = f_stat("TEXT/写入.txt", &filinfo); //读取 folder 目录下 newname.txt 文件的信息
if( res )
printf("newname.txt err : %d\r\n", res);//没读取文件信息成功
else
{
printf("newname.txt size : %lu\r\n",filinfo.fsize);//读取文件的长度,即占多少字节
printf("fdate : %d\r\n",filinfo.fdate); //读取文件的最近修改日期 转化为2进制,
printf("ftime : %d\r\n",filinfo.ftime);//读取文件的最近修改时间,转化为2进制
printf("fattrib : %d\r\n",filinfo.fattrib);//显示文件的属性,即什么文件
//#define AM_RDO 0x01 //只读文件
//#define AM_HID 0x02 //隐藏文件
//#define AM_SYS 0x04 //系统文件
//#define AM_VOL 0x08 //卷标文件
//#define AM_LFN 0x0F //
//#define AM_DIR 0x10 //程序目录
//#define AM_ARC 0x20 //存档文件
//#define AM_MASK 0x3F //
}
--------------------------------------------------------- */
/*---------------------------------------------------------------------------------
⑨改变文件属性:FRESULT f_chmod (const TCHAR* FileName,BYTE Attribute,BYTE AttributeMask)
函数说明:
1. 此函数可以修改文件或文件夹的属性
2. 可修改的属性只能是以下一种或几种的组合,对其它属性无效
AM_RDO //只读文件
AM_ARC //存档文件
AM_SYS //系统文件
AM_HID //隐藏文件
参数说明:
a) *Filename:指向文件或文件夹的名称的指针
b) Attribute:要置位的属性,即需要将文件或者文件夹属性改成什么
c) AttributeMask:需要改变的属性(包括要置位的和要清除的属性),即包含原属性和需要更改的属性
使用方法:
a) Attribute 须为 AttributeMask 的子集
b) 函数对 AttributeMask 中的属性集合进行处理,若属性包含在 Attribute中,则置位,否则清除
举例: 对文件 TEXT/写入.txt,置位 HID 和 SYS 属性,取消 ARC和 RDO 属性
res = f_chmod("TEXT/写入.txt", AM_HID | AM_SYS, AM_ARC | AM_RDO | AM_HID |AM_SYS);
if( res )
printf("err :%d\r\n", res);
else
{
res = f_stat("TEXT/写入.txt", &filinfo);
printf("fattrib : %d\r\n",filinfo.fattrib);//
}
--------------------------------------------------------- */
/*---------------------------------------------------------------------------------
⑩改变文件时间戳FRESULT f_utime (TCHAR* FileName,FILINFO* TimeDate)
函数说明:
1. 此函数可以更改文件的最近修改时间
参数说明:
a) Filename :指向文件的指针
b) Timedate :指向文件信息结构体的指针
使用方法: 在这个函数里,可以我们可以写入常规的日期时间,然后此函数按日期存储格式(见上)将数据整合后调用 f_utime.
FRESULT set_timestamp ( char *obj,int year, int month, int mday, int hour, int min, int sec);//
{
FILINFO fno;
fno.fdate = (WORD)(((year - 1980) * 512U) | month * 32U | mday);
fno.ftime = (WORD)(hour * 2048U | min * 32U | sec / 2U);
return f_utime(obj, &fno);
res = set_timestamp("123.txt",2001,06,05,02,03,34);//修改 123.txt 时间
printf("%d\r\n",res);
此例没有通过,没有找到FRESULT set_timestamp();这个函数原型 。
---------------------------------------------------------
好了,以上就是我对于FATFS文件系统常用API函数的一些理解,希望可以帮到一些朋友快速了解
上一篇:基于STM32的SD卡FATFS文件系统学习笔记
下一篇:STM32CubeMX基于SD卡的FATFS文件系统测试
推荐阅读
史海拾趣
为了更好地适应全球市场的变化,海曼电子不断深化其国际化战略。公司在全球范围内建立了完善的研发、生产和销售网络,确保能够快速响应客户需求。同时,公司还加大了对海外市场的投入,通过本地化运营和定制化服务,赢得了更多海外客户的信赖和支持。此外,海曼电子还积极参与国际标准的制定和推广工作,提升了公司在全球电子行业的影响力。
随着国内市场的饱和,Engelking Elektronik开始寻求海外市场的发展。公司制定了详细的国际化战略,包括参加国际电子展会、拓展海外销售渠道以及建立海外生产基地等。通过不断努力,Engelking Elektronik成功进入了欧洲、北美和亚洲等多个国家和地区的市场。同时,公司还积极适应不同地区的文化和市场需求,提供定制化的产品和服务。
Easy Braid的发展离不开一支强大的研发团队。公司注重人才的引进和培养,为研发团队提供了良好的工作环境和充足的研发资金。在研发团队的努力下,Easy Braid不断推出具有创新性和实用性的新产品,满足了市场的多样化需求。同时,研发团队还积极参与行业标准的制定和推广工作,为整个电子行业的发展做出了贡献。
在电子行业中,技术创新是企业发展的核心驱动力。Cogent_Computer_Systems公司深知这一点,因此始终坚持将大量资金投入研发领域。公司建立了一支高素质的研发团队,并配备了先进的研发设备。通过持续不断的研发投入,公司成功推出了一系列具有创新性的产品,满足了市场不断变化的需求。这种以研发驱动的发展模式使得公司在激烈的市场竞争中始终保持领先地位。
H&D Wireless公司成立于2009年,总部位于瑞典斯德哥尔摩。成立初期,公司专注于物联网技术的研发,致力于提供智能家居Wi-Fi组件和无线多媒体解决方案。2016年,H&D Wireless宣布获得了一笔300万美元的风险投资,投资方包括Blasieholmen Investment Group及旗下网络内的40名瑞典和欧洲企业家与私人投资家。这笔资金为公司后续的全球业务扩张和物联网云服务平台的发布奠定了坚实基础。
为了进一步扩大市场份额和提升竞争力,Axon' Cable公司开始实施全球化战略。公司在全球范围内设立了多个生产基地和研发中心,积极开拓国际市场。同时,Axon' Cable还加强了与国际知名企业的合作,共同推动技术创新和产业升级。这些举措使得Axon' Cable的产品在全球范围内得到了广泛应用,公司的国际影响力也逐步提升。
如题,谁知道做这两件事要哪些专业的工具??谁有介绍下或者发点资料下载下。谢谢,路过的大侠快来帮忙呀 如题,如果要负责公司交换机PC等维护,需要些什么工具了,本人之前没有做过,现在有可能转行了!所以请教各位大侠!!谢谢!! [ 本帖最后 ...… 查看全部问答∨ |
|
国内汽车动力电池市场规模可达到100亿元,相当于目前锂电池市场规模增长2倍多,全球动力电池市场规模可能达到490多亿。 CMIC(中国市场情报中心)最新发布:新能源汽车已成为世界各大汽车公司21世纪初激烈竞争的焦点,动力技术革命将彻底改变2l世 ...… 查看全部问答∨ |
|
程序结构: 界面主线程,两个工作线程。两个工作线程都是有板卡连电机的。 运行条件: 当电机开启后,主画面有一个区域,是STAITC的,显示当前的一些运行信息。 采用定时刷新的方式。 问题: 假设3秒刷一次,似乎在每次刷新的时候都会感觉电 ...… 查看全部问答∨ |
高手好: 我现在做的是64M nor flash驱动 ,hzdysymbol给我提供了一份64M的NorFlash驱动代码,现在有些疑问请教各位 关于nor flash在boot中的操作: 1、请问在EBOOT中对Nor FLASH进行擦除和写入操作,是否需要定义nor F ...… 查看全部问答∨ |
我用的是WINCE5.0的设备,PC机上有俩个USB口,现在一个USB口可以正常同步连接,但是换到PC机的另外一个USB口上怎么也连不上,重新装USB驱动都不行,不知道大家的是不是都这样?… 查看全部问答∨ |