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