文章目录
一、FATFS系统
1、文件系统是什么?
负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。即在磁盘上组织文件的方法。
2、FATFS文件系统简介
3、FATFS模块层次结构
4、FATFS移植步骤
5、FATFS常用函数
FATFS的源码,大家可以在这个网站上下载到:
http://elm-chan.org/fsw/ff/00index_e.html
里面有常用函数的讲解、应用和示例。
6、数据写入SD卡软件实现流程图
二、硬件配置
单片机:STM32F767IGT6
SD卡: 8G金士顿内存卡一张,卡套一个
三、常用TATFS代码
1、读取某个文件并打印出来
void printffile(u8 * filepath) //读取某个文件并打印出来
{
u8 fdatas[1000];
u32 size=0;
fr=f_open(&fileobj,(const TCHAR*)filepath,FA_READ|FA_WRITE); //打开文件
if(fr==FR_OK) //判断是否正确打开
{
size=f_size(&fileobj); // 定义文件大小
f_read(&fileobj,fdatas,size,&brs); //读文件数据(不分类型)
}
f_close(&fileobj); //关闭文件
printf("----------------------\r\n");
printf("File Path : %s \r\n",filepath); //卡相对地址
printf("File Content :%s\r\n",fdatas);
printf("----------------------\r\n");
}
2、 文件系统的写操作
void testWrite(u8 * filepath,u8 * datas,u32 length) //文件系统的写操作 (未指定从什么地址开始写,默认开头)
{
fr=f_open(&fileobj,(const TCHAR*)filepath,FA_READ|FA_WRITE); //打开文件
if(fr==FR_OK)//判断是否正确打开
{
f_write(&fileobj,datas,length,&brs); //写操作(从文件最开头开始写)
}
f_close(&fileobj); //关闭文件
printffile(filepath);
}
3、编写格式化字符串
void testFprintf(u8 * filepath) //测试:编写格式化字符串
{
fr=f_open(&fileobj,(const TCHAR*)filepath,FA_READ|FA_WRITE); //打开文件
f_printf(&fileobj, "%d", 1234); /* "1234" */ //f_printf~编写格式化字符串
f_printf(&fileobj, "%6d,%3d%%", -200, 5); /* " -200, 5%" */
f_printf(&fileobj, "%ld", 12345L); /* "12345" */
f_close(&fileobj); //关闭文件
printffile(filepath);
}
4、目录扫描,获取文件夹下所有文件名称
void testDirScan(u8 * dirpath) //目录扫描,获取文件夹下所有文件名称
{
int index=0;
f_opendir(&dirobj,(const TCHAR*)dirpath); //打开一个目录
if(fr==FR_OK)//判断是否正确打开
{
while(1) //目录遍历
{
f_readdir(&dirobj,&fileinfoobj); //读目录项
if(fr!=FR_OK||fileinfoobj.fname[0]==0) break;
printf("filename %d = %s\r\n",index,(u8 *)fileinfoobj.fname); //将读取的目录项打印
index++;
}
}
f_closedir(&dirobj);//关闭打开的目录
}
5、新建或删除子目录
void testMK_UNlinkDir(void)
{
// f_mkdir("0:/zhang"); //新建一个子目录
f_unlink("0:/zhang/通道0.txt"); //删除文件或子目录
f_unlink("0:/zhang/通道1.txt");
f_unlink("0:/zhang/通道2.txt");
f_unlink("0:/zhang/通道3.txt");
f_mkdir("0:/zhang/通道0.txt");
f_mkdir("0:/zhang/通道1.txt");
f_mkdir("0:/zhang/通道2.txt");
f_mkdir("0:/zhang/通道3.txt");
// f_mkdir("0:/zhang/通道5.txt");
testDirScan("0:/zhang");
// f_unlink("0:/AAAA/CCCC"); //删除文件或子目录
// testDirScan("0:/AAAA");
//
// f_rename("0:/AAAA/BBBB","0:/AAAA/BBCC"); //重命名/移动文件或子目录
//
//
// testDirScan("0:/zhang");
}
6、在某个目录下去查找某个文件
void testfindFirst(u8 * dirpath,u8 * filenamePattern) //在某个目录下去查找某个文件
{
/*注意,这两个函数使用,必须设置ffconf.h里面的_USE_FIND标识符的值为1 ,也就是:#define _USE_FIND 1 */
fr=f_findfirst(&dirobj,&fileinfoobj,(const TCHAR*)dirpath,(const TCHAR*)filenamePattern);
while (fr==FR_OK&&fileinfoobj.fname[0])
{
printf("matched:%s\r\n",fileinfoobj.fname); //打开目录并读取匹配第一个项
fr= f_findnext(&dirobj,&fileinfoobj); //Read a next item matched 读下一个项进行匹配
}
f_closedir(&dirobj);//关闭打开的目录
}
7、从指定位置开始写文件
void testSeek(u8 * filepath,u32 index,u8 *datas,u32 length)
{
fr=f_open(&fileobj,(const TCHAR*)filepath,FA_READ|FA_WRITE); //打开文件
f_lseek(&fileobj,index); //移动文件指针,从指定位置开始操作
fr=f_write(&fileobj,datas,length,&brs);
f_close(&fileobj); //关闭文件
// printffile(filepath);
}
8、读取一个字符串
void testGets(u8 * filepath)
{
u8 fdatas[255];
u32 size=0;
fr=f_open(&fileobj,(const TCHAR*)filepath,FA_READ|FA_WRITE); //打开文件
size=f_size(&fileobj);
f_gets((TCHAR*)fdatas,size,&fileobj); //读取一个字符串
f_close(&fileobj); //关闭文件
printf("Test Gets:%s \r\n",fdatas);
}
9、检查文件或子目录是否存在
void testStat(u8 * filepath)
{
fr=f_stat((const TCHAR*)filepath,&fileinfoobj); //检查文件或子目录是否存在
switch (fr)
{
case FR_OK:
printf("filename=%s,size:%1u\r\n",fileinfoobj.fname,fileinfoobj.fsize);
break;
case FR_NO_FILE:
printf("File not exist!");
break;
default:
printf("Error!");
break;
}
}
10、写入一个字符和字符串
void testPutsPutc(u8 * filepath,u8 *sDatas,u8 cdata)
{
fr=f_open(&fileobj,(const TCHAR*)filepath,FA_READ|FA_WRITE); //打开文件
f_puts((const TCHAR*)sDatas,&fileobj); // 写一个字符串
f_putc((TCHAR)cdata,&fileobj); //写一个字符
f_close(&fileobj); //关闭文件
printffile(filepath);
}
四、数据写入SD卡代码实现
1、sd.c文件配置
注意:运行本程序的前提是工程已经移植好TATFS文件系统
/****************************
*
* 本程序的主要功能是将采集到的数据存入SD卡
*
****************************/
#include "sd.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "sdram.h"
#include "w25qxx.h"
#include "nand.h"
#include "mpu.h"
#include "sdmmc_sdcard.h"
#include "usmart.h"
#include "malloc.h"
#include "ftl.h"
#include "ff.h"
#include "exfuns.h"
#include "adc.h"
#define M 4096 //定义M
#define N 4
extern float temp[N][M];
//float Temp[N][M]={{1.256,2.589,3.457},{4.256,5.589,6.457}};
FIL fileobj;
FRESULT fr;
UINT brs;
DIR dirobj;
FILINFO fileinfoobj;
void Write_SD(void)
{
int i=0,j=0;
u8 s[10];
char* item;
u32 a;
const u8 newline[]={0X0D,0X0A};
for (i=0;i<N;i++)
{
switch (i) //判断写入那个文件
{
case 0:
item ="0:/zhang/通道0.txt";
break;
case 1:
item ="0:/zhang/通道1.txt";
break;
case 2:
item ="0:/zhang/通道2.txt";
break;
case 3:
item ="0:/zhang/通道3.txt";
break;
default:
item ="0:/zhang/通道4.txt";
break;
}
fr=f_open(&fileobj,(const TCHAR*)item,FA_READ|FA_WRITE); //打开文件
if(fr==FR_OK)//判断是否正确打开
{
for (j=0;j<M;j++)
{
a=12*j;
sprintf((char*)s, "%.6f", temp[i][j]);
f_lseek(&fileobj,f_size(&fileobj));
f_write(&fileobj,(u8*)s,9,&brs); //写数据
f_lseek(&fileobj,f_size(&fileobj)); //将指针指向文件末尾
f_write(&fileobj, newline,2, &brs); //换行
f_lseek(&fileobj,f_size(&fileobj));
}
}
f_close(&fileobj); //关闭文件
}
printffile("0:/zhang/通道0.txt");
printffile("0:/zhang/通道1.txt");
printffile("0:/zhang/通道2.txt");
printffile("0:/zhang/通道3.txt");
printffile("0:/zhang/通道4.txt");
}
2、main.c文件配置
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "lcd.h"
#include "sdram.h"
#include "w25qxx.h"
#include "nand.h"
#include "mpu.h"
#include "sdmmc_sdcard.h"
#include "usmart.h"
#include "malloc.h"
#include "ftl.h"
#include "ff.h"
#include "exfuns.h"
#include "sd.h"
#include "adc.h"
FATFS fatsd;
FATFS fatflash;
FATFS fatnand;
int main(void)
{
u8 res=0;
Cache_Enable(); //打开L1-Cache
MPU_Memory_Protection(); //保护相关存储区域
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(432,25,2,9); //设置时钟,216Mhz
delay_init(216); //延时初始化
uart_init(115200); //串口初始化
usmart_dev.init(108); //初始化USMART
LED_Init(); //初始化LED
KEY_Init(); //初始化按键
SDRAM_Init(); //初始化SDRAM
LCD_Init(); //初始化LCD
MY_ADC_Init(); //初始化ADC1通道5
W25QXX_Init(); //初始化W25Q256
my_mem_init(SRAMIN); //初始化内部内存池
my_mem_init(SRAMEX); //初始化外部内存池
my_mem_init(SRAMDTCM); //初始化CCM内存池
POINT_COLOR=RED;
LCD_ShowString(30,50,200,16,16,"Apollo STM32F7");
LCD_ShowString(30,70,200,16,16,"FATFS TEST");
LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(30,110,200,16,16,"2019/4/19");
while(SD_Init())//检测不到SD卡
{
LCD_ShowString(30,150,200,16,16,"SD Card Error!");
delay_ms(500);
LCD_ShowString(30,150,200,16,16,"Please Check! ");
delay_ms(500);
LED0_Toggle;//DS0闪烁
}
FTL_Init();
exfuns_init(); //为fatfs相关变量申请内存
f_mount(&fatsd,"0:",1); //挂载SD卡
res=f_mount(&fatflash,"1:",1); //挂载FLASH.
res=f_mount(&fatnand,"2:",1); //挂载NAND FLASH.
// task_adc();
Write_SD();
while (1);
// delay_ms(500);
}
如有不足之处,欢迎多多交流!