搜索
bottom↓
回复: 9

请教下,如何使用fatfs 挂载3个器件自己折腾了一下没有成功

[复制链接]

出0入0汤圆

发表于 2015-8-5 11:04:39 | 显示全部楼层 |阅读模式
请教下,如何使用fatfs 挂载3个器件自己折腾了一下没有成功

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2015-8-5 11:54:52 | 显示全部楼层
本帖最后由 myqiang1990 于 2015-8-5 11:56 编辑

#define _VOLUMES                3
首先将FATFS支持卷标数改成    3

然后呢~分别实现3个器件底层的读写接口~~然后~用一个结构体分别将三个器件的底层函数封装~因为FARFS在操作器件的时候,是按照卷标来来操作的,所以~就很好办啦~说起来比较繁琐~建议你去看看ST提供的一些相关例子~我现在能同时操作USB和SD卡,其实多少个器件都无所谓~不超过FATFS支持的范围就可以~

出0入0汤圆

发表于 2015-8-5 12:00:41 | 显示全部楼层
myqiang1990 发表于 2015-8-5 11:54
#define _VOLUMES                3
首先将FATFS支持卷标数改成    3

沉默了一段时间啊嘿嘿  你上次提到TIm7有问题  后来情况怎么样了  因为我刚好也用了这个定时器啊

出0入0汤圆

发表于 2015-8-5 12:07:09 | 显示全部楼层
本帖最后由 myqiang1990 于 2015-8-5 15:57 编辑

我给个工程样板给你~这个工程样板是我给一个朋友弄的~完全正常~~配置是这样的~STM32F429+FREERTOS+STemwim+USB+SD+FATFS+7寸液晶触摸屏,里面就包含了USB和SD卡同时操作的例子~
工程太大啦~传不上来~我先去吃饭啦 ~下午想办法传上来~~




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-8-5 12:09:56 | 显示全部楼层
myxiaonia 发表于 2015-8-5 12:00
沉默了一段时间啊嘿嘿  你上次提到TIm7有问题  后来情况怎么样了  因为我刚好也用了这个定时器啊 ...

是因为用了库函数memset导致出错的~具体怎么导致的~没搞明白~因为我的一些算法原因~所以需要在定时器将一些定时参数清零~就用了memset来清零,就出错了~

出0入0汤圆

 楼主| 发表于 2015-8-5 16:43:04 | 显示全部楼层
myqiang1990 发表于 2015-8-5 12:07
我给个工程样板给你~这个工程样板是我给一个朋友弄的~完全正常~~配置是这样的~STM32F429+FREERTOS+STemwim+ ...



这个地方已经改了,我先研究一下你的程序,谢谢了

出0入0汤圆

发表于 2015-8-5 17:00:38 | 显示全部楼层
看下原子的程序,我就是参考他的。

出0入0汤圆

 楼主| 发表于 2015-8-5 18:33:56 | 显示全部楼层
hyghyg1234 发表于 2015-8-5 17:00
看下原子的程序,我就是参考他的。

你好,能否发上来共享一下啊 ?!

出0入0汤圆

 楼主| 发表于 2015-8-6 22:44:37 | 显示全部楼层
myxiaonia 发表于 2015-8-5 12:00
沉默了一段时间啊嘿嘿  你上次提到TIm7有问题  后来情况怎么样了  因为我刚好也用了这个定时器啊 ...

你好,我已经改了,但是还是不行,相关代码如下:

#define FS_SD                0
#define FS_NAND        1
#define FS_USB                2       

FRESULT result;
FATFS *fs_my[_VOLUMES];                //初始化挂载文件系统使用,目前支持3个,sd, Nand_flash, usb

FIL file;

DIR DirInf;
FILINFO FileInf;
UINT br,bw;                        //读写变量
DIR dir;                          //目录
char  *fn;  
char  filename[_MAX_LFN] = {0};
char  filesize[50] = {0};       

// ff.h 配置
/*---------------------------------------------------------------------------/
/  FatFs - FAT file system module configuration file  R0.11 (C)ChaN, 2015
/---------------------------------------------------------------------------*/

#define _FFCONF 32020        /* Revision ID */

