STM32F103_SD卡FatFs文件系统移植

2019-08-22来源: eefocus关键字:STM32F103  SD卡  FatFs文件  系统移植

一、下载解压官方源码压缩包

1 添加下列文件至项目列表并包含头文件。

二、配置函数接口

主要有以下几个文件 : diskio.c       ffconf.h


1  官方源码已经有写好的代码框架,只需要添加ATA(指SD卡)部分即可


(1) 获取设备状态部分,由于SD卡起始状态特别多,此处默认检测到SD卡设备。


    case ATA :

        //默认设备检测成功

        status &= ~STA_NOINIT;

    

        break;


(2) 设备初始化部分,调用sdio.c中的初始化函数即可。


    case ATA :

            if(SD_Init()==SD_OK)

            {

                status &= ~STA_NOINIT;

            }

            else 

            {

                status = STA_NOINIT;

            }

        

            break;


(3) 读扇区部分,由于SD卡读写时采用DMA,必须4字节对齐,当读缓冲区地址不是4字对齐时,必须特殊处理,先用disk_read()将数据读取至双字对齐的自定义数组中,然后利用memcpy()将数组的值复制至读数据缓冲区。当读缓冲区地址是4字对齐时,直接调用SD_ReadMultiBlocks() 读取即可。


    case ATA :

          if((DWORD)buff&3)

            {

                DRESULT res = RES_OK;

                DWORD scratch[SD_BLOCKSIZE / 4];


                while (count--) 

                {

                    res = disk_read(ATA,(BYTE *)scratch, sector++, 1);


                    if (res != RES_OK) 

                    {

                        break;

                    }

                    memcpy(buff, scratch, SD_BLOCKSIZE);

                    buff += SD_BLOCKSIZE;

            }

            status = res;

            }

            else

            {

                SD_state=SD_ReadMultiBlocks(buff,(uint64_t)sector*SD_BLOCKSIZE,SD_BLOCKSIZE,count);

                if(SD_state==SD_OK)

                {

                    /* Check if the Transfer is finished */

                    SD_state=SD_WaitReadOperation();

                    while(SD_GetStatus() != SD_TRANSFER_OK);

                }

                if(SD_state!=SD_OK)

                    status = RES_PARERR;

                else

                    status = RES_OK;    

            }


            break; 


(4)写扇区部分,原理同读。


    case ATA :

                if((DWORD)buff&3)

                {

                    DRESULT res = RES_OK;

                    DWORD scratch[SD_BLOCKSIZE / 4];


                    while (count--) 

                    {

                        memcpy( scratch,buff,SD_BLOCKSIZE);

                        res = disk_write(ATA,(BYTE *)scratch, sector++, 1);

                        if (res != RES_OK) 

                        {

                            break;

                        }                    

                        buff += SD_BLOCKSIZE;

                    }

                    status = res;

                    }        

                else

                {

                    SD_state=SD_WriteMultiBlocks((uint8_t *)buff,(uint64_t)sector*SD_BLOCKSIZE,SD_BLOCKSIZE,count);

                    if(SD_state==SD_OK)

                    {

                        /* Check if the Transfer is finished */

                        SD_state=SD_WaitWriteOperation();


                        /* Wait until end of DMA transfer */

                        while(SD_GetStatus() != SD_TRANSFER_OK);            

                    }

                    if(SD_state!=SD_OK)

                        status = RES_PARERR;

                    else

                        status = RES_OK;    

                }

                

                break;

(5)杂项参数配置。


    case ATA :

            switch (cmd) 

            {

                // Get R/W sector size (WORD) 

                case GET_SECTOR_SIZE :    

                    *(WORD * )buff = SD_BLOCKSIZE;

                break;

                // Get erase block size in unit of sector (DWORD)

                case GET_BLOCK_SIZE :      

                    *(DWORD * )buff = 1;

                break;


                case GET_SECTOR_COUNT:

                    *(DWORD * )buff = SDCardInfo.CardCapacity/SDCardInfo.CardBlockSize;

                    break;

                case CTRL_SYNC :

                break;

            }

            status = RES_OK;

            break;

至此diskio.c移植完成


三、ffconfig.h

需要修改的参数如下:


  //准许使用文件字符串函数: f_gets(), f_putc(), f_puts() and/  f_printf()


#define    _USE_STRFUNC    1    


//支持格式化函数f_mkfs()


#define    _USE_MKFS        1


//支持使用长文件名


#define    _USE_LFN    2

#define    _MAX_LFN    255


//使用UTF-8编码

#define _STRF_ENCODE    3


//设备数目

#define _VOLUMES    1


//支持最小最大扇区字节数


#define    _MIN_SS        512

#define    _MAX_SS        4096


//文件时间配置


#define _FS_NORTC    0

#define _NORTC_MON    1

#define _NORTC_MDAY    1

#define _NORTC_YEAR    2015


四、支持长文件名时需添加国标码字库文件

五、读写测试,函数参考官方提供的函数,如下:

