将FATFS移植STM32RBT6遇到的挂载不成功和返回值问题

发布者:数据舞者最新更新时间:2015-09-18 来源: eefocus关键字:FATFS  STM32RBT6  挂载不成功  返回值 手机看文章 扫描二维码
随时随地手机看文章
移植fatfs遇到了诸多问题,很是苦恼啊,移植成功思来之不易,特分享一下经验。硬件是STM32F103RBT6内存只有20kB,Flash只有128KB,考虑到内存有限,就不能支持长文件名了,在原子论坛上下载的所以要改动,在此感谢原子论坛给我带来的帮助还有安富莱论坛http://bbs.armfly.com/read.php?tid=3601给我带来的启示。另外硬件还有一个大的相机的SD卡,网上买的模块当然也可以自己焊接一个,采用SPI接口,SPI1和SPI2都行,看图

1421327033246.jpg

移植前做了大量准备,在网上尤其是原子论坛翻看各种其他人移植的心得,去fatfs的官方网站下载0.10版本的程序,看各种相关的移植心得,文档版本众多,眼花缭乱,花了点时间看了看一些函数。看得差不多了,就直接把0.10的版本考到自己的工程目录下开始make,经过大量的翻阅和实践,要动的地方只有diskio.c和ffconfig.h,第一个需要把底层驱动函数sd_inti();添加进去。sd卡的读单块和读多块,写单块写多块填进去,ffconfig.h里边需要改几个宏定义的值参照别人的例程就可以实现很简单。

DSTATUS disk_initialize (
 BYTE drv    /* Physical drive nmuber (0..) */
)
{

  
 u8 state;
 state=SD_Init();
 if(!state){
  return STA_NODISK;
 }   
 return 0;           
}

 

/*-----------------------------------------------------------------------*/
/* Return Disk Status                                                    */

DSTATUS disk_status (
 BYTE drv  /* Physical drive nmuber (0..) */
)
{ return 0;
}

 

/*-----------------------------------------------------------------------*/
/* Read Sector(s)                                                        */

DRESULT disk_read (
 BYTE drv,  /* Physical drive nmuber (0..) */
 BYTE *buff,  /* Data buffer to store read data */
 DWORD sector, /* Sector address (LBA) */
 BYTE count  /* Number of sectors to read (1..255) */
)
{
 u8 res=0;

 
   if(count==1)            //1个sector的读操作      
    {                                                
        res = SD_ReadSingleBlock(sector, buff);  
   //res= SD_ReadDisk(buff,sector,count);    
    }                                                
    else                    //多个sector的读操作     
    {                                                
       res = SD_ReadMultiBlock(sector, buff, count);
    }                                                

    //处理返回值,将SPI_SD_driver.c的返回值转成ff.c的返回值
    if(res == 0x00)
    {
        return RES_OK;
    }
    else
    {
        return RES_ERROR;
    }
}

 

/*-----------------------------------------------------------------------*/
/* Write Sector(s)                                                       */

#if _READONLY == 0
DRESULT disk_write (
 BYTE drv,   /* Physical drive nmuber (0..) */
 const BYTE *buff, /* Data to be written */
 DWORD sector,  /* Sector address (LBA) */
 BYTE count   /* Number of sectors to write (1..255) */
)
{
 u8 res;

    // 读写操作
  if(count == 1)
    {
        res = SD_WriteSingleBlock(sector, buff);;
    }
    else
    {
        res = SD_WriteMultiBlock(sector, buff, count);
    }
    // 返回值转换
    if(res == 0)
    {
        return RES_OK;
    }
    else
    {
        return RES_ERROR;
    }
}
#endif /* _READONLY */

[page]

/*-----------------------------------------------------------------------*/
/* Miscellaneous Functions                                               */

DRESULT disk_ioctl (
 BYTE drv,  /* Physical drive nmuber (0..) */
 BYTE ctrl,  /* Control code */
 void *buff  /* Buffer to send/receive control data */
)
{
    DRESULT res;


    if (drv)
    {    
        return RES_PARERR;  //仅支持单磁盘操作,否则返回参数错误
    }
    
    //FATFS目前版本仅需处理CTRL_SYNC,GET_SECTOR_COUNT,GET_BLOCK_SIZ三个命令
    switch(ctrl)
    {
    case CTRL_SYNC:

  res=RES_OK;
        break;
        
    case GET_BLOCK_SIZE:
        *(WORD*)buff = 512;
        res = RES_OK;
        break;

    case GET_SECTOR_COUNT:
        *(DWORD*)buff = SD_GetCapacity();
        res = RES_OK;
        break;
    default:
        res = RES_PARERR;
        break;
    }

    return res;
}

