STM32之FATFS文件系统SPI方式笔记.docx
- 文档编号:4850705
- 上传时间:2022-12-10
- 格式:DOCX
- 页数:13
- 大小:452.78KB
STM32之FATFS文件系统SPI方式笔记.docx
《STM32之FATFS文件系统SPI方式笔记.docx》由会员分享,可在线阅读,更多相关《STM32之FATFS文件系统SPI方式笔记.docx(13页珍藏版)》请在冰豆网上搜索。
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文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- STM32 FATFS 文件系统 SPI 方式 笔记