关键字:STM32F103  SD卡  FatFs文件  系统移植

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic472093.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32F103_通用定时器“输入捕获”测量输入脉冲宽度
下一篇:STM32 PWM之实现呼吸灯

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32中stm32f0xx_flash.icf文件的作用详解!

 添加额外的region   比如我要添加另一个名为ROM2的ROM区域,大小是256bytes,起始地址是0x80000.       define region ROM = Mem:[from 0x80000 size 0x100];2.2 教你怎样放置SECTION如果你要把你的只读常量放置在你指定的域而不是编译器默认的位置,你就得按如下操作了:define region CONST_region = Mem:[from 0x100 size 0x100];place in
发表于 2019-09-21
STM32中stm32f0xx_flash.icf文件的作用详解!

基于stm32f103zet6的DS1302学习

由于硬件出了问题,也就是外部低速晶振没用,震不起来,然后查看了网上的帖子,STM32的RTC果然口碑不怎么样,所以果断换DS1302,在移植的过程中还算顺利,记录下来吧,也算对自己的总结吧!1、所谓的DS1302这里面也指明了简单的SPI协议然后就直接上代码了,注释很详细的!基本实现单行注释1、主函数main#include "stm32f10x.h"      #include "SysTick.h"  #include "Delay.h"  
发表于 2019-09-21
基于stm32f103zet6的DS1302学习

第51章 设置FLASH的读写保护及解除—零死角玩转STM32-F429系列

本章参考资料:《STM32F4xx 中文参考手册》、《STM32F4xx规格书》、库说明文档《stm32f4xx_dsp_stdperiph_lib_um.chm》以及《Proprietary code read-out protection on microcontrollers》。51.1 选项字节与读写保护在实际发布的产品中,在STM32芯片的内部FLASH存储了控制程序,如果不作任何保护措施的话,可以使用下载器直接把内部FLASH的内容读取回来,得到bin或hex文件格式的代码拷贝,别有用心的厂商即可利用该代码文件山寨产品。为此,STM32芯片提供了多种方式保护内部FLASH的程序不被非法读取,但在默认情况下该保护功能
发表于 2019-09-20
第51章 设置FLASH的读写保护及解除—零死角玩转STM32-F429系列

第45章 DCMI—OV2640摄像头—零死角玩转STM32-F429系列

本章参考资料:《STM32F4xx参考手册》、《STM32F4xx规格书》、库帮助文档《stm32f4xx_dsp_stdperiph_lib_um.chm》。关于开发板配套的OV2640摄像头参数可查阅《ov2640datasheet》配套资料获知。STM32F4芯片具有浮点运算单元,适合对图像信息使用DSP进行基本的图像处理,其处理速度比传统的8、16位机快得多,而且它还具有与摄像头通讯的专用DCMI接口,所以使用它驱动摄像头采集图像信息并进行基本的加工处理非常适合。本章讲解如何使用STM32驱动OV2640型号的摄像头。45.1 摄像头简介在各类信息中,图像含有最丰富的信息,作为机器视觉领域的核心部件,摄像头被广泛地应用在
发表于 2019-09-20
第45章 DCMI—OV2640摄像头—零死角玩转STM32-F429系列

第43章 RTC—实时时钟—零死角玩转STM32-F429系列

函数对每个外设都建立了一个初始化结构体,比如RTC_InitTypeDef,结构体成员用于设置外设工作参数,并由外设初始化配置函数,比如RTC_Init()调用,这些配置好的参数将会设置外设相应的寄存器,达到配置外设工作环境的目的。初始化结构体和初始化库函数配合使用是标准库精髓所在,理解了初始化结构体每个成员意义基本上就可以对该外设运用自如。初始化结构体定义在stm32f4xx_rtc.h头文件中,初始化库函数定义在stm32f4xx_rtc.c文件中,编程时我们可以结合这两个文件内注释使用。RTC初始化结构体用来设置RTC小时的格式和RTC_CLK的分频系数。代码 431 RTC初始化结构体1 typedef st
发表于 2019-09-20
第43章 RTC—实时时钟—零死角玩转STM32-F429系列

第46章 DCMI—OV5640摄像头—零死角玩转STM32-F429系列

本章参考资料:《STM32F4xx参考手册》、《STM32F4xx规格书》、库帮助文档《stm32f4xx_dsp_stdperiph_lib_um.chm》。关于开发板配套的OV5640摄像头参数可查阅《ov5640datasheet》配套资料获知。STM32F4芯片具有浮点运算单元,适合对图像信息使用DSP进行基本的图像处理,其处理速度比传统的8、16位机快得多,而且它还具有与摄像头通讯的专用DCMI接口,所以使用它驱动摄像头采集图像信息并进行基本的加工处理非常适合。本章讲解如何使用STM32驱动OV5640型号的摄像头。46.1 摄像头简介在各类信息中,图像含有最丰富的信息,作为机器视觉领域的核心部件,摄像头被广泛地应用在
发表于 2019-09-20
第46章 DCMI—OV5640摄像头—零死角玩转STM32-F429系列

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved