微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > stm32 Fatfs 读写SD卡

stm32 Fatfs 读写SD卡

时间:11-26 来源:互联网 点击:

007#define F_READ 1 //测试从文件中读出数据

008#define F_UNLINK 0 //测试删除文件

009#define SCAN_FILES 1 //测试目录扫描

010

011FATFS fs;

012FRESULT res;

013FIL file;

014UINTbr;

015BYTEbuffer[4096];//以上变量作为全局变量 可以避免一些Bug

016

017intmain(void)

018{

019u16 i,n;

020

021

022//stm32 初始化

023RCC_Configuration();

024NVIC_Configuration();

025USART_Configuration();

026SPI_Configuration();

027GPIO_Configuration();

028

029

030//fatfs 操作

031

032f_mount(0, &fs);

033

034//如果data.txt存在,则打开;否则,创建一个新文件

035res = f_open(&file,"0:/data.txt",FA_OPEN_ALWAYS|FA_READ|FA_WRITE );

036

037if(res!=FR_OK)

038{

039printf("f_open() fail .. ");

040}else{

041printf("f_open() success .. ");

042}

043

044#if F_READ

045

046while(1){//使用f_read读文件

047res = f_read(&file, buffer, 1, &br);//一次读一个字节知道读完全部文件信息

048

049if(res == FR_OK )

050{

051printf("%s",buffer);

052}else{

053printf("f_read() fail .. ");

054}

055

056if(f_eof(&file)) {break;}

057}

058

059/*if( f_gets(buffer,sizeof(buffer),&file) != NULL) //使用f_gets读文件 ,存在 Bugs 待调试

060{

061printf("%s",buffer);

062}else{

063printf("f_gets() fail .. ");

064} */

065

066#endif

067

068#if F_PUTS

069

070//将指针指向文件末

071//res = f_lseek(&file,(&file)->fsize);

072res = f_lseek(&file,file.fsize);

073

074n = f_puts("hello dog ..", &file) ;//向文件末写入字符串

075

076if(n<1)//判断写是否成功

077{

078printf("f_puts() fail .. ");

079}else{

080printf("f_puts() success .. ");

081}

082

083#endif

084

085#if F_UNLINK

086

087res = f_unlink("test.jpg");//前提SD下存在一个test.jpg

088

089if(res!=FR_OK)

090{

091printf("f_unlink() fail .. ");

092}else{

093printf("f_unlink() success .. ");

094}

095

096#endif

097

098#if SCAN_FILES

099

100printf("the directory files : ");

101scan_files("/");//扫描根目录

102

103#endif

104

105f_close(&file);

106f_mount(0, NULL);

107

108while(1);

109}

110

111

112FRESULT scan_files (

113char* path/* Start node to be scanned (also used as work area) */

114)

115{

116FRESULT res;

117FILINFO fno;

118DIR dir;

119inti;

120char*fn;/* This function is assuming non-Unicode cfg. */

121#if _USE_LFN

122staticcharlfn[_MAX_LFN + 1];

123fno.lfname = lfn;

124fno.lfsize =sizeoflfn;

125#endif

126

127

128res = f_opendir(&dir, path);/* Open the directory */

129if(res == FR_OK) {

130i =strlen(path);

131for(;;) {

132res = f_readdir(&dir, &fno);/* Read a directory item */

133if(res != FR_OK || fno.fname[0] == 0)break;/* Break on error or end of dir */

134if(fno.fname[0] ==.)continue;/* Ignore dot entry */

135#if _USE_LFN

136fn = *fno.lfname ? fno.lfname : fno.fname;

137#else

138fn = fno.fname;

139#endif

140if(fno.fattrib & AM_DIR) {/* It is a directory */

141sprintf(&path[i],"/%s", fn);

142res = scan_files(path);

143if(res != FR_OK)break;

144path[i] = 0;

145}else{/* It is a file. */

146printf("%s/%s ", path, fn);

147}

148}

149}

150

151returnres;

152}

其中 目录扫描函数 scan_files( char * path) 参数格式如下:

这里使用到了f_puts()函数,所以必须在ffconf.h 中修改 #define _USE_STRFUNC 1

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top