STM32F103-FATFS 文件系统移植
首先准备一个例程,这里准备一个原子的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 文件系统移植相关推荐
- 2021-08-11 TM32F103 Buffer FatFs 文件系统移植
FatFs 本文展示了STM32 FatFs文件系统移植 内容涉及 : FatFs 文件系统移植 SPI函数移植过程 SPI字节数据模拟输出独写 缓存读写 USART串口的识别 IO口输入输出 按键的 ...
- elm FatFs文件系统移植总结
1 前言 本文将根据我的一些理解,针对elm FatFs文件系统做一个初步总结. 2 elm FatFs文件系统介绍 顾名思义FatFs文件系统就是针对FAT文件系统来的,主要是应用于MCU中,STM ...
- 模拟SPI进行TF卡操作+Fatfs文件系统移植
FATFS版本:FATFS R0.13b SD卡容量:16G 概述 本文的重点是进行Fatfs文件系统的移植和初步的使用.TF卡的操作实际上是指令操作,即你想它发送固定的CMD指令,它接收到指令给你返 ...
- STM32+雷龙SD NAND(贴片SD卡)完成FATFS文件系统移植与测试
一.前言 在STM32项目开发中,经常会用到存储芯片存储数据. 比如:关机时保存机器运行过程中的状态数据,上电再从存储芯片里读取数据恢复:在存储芯片里也会存放很多资源文件.比如,开机音乐,界面上的菜单 ...
- FatFs文件系统移植过程及中度分析
FatFs 是一个通用的文件系统(FAT/exFAT)模块,用于在小型嵌入式系统中实现FAT文件系统. FatFs 组件的编写遵循ANSI C(C89),完全分离于磁盘 I/O 层,因此不依赖于硬件平 ...
- 基于STM32采用CS创世 SD NAND(贴片SD卡)完成FATFS文件系统移植与测试
一.前言 在STM32项目开发中,经常会用到存储芯片存储数据. 比如:关机时保存机器运行过程中的状态数据,上电再从存储芯片里读取数据恢复:在存储芯片里也会存放很多资源文件.比如,开机音乐,界面上的菜单 ...
- 基于stm32、spi协议的Fatfs文件系统移植(附完整代码下载)
开发环境:Window 7 32bit 开发工具:Keil uVision4 硬件:stm32f103vct6 目录 1.硬件设计: 2.软件设计 1.SPI收发数据 2.向SD卡发送的命令格式: 3 ...
- 基于STM32采用CS创世 SD NAND(贴片SD卡)完成FATFS文件系统移植与测试(中篇)
3.2 SPI硬件时序方式 上面的3.1小节是采用SPI模拟时序驱动SD NAND,STM32本身集成有SPI硬件模块,可以直接利用STM32硬件SPI接口读写. 下面贴出底层的适配代码. 上面贴出的 ...
- 文件系统FATFS的移植教程
最新FatFs:http://elm-chan.org/fsw/ff/00index_e.html 一.FATFS文件系统简介 FATFS是面向小型嵌入式系统的一种通用的FAT文件系统.它完全是由C语 ...
- 【FatFs】基于STM32 SD卡移植FatFs文件系统
相关文章 <[SDIO]SDIO.SD卡.FatFs文件系统相关文章索引> 1.前言 FatFs是一个通用的FAT/exFAT文件系统模块,用于小型嵌入式系统.它完全是由 ANSI C 语 ...
最新文章
- hello rocketMQ
- MODE ——计算了 任意多个数字的平均值(知识点:for的循环)
- Win32 串口编程笔记1
- js函数重写php,深入讲解js覆盖原有方法 提供重写方法
- 是否应该立即将网站升级到Drupal 8?
- 收集一些常用查询SQL语句以及显示格式
- hp laser103 属性没有配置项_(常见解决方法)UEditor报错“后端配置项没有正常加载,上传插件不能正常使用”...
- js实现打开本地文件或文件夹
- Sentinel流控规则_线程数失败_分布式系统集群限流_线程数隔离_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0034
- atitit.MIZIAN 陕北方言 特有词汇 大词典 attilax 整理 a--g v1 q31.xlsx
- git merge 回退_git+vscode进行版本控制
- 基于C语言的个人信息管理系统
- 高数——多元函数的定义及极限
- 国内十大不可错过的免费学习资源网站(火速收藏中)
- 【CameraX】Android CameraX 综述
- Elasticsearch 搜索入门技术之一
- 使用java对文件夹中文件后缀进行修改
- ios客户端请求数据加密方式
- pdf怎么转换成jpg或png图片?
- 一位计算机专业硕士毕业生的求职经历和感想[转载]
热门文章
- OTT营销迎来「开卷大考」,科学评估成广告主必答题
- (二)Granfana----监控报警(mysql,rabbmitMQ,redis,TiDB),开放API,其他配置
- jackson学习之一:基本信息
- 未来自动化运维软件的三大趋势
- COCO 数据集的使用,以及下载链接
- 如何在Android中使用emojicon库集成表情符号, 妈妈在也不用担心我的表情了~~~
- 好书推荐-- C大学教程,国外计算机科学教材系列
- 2021-07-28 2021年A特种设备相关管理(锅炉压力容器压力管道)免费试题及A特种设备相关管理(锅炉压力容器压力管道)证考试
- thunderbird邮箱备份方法
- FFmpeg简介、下载与安装以及'ffmpeg' 不是内部或外部命令,也不是可运行的程序 或批处理文件**(Win10)