各位朋友:
发这个帖子的时候刚开始学习FATFS,很多地方不懂,结果无人回答,我决定将自己学习的过程中遇到的问题记录下来,希望对遇到问题的朋友能够有点帮助!
1 我根据张洋大哥提供的FATFS R0.08的样例工程文件实现了最基本的文件创建,读文件夹中的文件.(SD卡驱动是根据原子哥的驱动程序,未做任何修改)
http://www.openedv.com/posts/list/383.htm#1488 不过要将LCD初始化程序的背光打开,将0改为1. http://www.ourdev.cn/bbs/bbs_content.jspbbs_sn=4810784&bbs_page_no=1&search_mode=3&search_text=zhaofeng2008&bbs_id=9999 这个资料也可以参考一下
2 学习一下FATFS的源码分析(源码用sourcr insight读很方便),了解基本结构http://www.61ic.com/Article/TIARM/Stellaris/201109/37570.html(可以作为参考)
3 学习了如何全部显示文件列表 FRESULT scan_files (char* path);
4 如何读写数据
以上基本就是现在为止学习的内容,后续会继续完善.源码将会陆续上传,现将已经实现的功能主程序上传.
程序基本功能描述: 开发板:原子哥MINI STM32开发板
KEY0 根据RTC提供的日期 时间创建文件夹及文件,若无当天的文件夹则创建文件夹,若有当天的文件夹则根据时间
创建文件
KEY1 向当天文件夹下最后创建的那个文件写数据
WAKE_UP 读当天文件夹下最后创建的那个文件的数据,并通过串口调试助手显示
#include <stm32f10x_lib.h>
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "mmc_sd.h"
#include "ff.h"
#include "integer.h"
#include "diskio.h"
#include "lcd.h"
#include "rtc.h"
#include "key.h"
#include "string.h"
u16 i;
FATFS fs;
FRESULT res;
FILINFO fileInfo;
UINT br,bw;
UINT r=1;
DIR dir;
FIL fsrc;
char buffer[512];
char trs[7]={"hello!"};
char dir_path[25]={" "};
char file_path[25]={" "};
char file_path1[25]={" "};
void convert (char *a,u32 n);
FRESULT scan_files (char* path);
void Write_file(char *dir_path,char *file_path);
void Read_file(char *dir_path,char *file_path);
u8 Create_files (char *dir_path,char *file_path);
int main(void){
u8 t;
Stm32_Clock_Init(9);//系统时钟设置
delay_init(72); //延时初始化
LCD_Init();
RTC_Init();
KEY_Init();
uart_init(72,9600);
  OINT_COLOR=RED;
LCD_ShowString(17,30,"MINISTM32 FATFS Test!");
while(1){
t=KEY_Scan();
res = f_mount(0, &fs);
if(t){
switch(t){
case 1: Create_files(dir_path,file_path);
scan_files(dir_path);
break;
case 2: Write_file(dir_path,file_path);
break;
case 3: Read_file(dir_path,file_path);
break;
}
}
f_mount(0,NULL);
}
}
//数字转化为字符串
void convert (char *a,u32 n)
{
int count=1;
int i,j;
int temp=n;
while((temp=temp/10) !=0)
{
count++;
}
for(i=count;i>=1;i--)
{
temp=n;
for(j=1;j<i;j++)
{
temp=temp/10;
}
*a=temp%10+'0';
a++;
}
}
//扫描文件夹下所有文件并显示
FRESULT scan_files (char* path)
{
FRESULT res;
FILINFO fno;
DIR dir;
int i,j,k;
char *fn;
#if _USE_LFN
static char lfn[_MAX_LFN * (_DF1S ? 2 : 1) + 1];
fno.lfname = lfn;
fno.lfsize = sizeof(lfn);
#endif
res = f_opendir(&dir, path);
if (res == FR_OK) {
i = strlen(path);
for (;;) {
res = f_readdir(&dir, &fno);
if (res != FR_OK || fno.fname[0] == 0) break;
if (fno.fname[0] == '.') continue;
#if _USE_LFN
fn = *fno.lfname ? fno.lfname : fno.fname;
#else
fn = fno.fname;
#endif
if (fno.fattrib & AM_DIR) {
LCD_ShowString(17,90,(u8 *)path);
res = scan_files(path);
if (res != FR_OK) break;
path = 0;
} else {
LCD_ShowString(17,90,(u8 *)path);
LCD_ShowString(17+j*100,110+k*20,(u8 *)fn);
j++;
if(j==2){
k++;
j=0;
}
}
}
}
return res;
}
//创建文件夹路径和文件路径
u8 Create_files(char *dir_path,char *file_path)
{
u32 Date,Time;
char string0[25]={"0:/"}; //根目录
char string1[15]={" "}; //日期目录
char string2[3]={"/"};
char string3[15]={" "}; //时间
char string4[5]={".txt"};
Date=timer.w_year*10000+timer.w_month*100+timer.w_date; //获取日期
convert(string1,Date); //日期转换为字符串
Time=timer.hour*10000+timer.min*100+timer.sec; //获取时间
convert(string3,Time); //时间转换为字符串
strcat(string0,string1); //合成文件夹路径
strcpy(dir_path,string0);
strcat(string0,string2); //合成文件路径
strcat(string3,string4);
strcat(string0,string3);
strcpy(file_path,string0);
res = f_mkdir((TCHAR *)dir_path); //创建目录
LCD_ShowString(17,50,"Create new dir !");
if(res==FR_EXIST){ //如果目录存在,根据时间创建文件
res = f_open(&fsrc,(TCHAR *)file_path, FA_OPEN_ALWAYS); //文件不存在则创建新文件
LCD_ShowString(17,50,"Create new file !");
f_close(&fsrc); //关闭文件
}
return 0;
}
//向文件内写数据
void Write_file(char *dir_path,char *file_path)
{
res=f_opendir(&dir,(TCHAR*)dir_path);
res = f_open(&fsrc,(TCHAR *)file_path, FA_OPEN_ALWAYS | FA_WRITE);
f_lseek(&fsrc,fsrc.fsize); //移动指针
f_write(&fsrc,&trs,sizeof(trs),&bw); //写数据
LCD_ShowString(17,70,"Write data over!");
f_close(&fsrc);
}
//读文件内数据
void Read_file(char *dir_path,char *file_path)
{
int i;
res=f_opendir(&dir,(TCHAR*)dir_path);
res = f_open(&fsrc,(TCHAR *)file_path, FA_OPEN_EXISTING | FA_READ);
printf("\nReceive data: \n");
for (;;) {
res = f_read(&fsrc, buffer, sizeof(buffer), &br);
if (res || br == 0) break; // error or eof
for( i = 0; i < br; ++i )
printf("%c",buffer);
printf("\n");
}
LCD_ShowString(17,70,"Read data over!");
f_close(&fsrc);
}
|