以上代码是参照网友的,当然原子的也没有问题。只要底层没有问题基本上,应用层就不会有问题。如何判别底层函数呢?在不加fatfs前跟踪调试一下看是否初始化能成功和其他的寄存器值是否能读成功。

在sd卡底层没有问题的情况下再做应用层函数的编写。

我在移植时没有使用内存管理机制,所以卡了好几天,一直以为是底层问题,可是读sd卡绝对没有问题,还能播放MP3呢。找不到问题所在头就大,后来在论坛上留言终于网友点醒了我,原来在定义FATFS *FS;是需要分配内存的,据说空间分配有两种方式一个是数组,另一个是定义指针,定义指针时要使用malloc分配内存还要free释放内存,而我定义了fatfs结构的指针没有分配内存,造成返回值 FR_NO_FILESYSTEM,  /* (13) There is no valid FAT volume */,后来我改成fatfs fs;还有一个问题sd卡的挂载驱动号是1 ,我写0 res= f_mount(&fs,(TCHAR*)0,1);    /* Mount a logical drive */;的时候老返回FR_INVALID_DRIVE,  /* (11) The logical drive number is invalid */挂载失败。如果你也遇到这个问题建议改成 res= f_mount(&fs,(TCHAR*)1,1);  这种形式就行了,但是打开文件和读文件内容时还要这么写

res=exf_getfree("0:",&nCapacity,&free) ;//得到SD卡的总容量和剩余容量
 res=f_open(&file, "0:/test.txt", FA_OPEN_EXISTING|FA_READ);
res=f_read (
&file,   /* Pointer to the file object */
 buffer,  /* Pointer to data buffer */
 512,  /* Number of bytes to read */
 &br  /* Pointer to number of bytes read */
) ;

好了,废话不多说,把main函数应用层代码粘贴出来

 FATFS fs;
 FIL file;     //文件1
FIL ftemp;     //文件2.
UINT br,bw;   //读写变量
FILINFO fileinfo; //文件信息
DIR dir;  
FILINFO fileInfo;
UINT br,bw;

 

FRESULT res;
u32 nCapacity;
char buffer[512];
int main(void) 
{  
  u32 total,free;
  BspInit();
 res= SD_Init();

 

 if(res==0)
 {
 
  DebugOut(0, " sd卡初始化成功!");
 }

 res= f_mount(&fs,(TCHAR*)1,1);    /* Mount a logical drive */;
 //f_mkfs(0,1,4096);
  res=exf_getfree("0:",&nCapacity,&free) ;//得到SD卡的总容量和剩余容量
  DebugOut(0," 总容量:%dKB,剩余容量:%dKB",nCapacity,free);
 res=f_open(&file, "0:/test.txt", FA_OPEN_EXISTING|FA_READ);
res=f_read (
&file,   /* Pointer to the file object */
 buffer,  /* Pointer to data buffer */
 512,  /* Number of bytes to read */
 &br  /* Pointer to number of bytes read */
) ;
   DebugOut(0," buffer:%s",buffer);
  res= f_mount(NULL,(TCHAR*)1,1); 
   while(1);


   

}

串口.jpgtxt.jpg

关键字:FATFS  STM32RBT6  挂载不成功  返回值 引用地址:将FATFS移植STM32RBT6遇到的挂载不成功和返回值问题

上一篇:基于STM32的手机蓝牙温度视频监控小车设计
下一篇:指针数组与数组学习

推荐阅读最新更新时间:2024-03-16 14:32