/*---------------------------------------------------------------------------/
/ Functions and Buffer Configurations
/---------------------------------------------------------------------------*/

#define        _FS_TINY                0
/* This option switches tiny buffer configuration. (0:Normal or 1:Tiny)
/  At the tiny configuration, size of the file object (FIL) is reduced _MAX_SS
/  bytes. Instead of private sector buffer eliminated from the file object,
/  common sector buffer in the file system object (FATFS) is used for the file
/  data transfer. */


#define _FS_READONLY        0
/* This option switches read-only configuration. (0:Read/Write or 1:Read-only)
/  Read-only configuration removes writing API functions, f_write(), f_sync(),
/  f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree()
/  and optional writing functions as well. */


#define _FS_MINIMIZE        0
/* This option defines minimization level to remove some basic API functions.
/
/   0: All basic functions are enabled.
/   1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_chmod(), f_utime(),
/      f_truncate() and f_rename() function are removed.
/   2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1.
/   3: f_lseek() function is removed in addition to 2. */


#define        _USE_STRFUNC        1
/* This option switches string functions, f_gets(), f_putc(), f_puts() and
/  f_printf().
/
/  0: Disable string functions.
/  1: Enable without LF-CRLF conversion.
/  2: Enable with LF-CRLF conversion. */


#define _USE_FIND                0
/* This option switches filtered directory read feature and related functions,
/  f_findfirst() and f_findnext(). (0:Disable or 1:Enable) */


#define        _USE_MKFS                1
/* This option switches f_mkfs() function. (0:Disable or 1:Enable) */


#define        _USE_FASTSEEK        1
/* This option switches fast seek feature. (0:Disable or 1:Enable) */


#define _USE_LABEL                1
/* This option switches volume label functions, f_getlabel() and f_setlabel().
/  (0:Disable or 1:Enable) */


#define        _USE_FORWARD        0
/* This option switches f_forward() function. (0:Disable or 1:Enable)
/  To enable it, also _FS_TINY need to be set to 1. */


/*---------------------------------------------------------------------------/
/ Locale and Namespace Configurations
/---------------------------------------------------------------------------*/

#define _CODE_PAGE        936                //采用中文GBK编码
/* This option specifies the OEM code page to be used on the target system.
/  Incorrect setting of the code page can cause a file open failure.
/
/   1    - ASCII (No extended character. Non-LFN cfg. only)
/   437  - U.S.
/   720  - Arabic
/   737  - Greek
/   775  - Baltic
/   850  - Multilingual Latin 1
/   852  - Latin 2
/   855  - Cyrillic
/   857  - Turkish
/   858  - Multilingual Latin 1 + Euro
/   862  - Hebrew
/   866  - Russian
/   874  - Thai
/   932  - Japanese Shift_JIS (DBCS)
/   936  - Simplified Chinese GBK (DBCS)
/   949  - Korean (DBCS)
/   950  - Traditional Chinese Big5 (DBCS)
*/


#define        _USE_LFN        2                /* 0 to 3 【由0 修改 1】*/
#define        _MAX_LFN        255
/* The _USE_LFN option switches the LFN feature.
/
/   0: Disable LFN feature. _MAX_LFN has no effect.
/   1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe.
/   2: Enable LFN with dynamic working buffer on the STACK.
/   3: Enable LFN with dynamic working buffer on the HEAP.
/
/  When enable the LFN feature, Unicode handling functions (option/unicode.c) must
/  be added to the project. The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes.
/  When use stack for the working buffer, take care on stack overflow. When use heap
/  memory for the working buffer, memory management functions, ff_memalloc() and
/  ff_memfree(), must be added to the project. */


#define        _LFN_UNICODE        0
/* This option switches character encoding on the API. (0:ANSI/OEM or 1:Unicode)
/  To use Unicode string for the path name, enable LFN feature and set _LFN_UNICODE
/  to 1. This option also affects behavior of string I/O functions. */


#define _STRF_ENCODE        3
/* When _LFN_UNICODE is 1, this option selects the character encoding on the file to
/  be read/written via string I/O functions, f_gets(), f_putc(), f_puts and f_printf().
/
/  0: ANSI/OEM
/  1: UTF-16LE
/  2: UTF-16BE
/  3: UTF-8
/
/  When _LFN_UNICODE is 0, this option has no effect. */


