STM32之FATFS文件系统SPI方式笔记.docx

上传人:b****3 文档编号:4850705 上传时间:2022-12-10 格式:DOCX 页数:13 大小:452.78KB
下载 相关 举报
STM32之FATFS文件系统SPI方式笔记.docx_第1页
第1页 / 共13页
STM32之FATFS文件系统SPI方式笔记.docx_第2页
第2页 / 共13页
STM32之FATFS文件系统SPI方式笔记.docx_第3页
第3页 / 共13页
STM32之FATFS文件系统SPI方式笔记.docx_第4页
第4页 / 共13页
STM32之FATFS文件系统SPI方式笔记.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

STM32之FATFS文件系统SPI方式笔记.docx

《STM32之FATFS文件系统SPI方式笔记.docx》由会员分享,可在线阅读,更多相关《STM32之FATFS文件系统SPI方式笔记.docx(13页珍藏版)》请在冰豆网上搜索。

STM32之FATFS文件系统SPI方式笔记.docx

STM32之FATFS文件系统SPI方式笔记

STM32之FATFS文件系统(SPI方式)笔记

BY:

T7

Date:

20171202

At:

YSU_B307

开发环境:

uVision:

V5.12.0.0STM32F103V8T6

库版本:

STM32F10x_StdPeriph_Lib_V3.5.0

FATSF:

ff13a

工程版本:

FATFS_V1日期:

20171130

硬件连接:

SPI1_CS->PA4SPI1_CLK->PA5SPI1_MISO->PA6SPI1_MOSI->PA7

工程功能:

建立在SPI_SD的基础上,完成文件系统的初步接触。

一、FATFS文件系统

1.使用开源的FAT文件系统模块,其源代码的获取从官网:

目前最新版本是:

ff13a

2.解压后得到两个文件:

其中,documents相当于STM32的固件库使用手册,介绍FATFS系统的函数使用方法,source中则是需要用到的源代码。

因为FATFS使用SD卡,所以FATFS的基础是SD卡的正常读写,这里采用SPI模式。

二、STM32之SD卡_SPI模式

1.硬件连接:

SPI1_CS->PA4SPI1_CLK->PA5SPI1_MISO->PA6SPI1_MOSI->PA7

2.SPI模式下STM32读写SD卡的工程结构

在确定STM32使用SPI模式读写SD卡没有问题后,进入FATSF文件系统的实验,另源代码在文档最后。

三、FATSF文件系统移植

1.配置工程环境

1)STM32读写SD卡-SPI模式成功

2)将解压后的ff13a整个文件夹赋值到工程目录下,如图:

3)返回到MDK界面下,添加ff13a项目组,并把ff13a\source\目录下ff.c,diskio.c,ffunicode.c,ffsystem.c添加到项目组中,如下列图:

4)在TargetOptions的C++编译器选项中添加文件包含路径,如下列图

四、为FATSF文件系统添加底层驱动

〔一〕在diskio.c中添加函数代码

1.DSTATUSdisk_status(BYTEpdrv);添加完成后如下列图

2.DSTATUSdisk_initialize(BYTEpdrv);添加完成后如下列图

3.DRESULTdisk_read(BYTEpdrv,BYTE*buff,DWORDsector,UINTcount);

4.DRESULTdisk_write(BYTEpdrv,constBYTE*buff,DWORDsector,UINTcount);

5.DRESULTdisk_ioctl(BYTEpdrv,BYTEcmd,void*buff);

6.DWORDget_fattime(void);

注意:

在diskio.c中DEV_MMC的宏定义要为0,如下列图

(二)打开Ffconf.h函数

1.改变FF_CODE_PAGE的值如下

2.改变FF_USE_LFN的值如下

五、Main主函数

Main.c函数如下代码:

#include"main.h"

#defineONE_BLOCK512

#defineTWO_BLOCK1024

uint8_tsd_RxBuf[TWO_BLOCK];//SD卡数据j接收缓存区

uint8_tsd_TxBuf[TWO_BLOCK]={0};//SD卡数据j接收缓存区

FRESULTres;//读写文件的返回值

FILFileSyatemSrc,FileSystemDst;//文件系统结构体,包含文件指针等成员

UINTbr,bw;//FilR/Wcount

BYTEFileRxBuffer[ONE_BLOCK];//FILECOPYBUFFER

//BYTETxFileBuffer[]="ThisistheFATFSSystem!

\r\n";

BYTETxFileBuffer[]="中文文件系统实验!

\r\n";

staticconstchar*FR_Table[]=

