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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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使用的非常小,目前是大部分功能都有的情况下,后续把一些独立的功能再裁剪一下应该更小巧

### FatFs 文件系统使用教程 FatFs 是一种轻量级的 FAT 文件系统模块,专为小型嵌入式设备设计。以下是有关其使用方法、示例代码及相关说明的内容。 #### 一、基本概念 FatFs 提供了一组 API 函数来操作文件和目录,这些函数可以用来读取、写入、创建、删除文件等[^1]。开发者可以通过调用这些 API 来实现对 SD 或其他存储介质上的数据访问功能。 #### 二、开发环境准备 在开始使用 FatFs 前,需完成以下准备工作: - 下载并解压 FatFs 的官方源码包。 - 将 `/source` 文件夹下的核心源码加入到项目工程中。 - 配置硬件驱动程序(如 SPI 或 SDIO 接口),以便能够与外部存储器通信[^2]。 #### 三、配置选项 为了适应不同的应用场景,FatFs 支持多种编译时配置参数。主要集中在 `ffconf.h` 头文件里定义。例如: - 是否支持长文件名 (`_USE_LFN`) - 编码方式的选择 (UTF-8, Shift-JIS 等) - 同时打开的最大文件数限制 `_FS_LOCK` 调整好适合目标平台需求的各项设置之后再重新构建整个库即可生效。 #### 四、典型应用实例 下面给出一段简单的 C 语言代码片段展示如何初始化盘符以及执行基础文件 IO 操作: ```c #include "ff.h" /* Include FatFs module */ #include <string.h> /* Disk control interface functions prototype declaration here */ int main(void){ FRESULT fr; // Result code variable. FIL fil; // File object to be used by file function calls below. BYTE work[_MAX_SS]; // Work area required for disk I/O operations /* Initialize the filesystem on drive '0:' */ fr = f_mount(0, &work); if(fr != FR_OK){ // Handle error... } /* Create a new text file named TEST.TXT under root directory of volume 0:.*/ fr = f_open(&fil,"TEST.TXT",FA_CREATE_ALWAYS | FA_WRITE); if(fr == FR_OK){ const char* msg = "Hello World!"; UINT bw; fr = f_write(&fil,(const void*)msg,strlen(msg),&bw); if(bw != strlen(msg)){ // Write failed or partially completed. } f_close(&fil); }else{ // Failed opening file. } return 0; } ``` 此段代码展示了从挂载卷到最后关闭文件的一系列过程,并向新建的文本文件写入字符串 “Hello World!”。 #### 五、参考资料解析 除了上述实际编码指导之外,《documents》文件夹还提供了丰富的理论依据和技术细节解释材料;而《res》子目录则收录了一些具体的应用案例演示代码(app*.c),可供进一步学习参考[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值