#define _FS_RPATH        0
/* This option configures relative path feature.
/
/   0: Disable relative path feature and remove related functions.
/   1: Enable relative path feature. f_chdir() and f_chdrive() are available.
/   2: f_getcwd() function is available in addition to 1.
/
/  Note that directory items read via f_readdir() are affected by this option. */


/*---------------------------------------------------------------------------/
/ Drive/Volume Configurations
/---------------------------------------------------------------------------*/

#define _VOLUMES        3                /* 【由0 修改 3, 支持3个盘符】 */
/* Number of volumes (logical drives) to be used. */


#define _STR_VOLUME_ID        0
#define _VOLUME_STRS        "RAM","NAND","CF","SD1","SD2","USB1","USB2","USB3"
/* _STR_VOLUME_ID option switches string volume ID feature.
/  When _STR_VOLUME_ID is set to 1, also pre-defined strings can be used as drive
/  number in the path name. _VOLUME_STRS defines the drive ID strings for each
/  logical drives. Number of items must be equal to _VOLUMES. Valid characters for
/  the drive ID strings are: A-Z and 0-9. */


#define        _MULTI_PARTITION        0
/* This option switches multi-partition feature. By default (0), each logical drive
/  number is bound to the same physical drive number and only an FAT volume found on
/  the physical drive will be mounted. When multi-partition feature is enabled (1),
/  each logical drive number is bound to arbitrary physical drive and partition
/  listed in the VolToPart[]. Also f_fdisk() funciton will be available. */


#define        _MIN_SS                512
#define        _MAX_SS                512
/* These options configure the range of sector size to be supported. (512, 1024,
/  2048 or 4096) Always set both 512 for most systems, all type of memory cards and
/  harddisk. But a larger value may be required for on-board flash memory and some
/  type of optical media. When _MAX_SS is larger than _MIN_SS, FatFs is configured
/  to variable sector size and GET_SECTOR_SIZE command must be implemented to the
/  disk_ioctl() function. */


#define        _USE_TRIM        0
/* This option switches ATA-TRIM feature. (0:Disable or 1:Enable)
/  To enable Trim feature, also CTRL_TRIM command should be implemented to the
/  disk_ioctl() function. */


#define _FS_NOFSINFO        0
/* If you need to know correct free space on the FAT32 volume, set bit 0 of this
/  option, and f_getfree() function at first time after volume mount will force
/  a full FAT scan. Bit 1 controls the use of last allocated cluster number.
/
/  bit0=0: Use free cluster count in the FSINFO if available.
/  bit0=1: Do not trust free cluster count in the FSINFO.
/  bit1=0: Use last allocated cluster number in the FSINFO if available.
/  bit1=1: Do not trust last allocated cluster number in the FSINFO.
*/



/*---------------------------------------------------------------------------/
/ System Configurations
/---------------------------------------------------------------------------*/

#define _FS_NORTC        1
#define _NORTC_MON        2
#define _NORTC_MDAY        1
#define _NORTC_YEAR        2015
/* The _FS_NORTC option switches timestamp feature. If the system does not have
/  an RTC function or valid timestamp is not needed, set _FS_NORTC to 1 to disable
/  the timestamp feature. All objects modified by FatFs will have a fixed timestamp
/  defined by _NORTC_MON, _NORTC_MDAY and _NORTC_YEAR.
/  When timestamp feature is enabled (_FS_NORTC        == 0), get_fattime() function need
/  to be added to the project to read current time form RTC. _NORTC_MON,
/  _NORTC_MDAY and _NORTC_YEAR have no effect.
/  These options have no effect at read-only configuration (_FS_READONLY == 1). */


#define        _FS_LOCK        0                /* 0:Disable or >=1:Enable 【由0 修改 3, 支持同时打开3个文件】*/
/* The _FS_LOCK option switches file lock feature to control duplicated file open
/  and illegal operation to open objects. This option must be 0 when _FS_READONLY
/  is 1.
/
/  0:  Disable file lock feature. To avoid volume corruption, application program
/      should avoid illegal open, remove and rename to the open objects.
/  >0: Enable file lock feature. The value defines how many files/sub-directories
/      can be opened simultaneously under file lock control. Note that the file
/      lock feature is independent of re-entrancy. */


