加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2017-12-02 22:06:36)
标签:

stm32

spi

sd

fatfs

分类: 技术类

STM32FATFS文件系统(SPI方式)笔记

BY:T7

Date:20171202

At:YSU_B307

开发环境:

uVision  : V5.12.0.0 STM32F103V8T6

库版本  : STM32F10x_StdPeriph_Lib_V3.5.0

FATSF    :  ff13a  

工程版本:FATFS_V1 日期:20171130

硬件连接:SPI1_CS -> PA4  SPI1_CLK -> PA5  SPI1_MISO -> PA6  SPI1_MOSI -> PA7

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

 

一、FATFS文件系统

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

http://elm-chan.org/fsw/ff/00index_e.html

目前最新版本是:ff13a

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

http://s7/mw690/005xyXUizy7ggOkhNj0d6&690

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

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

 

二、STM32SD_SPI模式

1. 硬件连接:

SPI1_CS -> PA4  SPI1_CLK -> PA5  SPI1_MISO -> PA6  SPI1_MOSI -> PA7

http://s13/bmiddle/005xyXUizy7ggOCBP2s5c&690 

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

 http://s4/mw690/005xyXUizy7ggOF5F5N33&690


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


三、FATSF文件系统移植

1. 配置工程环境

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

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

http://s14/mw690/005xyXUizy7ggOJFitDbd&690

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

http://s5/mw690/005xyXUizy7ggOQeV3634&690

4) Target OptionsC++编译器选项中添加文件包含路径,如下图

http://s14/mw690/005xyXUizy7ggOVLyGNbd&690

 

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

(一)在diskio.c中添加函数代码

1. DSTATUS disk_status (BYTE pdrv); 添加完成后如下图

http://s14/mw690/005xyXUizy7ggOYBypL1d&690

2. DSTATUS disk_initialize (BYTE pdrv);  添加完成后如下图

http://s10/mw690/005xyXUizy7ggPbwgT7e9&690

3. DRESULT disk_read (BYTE pdrv, BYTE* buff, DWORD sector, UINT count);

http://s10/mw690/005xyXUizy7ggPu44Z339&690

4. DRESULT disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, UINT count);

(新浪博客图片太麻烦,下拉到百度云链接,下载看全文有图片的。)

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

5. DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff);

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

6. DWORD get_fattime (void);

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

 

注意:在diskio.c DEV_MMC的宏定义要为0,如下图

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

 

(二)打开Ffconf.h函数

1. 改变FF_CODE_PAGE的值如下

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

2. 改变FF_USE_LFN的值如下

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

 

五、Main主函数

Main.c函数如下代码:

 

#include "main.h"

 

#define ONE_BLOCK       512

#define TWO_BLOCK      1024

 

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

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

 

FRESULT res; //读写文件的返回值

 

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

 

UINT br,bw; //Fil R/W count

BYTE FileRxBuffer[ONE_BLOCK]; //FILE COPY BUFFER

//BYTE TxFileBuffer[] = "This is the FATFS System!\r\n";

BYTE TxFileBuffer[] = "中文文件系统实验!\r\n";

 

static const char * FR_Table[]=

{

    "FR_OK:成功",                                      

    "FR_DISK_ERR:底层硬件错误",                      

    "FR_INT_ERR:断言失败",                              

    "FR_NOT_READY:物理驱动没有工作",                  

    "FR_NO_FILE:文件不存在",                          

    "FR_NO_PATH:路径不存在",                          

    "FR_INVALID_NAME:无效文件名",                      

    "FR_DENIED:由于禁止访问或者目录已满访问被拒绝",  

    "FR_EXIST:由于访问被禁止访问被拒绝",              

    "FR_INVALID_OBJECT:文件或者目录对象无效",          

    "FR_WRITE_PROTECTED:物理驱动被写保护",              

    "FR_INVALID_DRIVE:逻辑驱动号无效",                  

    "FR_NOT_ENABLED:卷中无工作区",                      

    "FR_NO_FILESYSTEM:没有有效的FAT",              

    "FR_MKFS_ABORTED:由于参数错误f_mkfs()被终止",             

    "FR_TIMEOUT:在规定的时间内无法获得访问卷的许可",         

    "FR_LOCKED:由于文件共享策略操作被拒绝",                 

    "FR_NOT_ENOUGH_CORE:无法分配长文件名工作区",             

    "FR_TOO_MANY_OPEN_FILES:当前打开的文件数大于_FS_SHARE",

    "FR_INVALID_PARAMETER:参数无效"                         

};

 

int main(void)

{

int i = 0;

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

 

 

LED_Init();

USARTx_Init();

 

 

 

 

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]);

   }

 

 

res = f_open( &FileSystemDst , "0:/Demo1.TXT", FA_CREATE_NEW | FA_WRITE);

 

if( res == FR_OK )

{

printf("File  Open SUCCESS! \n\t");

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

if(res)

printf("File  Write ERROR! \n\t");

else

printf("File Write SUCCESS! \n\t");

f_close(&FileSystemDst);

}

else if(res == FR_EXIST)

{

printf("File is already exist \n");

}

else

printf("Don't know the error! \r\n");

 

 

 

res = f_open( &FileSystemDst, "0:/Demo1.TXT", FA_OPEN_EXISTING | FA_READ);

if(res)

printf("File Open ERROR! \n\t");

else

printf("File Open SUCCESS! \n\t");

 

br = 1;

 

for(;;)

{

for(i = 0; i <  ONE_BLOCK; i++)

FileRxBuffer[i] = 0;

 

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

if(res)

printf("File Read ERROR! \n\t");

else

printf("File Read SUCCESS! \n\t");

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

 

if(res || br == 0)

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

}

 

 

 

f_close(&FileSystemDst);

 

 

while(1)

  { }

 

}

 

 

 

 

 

六、下载及实验现象

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

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

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

 

2. SD

使用读卡器,读取SD卡:

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

 

 

百度云链接:

链接:https://pan.baidu.com/s/1hrSeFkw 密码:4hkc

 

 

 

 

 

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有