首先准备一个例程,这里准备一个原子的SD_SDIO实验

修改文件夹名称为FATFS,防止中文出错,编译下载,测试工程是否正确

前往FATFS官网下载源码 http://elm-chan.org/fsw/ff/00index_e.html 点击下载最新版

工程目录下新建FATFS 文件夹,用于存放源码

将所有文件复制大工程的FATFS文件夹下,最上面两个可以删除

打开工程新建文件加添加文件并添加路径

修改 diskio.c

增加头文件和宏定义
#include "usart.h"
#include "sdio_sdcard.h"#define SD_CARD     0  //SD卡,卷标为0
#define SPI_FLASH 1  //SPI Flash,卷标为1

修改 disk_status 函数

DSTATUS disk_status (BYTE pdrv       /* Physical drive nmuber to identify the drive */
)
{return RES_OK;
}

修改 disk_initialize 函数

DSTATUS disk_initialize (BYTE pdrv               /* Physical drive nmuber to identify the drive */
)
{DSTATUS stat=0;switch(pdrv){case SD_CARD:stat=SD_Init();//SD卡初始化 break;case SPI_FLASH:/*未使用 SPIFLASH 默认为无*/break;default:stat=1; }       if(stat) {return  STA_NOINIT;}else     {return 0;          } //初始化成功
}

修改 disk_read 函数

DRESULT disk_read (BYTE pdrv,        /* Physical drive nmuber to identify the drive */BYTE *buff,        /* Data buffer to store read data */LBA_t sector,   /* Start sector in LBA */UINT count     /* Number of sectors to read */
)
{u8 res;if (!count)return RES_PARERR;  //count不能等于0,否则返回参数错误switch(pdrv){case SD_CARD:res=SD_ReadDisk(buff,sector,count);    while(res)//读出错{SD_Init(); //重新初始化SD卡res=SD_ReadDisk(buff,sector,count);  //printf("sd rd error:%d\r\n",res);}break;case SPI_FLASH:/*未使用 SPIFLASH 默认为无*/res=0;break;default:res=1; }//处理返回值,将SPI_SD_driver.c的返回值转成ff.c的返回值if(res==0x00) {return RES_OK;   }   else          {return RES_ERROR;}
}

修改 disk_write 函数

DRESULT disk_write (BYTE pdrv,           /* Physical drive nmuber to identify the drive */const BYTE *buff,  /* Data to be written */LBA_t sector,       /* Start sector in LBA */UINT count         /* Number of sectors to write */
)
{u8 res;if (!count)return RES_PARERR;  //count不能等于0,否则返回参数错误switch(pdrv){case SD_CARD:res=SD_WriteDisk((u8*)buff,sector,count);while(res)//写出错{SD_Init();   //重新初始化SD卡res=SD_WriteDisk((u8*)buff,sector,count);    //printf("sd wr error:%d\r\n",res);}break;case SPI_FLASH:/*未使用 SPIFLASH 默认为无*/res=0;break;default:res=1; }//处理返回值,将SPI_SD_driver.c的返回值转成ff.c的返回值if(res == 0x00) {return RES_OK;   }     else            {return RES_ERROR;}
}

修改 disk_ioctl 函数 ,如果没有移植此函数,大部分情况可以正常使用,但是偶尔会有提示磁盘存在写保护,类似问题大概率是因为此函数移植问题!!!

DRESULT disk_ioctl (BYTE pdrv,       /* Physical drive nmuber (0..) */BYTE cmd,      /* Control code */void *buff        /* Buffer to send/receive control data */
)
{DRESULT res;                                        if(pdrv==SD_CARD)//SD卡{switch(cmd){case CTRL_SYNC:res = RES_OK; break;case GET_SECTOR_SIZE:*(DWORD*)buff = 512; res = RES_OK;break;case GET_BLOCK_SIZE:*(WORD*)buff = SDCardInfo.CardBlockSize;res = RES_OK;break;case GET_SECTOR_COUNT:*(DWORD*)buff = SDCardInfo.CardCapacity/512;res = RES_OK;break;default:res = RES_PARERR;break;}}else if(pdrv==SPI_FLASH)   //外部FLASH  {/*未使用 SPIFLASH 默认为无*/}else {res=RES_ERROR;//其他的不支持}return res;
}

增加 get_fattime 函数

DWORD get_fattime(void)
{return 0;
}

修改ffconf.h

#define FF_FS_READONLY   0
#define FF_FS_MINIMIZE  0
#define FF_USE_STRFUNC  1
#define FF_USE_FIND     0
#define FF_USE_MKFS     1
#define FF_USE_FASTSEEK 1
#define FF_USE_EXPAND   0
#define FF_USE_CHMOD    0
#define FF_USE_LABEL    1
#define FF_USE_FORWARD  0
#define FF_CODE_PAGE    936
#define FF_USE_LFN      2
#define FF_MAX_LFN      255
#define FF_LFN_UNICODE  0
#define FF_LFN_BUF      255
#define FF_SFN_BUF      12
#define FF_STRF_ENCODE  3
#define FF_FS_RPATH     0
#define FF_VOLUMES      2
#define FF_STR_VOLUME_ID    0
#define FF_VOLUME_STRS      "RAM","NAND","CF","SD","SD2","USB","USB2","USB3"
#define FF_MULTI_PARTITION  0
#define FF_MIN_SS       512
#define FF_MAX_SS       512
#define FF_LBA64        0
#define FF_MIN_GPT      0x10000000
#define FF_USE_TRIM     0
#define FF_FS_TINY      0
#define FF_FS_EXFAT     0
#define FF_FS_NORTC     0
#define FF_NORTC_MON    1
#define FF_NORTC_MDAY   1
#define FF_NORTC_YEAR   2020
#define FF_FS_NOFSINFO  0
#define FF_FS_LOCK      0
#define FF_FS_REENTRANT 0
#define FF_FS_TIMEOUT   1000
#define FF_SYNC_t       HANDLE

修改main.c

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "key.h"
#include "stdio.h"
#include "string.h"#include "ff.h"
#include "sdio_sdcard.h"//文件系统定义使用
FATFS    ff_disk;                               /* FatFs文件系统对象          */
FIL      ff_file;                               /* 文件对象                   */
FRESULT  ff_rec;                                /* 文件操作结果               */
UINT     ff_num;                                /* 文件成功读写数量           */
DIR      ff_dir;                                /* 文件夹名称                 */
FILINFO  ff_info;                               /* 文件信息读取保存           */
BYTE     ff_buff[99]={0};                       /* SD卡操作缓冲区             */uint8_t Test_Buff[33] = {"文件系统测试数据 FATFS TEST DATA"};int main(void)
{delay_init();           //延时函数初始化    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级uart_init(115200);     //串口初始化为115200LED_Init();                   //初始化与LED连接的硬件接口while(SD_Init())  //检测是否存在SD卡{LED0 =! LED0;printf("SD Card Test..... \r\n");delay_ms(300);};LED0 = 1;ff_rec = f_mount(&ff_disk,"0:",0);                                           //挂载SD卡ff_rec = f_mkdir("0:/data");                                                 //创建文件夹ff_rec = f_open(&ff_file,"0:/test.txt",FA_CREATE_ALWAYS | FA_WRITE);         //打开一个文件,如果没有则创建一个,有则覆盖掉之前,并打开写入属性printf("ERROR:%d\r\n",ff_rec);                                              //打印错误ff_rec = f_write(&ff_file,Test_Buff,32,&ff_num);                             //写数据ff_rec = f_close(&ff_file);                                                  //关闭文件memset(Test_Buff,0,32);                                                      //清零Test_Buffff_rec = f_open(&ff_file,"0:/test.txt",FA_READ);                             //打开文件ff_rec = f_read(&ff_file,Test_Buff,32,&ff_num);                              //读文件内容ff_rec = f_close(&ff_file);                                                  //关闭文件Test_Buff[32] = '\0';                                                        //添加结束符,不添加结束符,会导致末尾多出乱printf("ERROR:%d\r\nDATA:%s\r\n",ff_rec,Test_Buff);                        //打印错误while(1){LED1 =! LED1;delay_ms(500);};
}

编译下载,下载,串口打印无错误

查看SD卡内容,数据正确

成功移植FATFS

个人见解,感谢阅读。

STM32F103-FATFS 文件系统移植相关推荐

  1. 2021-08-11 TM32F103 Buffer FatFs 文件系统移植

    FatFs 本文展示了STM32 FatFs文件系统移植 内容涉及 : FatFs 文件系统移植 SPI函数移植过程 SPI字节数据模拟输出独写 缓存读写 USART串口的识别 IO口输入输出 按键的 ...

  2. elm FatFs文件系统移植总结

    1 前言 本文将根据我的一些理解,针对elm FatFs文件系统做一个初步总结. 2 elm FatFs文件系统介绍 顾名思义FatFs文件系统就是针对FAT文件系统来的,主要是应用于MCU中,STM ...

  3. 模拟SPI进行TF卡操作+Fatfs文件系统移植

    FATFS版本:FATFS R0.13b SD卡容量:16G 概述 本文的重点是进行Fatfs文件系统的移植和初步的使用.TF卡的操作实际上是指令操作,即你想它发送固定的CMD指令,它接收到指令给你返 ...

  4. STM32+雷龙SD NAND(贴片SD卡)完成FATFS文件系统移植与测试

    一.前言 在STM32项目开发中,经常会用到存储芯片存储数据. 比如:关机时保存机器运行过程中的状态数据,上电再从存储芯片里读取数据恢复:在存储芯片里也会存放很多资源文件.比如,开机音乐,界面上的菜单 ...

  5. FatFs文件系统移植过程及中度分析

    FatFs 是一个通用的文件系统(FAT/exFAT)模块,用于在小型嵌入式系统中实现FAT文件系统. FatFs 组件的编写遵循ANSI C(C89),完全分离于磁盘 I/O 层,因此不依赖于硬件平 ...

  6. 基于STM32采用CS创世 SD NAND(贴片SD卡)完成FATFS文件系统移植与测试

    一.前言 在STM32项目开发中,经常会用到存储芯片存储数据. 比如:关机时保存机器运行过程中的状态数据,上电再从存储芯片里读取数据恢复:在存储芯片里也会存放很多资源文件.比如,开机音乐,界面上的菜单 ...

  7. 基于stm32、spi协议的Fatfs文件系统移植(附完整代码下载)

    开发环境:Window 7 32bit 开发工具:Keil uVision4 硬件:stm32f103vct6 目录 1.硬件设计: 2.软件设计 1.SPI收发数据 2.向SD卡发送的命令格式: 3 ...

  8. 基于STM32采用CS创世 SD NAND(贴片SD卡)完成FATFS文件系统移植与测试(中篇)

    3.2 SPI硬件时序方式 上面的3.1小节是采用SPI模拟时序驱动SD NAND,STM32本身集成有SPI硬件模块,可以直接利用STM32硬件SPI接口读写. 下面贴出底层的适配代码. 上面贴出的 ...

  9. 文件系统FATFS的移植教程

    最新FatFs:http://elm-chan.org/fsw/ff/00index_e.html 一.FATFS文件系统简介 FATFS是面向小型嵌入式系统的一种通用的FAT文件系统.它完全是由C语 ...

  10. 【FatFs】基于STM32 SD卡移植FatFs文件系统

    相关文章 <[SDIO]SDIO.SD卡.FatFs文件系统相关文章索引> 1.前言 FatFs是一个通用的FAT/exFAT文件系统模块,用于小型嵌入式系统.它完全是由 ANSI C 语 ...

最新文章

  1. hello rocketMQ
  2. MODE ——计算了 任意多个数字的平均值(知识点:for的循环)
  3. Win32 串口编程笔记1
  4. js函数重写php,深入讲解js覆盖原有方法 提供重写方法
  5. 是否应该立即将网站升级到Drupal 8?
  6. 收集一些常用查询SQL语句以及显示格式
  7. hp laser103 属性没有配置项_(常见解决方法)UEditor报错“后端配置项没有正常加载,上传插件不能正常使用”...
  8. js实现打开本地文件或文件夹
  9. Sentinel流控规则_线程数失败_分布式系统集群限流_线程数隔离_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0034
  10. atitit.MIZIAN 陕北方言 特有词汇 大词典 attilax 整理 a--g v1 q31.xlsx
  11. git merge 回退_git+vscode进行版本控制
  12. 基于C语言的个人信息管理系统
  13. 高数——多元函数的定义及极限
  14. 国内十大不可错过的免费学习资源网站(火速收藏中)
  15. 【CameraX】Android CameraX 综述
  16. Elasticsearch 搜索入门技术之一
  17. 使用java对文件夹中文件后缀进行修改
  18. ios客户端请求数据加密方式
  19. pdf怎么转换成jpg或png图片?
  20. 一位计算机专业硕士毕业生的求职经历和感想[转载]

热门文章

  1. OTT营销迎来「开卷大考」,科学评估成广告主必答题
  2. (二)Granfana----监控报警(mysql,rabbmitMQ,redis,TiDB),开放API,其他配置
  3. jackson学习之一:基本信息
  4. 未来自动化运维软件的三大趋势
  5. COCO 数据集的使用,以及下载链接
  6. 如何在Android中使用emojicon库集成表情符号, 妈妈在也不用担心我的表情了~~~
  7. 好书推荐-- C大学教程,国外计算机科学教材系列
  8. 2021-07-28 2021年A特种设备相关管理(锅炉压力容器压力管道)免费试题及A特种设备相关管理(锅炉压力容器压力管道)证考试
  9. thunderbird邮箱备份方法
  10. FFmpeg简介、下载与安装以及'ffmpeg' 不是内部或外部命令,也不是可运行的程序 或批处理文件**(Win10)