#define _FS_REENTRANT        0
#define _FS_TIMEOUT                1000
#define        _SYNC_t                        HANDLE
/* The _FS_REENTRANT option switches the re-entrancy (thread safe) of the FatFs
/  module itself. Note that regardless of this option, file access to different
/  volume is always re-entrant and volume control functions, f_mount(), f_mkfs()
/  and f_fdisk() function, are always not re-entrant. Only file/directory access
/  to the same volume is under control of this feature.
/
/   0: Disable re-entrancy. _FS_TIMEOUT and _SYNC_t have no effect.
/   1: Enable re-entrancy. Also user provided synchronization handlers,
/      ff_req_grant(), ff_rel_grant(), ff_del_syncobj() and ff_cre_syncobj()
/      function, must be added to the project. Samples are available in
/      option/syscall.c.
/
/  The _FS_TIMEOUT defines timeout period in unit of time tick.
/  The _SYNC_t defines O/S dependent sync object type. e.g. HANDLE, ID, OS_EVENT*,
/  SemaphoreHandle_t and etc.. A header file for O/S definitions needs to be
/  included somewhere in the scope of ff.c. */


#define _WORD_ACCESS        0
/* The _WORD_ACCESS option is an only platform dependent option. It defines
/  which access method is used to the word data on the FAT volume.
/
/   0: Byte-by-byte access. Always compatible with all platforms.
/   1: Word access. Do not choose this unless under both the following conditions.
/
/  * Address misaligned memory access is always allowed to ALL instructions.
/  * Byte order on the memory is little-endian.
/
/  If it is the case, _WORD_ACCESS can also be set to 1 to reduce code size.
/  Following table shows allowable settings of some processor types.
/
/  ARM7TDMI   0   *2          ColdFire   0    *1         V850E      0    *2
/  Cortex-M3  0   *3          Z80        0/1             V850ES     0/1
/  Cortex-M0  0   *2          x86        0/1             TLCS-870   0/1
/  AVR        0/1             RX600(LE)  0/1             TLCS-900   0/1
/  AVR32      0   *1          RL78       0    *2         R32C       0    *2
/  PIC18      0/1             SH-2       0    *1         M16C       0/1
/  PIC24      0   *2          H8S        0    *1         MSP430     0    *2
/  PIC32      0   *1          H8/300H    0    *1         8051       0/1
/
/  *1:Big-endian.
/  *2:Unaligned memory access is not supported.
/  *3:Some compilers generate LDM/STM for mem_cpy function.
*/






// =======================================





