SD卡STM32C8T6-FATFS文件系统的使用

本文介绍了如何在STM32上移植和使用FATFS文件系统,包括文件的读写、目录遍历以及资源占用情况。通过简单的API调用实现对SD卡的读写操作,同时展示了如何遍历目录和文件,以及在资源有限的环境中优化内存占用。
摘要由CSDN通过智能技术生成

1-关于移植,网上教程非常多了,没多少讲的,移植也比较简单,基本只要提供读写扇区函数就可以了。本次使用的是官网最新的0.4版本

本文记录一下

--读写文件功能

--遍历目录和文件

--使用的内存情况

直接跳过移植,和SD卡驱动部分。

 文件读写-------------

基本和C语言file操作一致,这几个函数基本不会陌生吧,流程也是打开,读写,关闭

res =f_mount(&fs,"0:",1); 					//挂载SD卡 

	if(res)
	{
		
	}
	else
	{
		
		exf_getfree("0",&total,&free);
		printf("SD total %d free %d\r\n",total,free);
		
	}
	
	scan_files("0:");
	
	res = f_open(&fil, "0:/test1.txt",FA_OPEN_APPEND|FA_WRITE|FA_READ);
	printf("open %d size %d\r\n",res,f_size(&fil));

	
	res = f_write(&fil, wrbuf, sizeof(wrbuf), &bw);
	printf("write %d len %d\r\n",res,bw);

	f_lseek(&fil,0);
	res = f_read(&fil,mm,12,&read_len);
	printf("read %s len %d res %d\r\n",(char*)mm,read_len,res);
	
	f_close(&fil);
	/*卸载文件系统*/
	f_mount(0, "0:", 0);

----遍历目录和文件

scan_files("0:"); 函数就是扫描当前所有的文件和目录,里面会有递归,目录不要太深,否则main函数的栈不够你用的。

代码: 

FRESULT scan_files(char *path)
{
	FRESULT res; //定义结果对象
	DIR dir; //定义目录对象
	char pathBuff[100]={0}; //定义路径数组
	static FILINFO fno; //定义静态文件信息结构对象
	res = f_opendir(&dir,path); //打开目录,返回状态 和 目录对象的指针

	if(res == FR_OK) //打开成功
	{
		while(1) //遍历
		{
			res = f_readdir(&dir, &fno); //读取目录,返回状态 和 文件信息的指针
			if(res != FR_OK || fno.fname[0] == 0) 
				break; //若打开失败 或 到结尾,则退出
			if(fno.fattrib & AM_DIR) //是目录
			{
		
				sprintf(pathBuff,"%s/%s",path,fno.fname); //将新目录添加在原目录后面
				printf("is path:%s\r\n",pathBuff);
				res = scan_files(pathBuff); //将新目录进行递归调用
				if(res != FR_OK) break; //打开失败则退出
	
			}else
			{
				printf("si file:%s/%s %d\r\n",path,fno.fname,fno.fsize); //是文件
			
			}
		}
	}
	else
	{
		printf("失败 - %d",&res); //打开失败
	}
	f_closedir(&dir); //关闭目录
	return res; //返回状态
}

运行如下:和我sd卡中文件结构一致

 

 ----最后关于占用的资源部分,

使用的US编码

#define FF_CODE_PAGE    437

使用小型模式

#define FF_FS_TINY        1

不使用格式化功能

#define FF_USE_MKFS        0

在keil的map中看,ROM大概在7.3K,  RAM使用的非常小,目前是大部分功能都有的情况下,后续把一些独立的功能再裁剪一下应该更小巧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值