{

"FR_OK:

成功",/*(0)Succeeded*/

"FR_DISK_ERR:

底层硬件错误",/*

(1)AharderroroccurredinthelowleveldiskI/Olayer*/

"FR_INT_ERR:

断言失败",/*

(2)Assertionfailed*/

"FR_NOT_READY:

物理驱动没有工作",/*(3)Thephysicaldrivecannotwork*/

"FR_NO_FILE:

文件不存在",/*(4)Couldnotfindthefile*/

"FR_NO_PATH:

路径不存在",/*(5)Couldnotfindthepath*/

"FR_INVALID_NAME:

无效文件名",/*(6)Thepathnameformatisinvalid*/

"FR_DENIED:

由于禁止访问或者目录已满访问被拒绝",/*(7)Accessdeniedduetoprohibitedaccessordirectoryfull*/

"FR_EXIST:

由于访问被禁止访问被拒绝",/*(8)Accessdeniedduetoprohibitedaccess*/

"FR_INVALID_OBJECT:

文件或者目录对象无效",/*(9)Thefile/directoryobjectisinvalid*/

"FR_WRITE_PROTECTED:

物理驱动被写保护",/*(10)Thephysicaldriveiswriteprotected*/

"FR_INVALID_DRIVE:

逻辑驱动号无效",/*(11)Thelogicaldrivenumberisinvalid*/

"FR_NOT_ENABLED:

卷中无工作区",/*(12)Thevolumehasnoworkarea*/

"FR_NO_FILESYSTEM:

没有有效的FAT卷",/*(13)ThereisnovalidFATvolume*/

"FR_MKFS_ABORTED:

由于参数错误f_mkfs()被终止",/*(14)Thef_mkfs()abortedduetoanyparametererror*/

"FR_TIMEOUT:

在规定的时间内无法获得访问卷的许可",/*(15)Couldnotgetagranttoaccessthevolumewithindefinedperiod*/

"FR_LOCKED:

由于文件共享策略操作被拒绝",/*(16)Theoperationisrejectedaccordingtothefilesharingpolicy*/

"FR_NOT_ENOUGH_CORE:

无法分配长文件名工作区",/*(17)LFNworkingbuffercouldnotbeallocated*/

"FR_TOO_MANY_OPEN_FILES:

当前打开的文件数大于_FS_SHARE",/*(18)Numberofopenfiles>_FS_SHARE*/

"FR_INVALID_PARAMETER:

参数无效"/*(19)Givenparameterisinvalid*/

};

intmain(void)

{

inti=0;

FATFSfs;//记录文件系统盘符信息的结构体

 

LED_Init();

USARTx_Init();

 

/*调用f_mount()创建一个工作区,另一个功能是调用了底层的disk_initialize()函数,进行SDIO借口的初始化*/

res=f_mount(&fs,"0:

",1);

if(res!

=FR_OK)

{

printf("挂载文件系统失败(%s)\r\n",FR_Table[res]);

}

else

{

printf("挂载文件系统成功(%s)\r\n",FR_Table[res]);

}

/*调用f_open()函数在刚刚开辟的工作区的盘符0下打开一个名为Demo.TXT的文件

,以创建新文件或写入的方式打开(参数"FA_CREATE_NEW|FA_WRITE"),如果不存在的话则创建

这个文件。

同意见Demo.TXT这个文件关联到FileSyatemSrc这个结构指针,以后操作文件就是听过

这个结构指针来完成,可以理解为文件指针。

*/

res=f_open(&FileSystemDst,"0:

/Demo1.TXT",FA_CREATE_NEW|FA_WRITE);

/*对f_open()函数的返回值进行检查*/

if(res==FR_OK)

{

printf("FileOpenSUCCESS!

\n\t");

/*

将缓冲区的数据写到文件中,创建文件成功,调用f_write()将缓冲区的数组变量

TxFileBuffer的内容写到刚刚打开的Demo.TXT文件中,写完之后必须调用f_close()函数关闭

已经打开的文件,否则前面写入的数据无效,甚至可能导致其他错误

*/

res=f_write(&FileSystemDst,TxFileBuffer,sizeof(TxFileBuffer),&bw);

if(res)

printf("FileWriteERROR!

\n\t");

else

printf("FileWriteSUCCESS!

\n\t");

/*关闭文件*/

f_close(&FileSystemDst);

}

elseif(res==FR_EXIST)

{

printf("Fileisalreadyexist\n");

}

else

printf("Don'tknowtheerror!

\r\n");

/*-----------将刚刚新建的文件里面的内容打印到串口----------------*/

/*以只读的方式打开刚刚创建的文件*/

res=f_open(&FileSystemDst,"0:

/Demo1.TXT",FA_OPEN_EXISTING|FA_READ);

if(res)

printf("FileOpenERROR!

\n\t");

else

printf("FileOpenSUCCESS!

\n\t");

/*打开文件*/

br=1;

for(;;)

{

/*清缓冲区*/

for(i=0;i

FileRxBuffer[i]=0;

/*

将文件里面的内容读到缓冲区,调用函数f_read()将文件的内容读到

缓冲区FileRxBuffer数组变量中,然后打印到串口

*/

res=f_read(&FileSystemDst,FileRxBuffer,sizeof(FileRxBuffer),&br);

if(res)

printf("FileReadERROR!

\n\t");

else

printf("FileReadSUCCESS!

\n\t");

printf("\r\n%s",FileRxBuffer);

if(res||br==0)

break;//错误或者到了文件尾

}

 

/*

关闭打开的文件

当被打开的文件操作完成之后都要调用f_close()将它关闭,

如同一块动态分配的内存在用完之后都要调用free()来将它释放

*/

f_close(&FileSystemDst);

while

(1)

{}

}

/**

*@}

*/

 

/*********

**********(C)COPYRIGHT2017TIMEANDSPACE7*****ENDOFFILE****/

六、下载及实验现象

编译无误后下载,下载会很慢。

1.串口现象“首行的乱码是字符编码的问题,在这里不做解决”

2.SD卡

使用读卡器,读取SD卡:

XX云链接:

链接:

s:

//pan.baidu/s/1hrSeFkw密码:

4hkc

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 其它模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1