void SD_UserFatfsInit(void)
{
        __IO uint32_t cnt = 0;
        __IO u8  FileCnt=0;

        #if _USE_LFN > 0       
       
          char lfname[256];
       
        #endif       
       
        if( SD_Detect() != SD_NOT_PRESENT )         //检测磁盘是否插好
        {
                {
                        result = f_mount(fs_my[FS_SD], "0:", 0);                        //fs_my[FS_SD]  这个如果改成   FATFS   _fs; 就可以
                       
                        if (result != FR_OK)
                        {
                                printf("\r\n挂载文件系统失败(%d)", result);
                                return;
                        }               
                        else
                                printf("\r\n挂载文件系统成功");       
                       
                        printf("\r\nCardCapacity %lld", SDCardInfo.CardCapacity);           //输出卡容量
                        printf("\r\nCardBlockSize %d", SDCardInfo.CardBlockSize);           //输出卡块大小
                        printf("\r\nCardType %d", SDCardInfo.CardType);                           //输出卡类型                       
                       
                        /* 打开根文件夹 */
                        result = f_opendir(&DirInf, "0:");               
                        if (result != FR_OK)
                        {
                                printf("\r\n打开根目录失败(%d)", result);
                                return;
                        }               
                        else
                                printf("\r\n打开根目录成功");                               
               
                        #if _USE_LFN > 0               
                                // 读取当前文件夹下的文件和目录
                                FileInf.lfname = lfname;
                                FileInf.lfsize = 256;                       
                        #endif       
                       
//                        printf("\r\n属性      & 文件大小 & 文件名\r\n");    //输出内容格式
                       
                        for (cnt = 0; ;cnt++)
                        {
                                result = f_readdir(&DirInf,&FileInf);                 /* 读取目录项,索引会自动下移 */
                                if (result != FR_OK || FileInf.fname[0] == 0)
                                {
                                        break;
                                }
       
                                if (FileInf.fname[0] == '.')
                                {
                                        continue;
                                }

                                #if _USE_LFN > 0
                                                        fn = *FileInf.lfname ? FileInf.lfname : FileInf.fname;                //判断文件长短名
                                #else
                                                        fn = FileInf.fname;
                                #endif                               
                               
                                /* 判断是文件还是子目录 */
                                if (FileInf.fattrib & AM_DIR)
                                {
                                        printf("(0x%02d)目录    ", FileInf.fattrib);
                                       
                                        //f_opendir(&DirInf, fn);
                                        //f_readdir(&DirInf, &FileInf);
                                       
                                        //if (FileInf.fattrib & AM_DIR)
                                        //{
                                        //        printf("/%s", FileInf.fname);
                                        //}
                                }
                                else
                                {
                                       
                                        printf("(0x%02d)文件  ", FileInf.fattrib);
                       
                                        if((my_strstr(((char *)fn), ".txt")) == SUCCESS)       
                                        {
                                                        FileCnt ++;    //文件个数
                                       
                                                //读取sd卡数据,通过printf打印到串口
                                                //Test_f2_read(((char *)&fn));   //Test_f2_read(FileInf.lfname);  
                                               
                                                result = f_open(&file, fn, FA_OPEN_EXISTING | FA_READ);                //打开存在的文件,如果没有则返回错误
                                                //SD_ReadWriteFatfsStatus(result);                //通过串口发送SD卡成败信息,可以不用
                                               
                                                if(result != FR_OK)
                                                        return ;
                                               
                                                tFont.FontCode = FC_ST_16;        // 字体代码 16点阵
                                                tFont.FrontColor = CL_BLACK;                        //CL_BLUE;        // 字体颜色
                                                tFont.BackColor = CL_MASK;        // 透明色
                                                tFont.Space = 6;
                                                LCD_ClrScr(CL_WHITE);       
                                               
                                                for (;;)
                                                {
                                                        result = f_read(&file, &SD_RWBuff[0]/*fsrc.buf*/, sizeof(SD_RWBuff), &br);
                                                       
                                                        if (result || (br == 0))                
                                                                break;   // error or eof        错误或者读取完成
                                                       
                                                        strcpy((char *)&filename, "文件名:");
                                                        strcat((char *)&filename, fn);
                                                        LCD_DispStr(32, 0, (u8 *)&filename, &tFont);                        //LCD显示文件名称                                                       
                                                       
                                                        strcpy((char *)&filename, "文件大小:");
                                                        sprintf((char *)&filesize, "%d Byte", FileInf.fsize);
                                                        strcat((char *)&filename, (char *)&filesize);                                               
                                                        LCD_DispStr(32, 21, (u8 *)&filename, &tFont);                                //LCD显示文件大小
                                                        LCD_DispStr(32, 42, (u8 *)&SD_RWBuff, &tFont);                                //LCD显示sd卡里面的内容
                                                }
                                        }
                                        f_close(&file);                // Close all files                                       
                                }
                        }                       
                        f_mount(NULL,"0:",0);                //f_mount(0, NULL);                          /* 卸载文件系统 , 文件挂起来*/
                }       
        }
}

出0入0汤圆

发表于 2018-1-9 08:56:03 | 显示全部楼层
我的stm32f407下,SD卡+U盘,只要接上U盘运行,MX_USB_HOST_Process(),SD卡运行f_open(&SDFile, fileName, FA_OPEN_ALWAYS | FA_WRITE) 就异常出错进入硬件中断HardFault_Handler,哪位大神知道什么原因?-------------运行f_open前有 f_mount(&SDFatFS, (TCHAR const*)SDPath, 0) 和f_chdrive((TCHAR const*)SDPath)且都返回OK,不接U盘时没事,单独U盘读写不带SD卡时也没事,求大神
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 20:09

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表