FATFS移植STM32RBT6遇到的挂载不成功返回值问题
移植fatfs遇到了诸多问题,很是苦恼啊,移植成功思来之不易,特分享一下经验。硬件是STM32F103RBT6内存只有20kB,Flash只有128KB,考虑到内存有限,就不能支持长文件名了,在原子论坛上下载的所以要改动,在此感谢原子论坛给我带来的帮助还有安富莱论坛 http://bbs.armfly.com/read.php?tid=3601 给我带来的启示。另外硬件还有一个大的相机的SD卡,网上买的模块当然也可以自己焊接一个,采用SPI接口,SPI1和SPI2都行,看图 移植前做了大量准备,在网上尤其是原子论坛翻看各种其他人移植的心得,去fatfs的官方网站下载0.10版本的程序,看各种相关的移植心得,文档版本众多,眼花缭
[单片机]
将<font color='red'>FATFS</font>移植<font color='red'>STM32RBT6</font>遇到的<font color='red'>挂载</font><font color='red'>不成功</font>和<font color='red'>返回值</font>问题
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) {
[单片机]
STM32F103_SD卡<font color='red'>FatFs</font>文件系统移植
STM32F7xx —— FatFS(W25QXX)
使用经典的fatfs1.4.1,下载源码,和我们用户相关的式diskio.c,实现里面的初始化读写和ioctl。ffconf.h用来配置,很容易看懂,不再细说了。后面写了一个测试例子,能读写成功就说明没问题了。Fatfs对文件的操作与Linux文件操作基本类似,会使用就行,想弄清楚实现要深入学习fatfs的文件结构。 /*-----------------------------------------------------------------------*/ /* Low level disk I/O module skeleton for FatFs (C)ChaN, 2016 */ /*---------
[单片机]
MC9S12UF32的嵌入式文件系统数据存储模块
引言 随着信息技术的发展,嵌入式系统简单地对存储介质按地址、字节进行读写的方式已经不能满足实际应用的需求,利用文件系统对存储介质进行管理成为嵌入式系统的一个发展方向。虽然目前存在很多版本的文件系统,但windows的广泛应用使得FAT文件系统仍然是最通用的文件系统之一。本文中基于MC9S12UF32单片机,结合开源文件系统FatFS,设计实现了使用FAT文件系统的大容量数据存储模块。 1 系统结构 数据存储系统框架如图1所示。该数据存储模块以Freescale公司的MC9S12UF32为核心,串行通信接口SCI接收到的数据可以直接通过单片机以FAT文件的形式存储在micro SD卡中。用户程序可以通过编程控制单片机,直接
[单片机]
MC9S12UF32的嵌入式文件系统数据存储模块
基于STM32F407平台实现FATFS读写大容量(128G)SD卡的心得
本人是沈阳大学的一名小白,之前,无论是STM32,还是FATFS,都是小白一个,甚至不理解那是什么东西,但是据说这种技术目前为止好像是读写大容量卡挺费劲,只能64G,就到头了,但是最近接到一个任务就是做一个数据记录仪而且要把这个东西做成128G的。废话不多说,直接来把。 首先你要知道FATFS是一个文件管理系统,看他的手册,分为应用层,底层驱动等等,但是对于我们嵌入式开发者来说,移植他,我们需要的是修改底层驱动!应用他给出的API实现自己的任务。修改底层驱动!应用他给出的API实现自己的任务。修改底层驱动!应用他给出的API实现自己的任务。 1、修改底层驱动 官网下载,需注意他的版本,如果你做32G ,64G, OK
[单片机]
FATFS简介
一、概述 1、目的 在移植之前,先将源代码大概的阅读一遍,主要是了解文件系统的结构、各个函数的功能和接口、与移植 相关的代码等等。 2、准备工作 在官方网站下载了0.07c版本的源代码,利用记事本进行阅读。 二、源代码的结构 1、源代码组成 源代码压缩包解压后,共两个文件夹,doc是说明,src里就是代码。src文件夹里共五个文件和一个文 件夹。文件夹是option,还有00readme.txt、diskio.c、diskio.h、ff.c、ff.h、integer.h。对比网上 的文章,版本已经不同了,已经没有所谓的tff.c和tff.h了,估计现在都采用条件编译解决这个问题了, 当然文件更少,可能编译选项可能越复
[单片机]
SDIO_FATFS_MDK 调试记录
现在已经调通,把文件系统的各个操作也基本测试了一遍,代码还有待于整理。 首先要说一个问题,就是在写文件(f_write)的时候跳硬件中断的问题。堆栈不够,使用的开发板是奋斗v3.0,芯片是stm32f103vet6,有64K的ram,但是在startup_stm32f10x_hd.s的启动代码文件里对堆栈的定义却很小,不知道为什么,是因为别的硬件资源自己去分配么?现在还没有搞明白。下面有图为证: 原来是512个字节,现在我把他修改成了 2048个字节(2kb)。就可以使用了,在Fatfs操作过程中,他的每一个写操作的单位就是512字节,堆栈也是512字节,自然会溢出没得说,然后程序就会跳到硬件中断那里歇着去了。
[单片机]
SDIO_<font color='red'>FATFS</font>_MDK 调试记录
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved