文章目录

  • 一、FATFS系统
    • 1、文件系统是什么?
    • 2、FATFS文件系统简介
    • 3、FATFS模块层次结构
    • 4、FATFS移植步骤
    • 5、FATFS常用函数
    • 6、数据写入SD卡软件实现流程图
  • 二、硬件配置
  • 三、常用TATFS代码
    • 1、读取某个文件并打印出来
    • 2、 文件系统的写操作
    • 3、编写格式化字符串
    • 4、目录扫描,获取文件夹下所有文件名称
    • 5、新建或删除子目录
    • 6、在某个目录下去查找某个文件
    • 7、从指定位置开始写文件
    • 8、读取一个字符串
    • 9、检查文件或子目录是否存在
    • 10、写入一个字符和字符串
  • 四、数据写入SD卡代码实现
    • 1、sd.c文件配置
    • 2、main.c文件配置

一、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-CacheMPU_Memory_Protection();        //保护相关存储区域HAL_Init();                     //初始化HAL库Stm32_Clock_Init(432,25,2,9);   //设置时钟,216Mhz delay_init(216);                //延时初始化uart_init(115200);                //串口初始化usmart_dev.init(108);            //初始化USMARTLED_Init();                     //初始化LEDKEY_Init();                     //初始化按键SDRAM_Init();                   //初始化SDRAMLCD_Init();                     //初始化LCDMY_ADC_Init();                  //初始化ADC1通道5 W25QXX_Init();                 //初始化W25Q256my_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);}

如有不足之处,欢迎多多交流!

STM32F767将数据写入SD卡相关推荐

  1. open failed: EACCES (Permission denied)权限已加,写入sd卡仍报错的解决办法

    不知道大家有没有碰到过这种情况,在运行虚拟机时,或者使用高版本的安卓手机时,即使是在清单文件中加了权限,向sd卡写入数据时还是会报错:open failed: EACCES (Permission d ...

  2. /storage/emulated/0 (Permission denied) 权限已开,写入sd卡仍报错的解决办法

    在运行虚拟机时,或者使用高版本的安卓手机时,即使是在清单文件中加了权限,向sd卡写入数据时还是会报错: 其实这个问题是由于Android6.0更新了权限机制,在6.0之前,写入sd卡权限只需在清单文件 ...

  3. dd与cp的区别,以及rootfs.ext4写入SD卡

    目录 1.dd与cp的区别 2.rootfs.ext4写入SD卡 1.dd与cp的区别 cp与dd的区别在于cp可能是以字节方式读取文件,而dd是以扇区方式记取.显然dd方式效率要高些. dd最大的用 ...

  4. android sd卡写入,Android写入SD卡文件夹

    Android写入SD卡文件夹 我正在使用以下代码从我的服务器下载一个文件,然后将其写入SD卡的根目录,所有这些都很好:package com.downloader;import java.io.Fi ...

  5. java卡写入_写入SD卡的权限

    问题 我希望我的应用程序将应用程序数据库存档到SD卡.在我的代码中,我检查目录canWrite()是否存在,如果不存在,则抛出anIOException.在这个特定的实例中,我试图将db文件复制到SD ...

  6. 最佳sd卡恢复数据软件/sd卡恢复照片软件

    你知道如何恢复从sd卡中删除的照片?在你已经格式化了你的SD卡,USB,或外部硬盘的情况下,有一个方法可以恢复你的数据,就是通过数据恢复软件.继续阅读本文了解一下有那些软件可以用它来找回你的照片吧. ...

  7. sd卡怎么恢复数据?sd卡照片恢复,只需1个方法就能做到?

    sd卡照片恢复怎么做?sd卡是什么?恐怕我们能想到的就是手机上的内存卡,但其实sd卡只是内存卡中的其中一种,其作用自然就是存储数据而存在,别看体型不大,能存储的东西可不是一般的多. sd卡有几种? 我 ...

  8. 解决安卓系统写入SD卡权限问题

    1.需要用户手动赋予的权限( Dangerous Permissions) 所属权限组 权限 日历 READ_CALENDAR 日历 WRITE_CALENDAR 相机 CAMERA 联系人 READ ...

  9. Android 截屏并写入SD卡中

    -----------截屏方法 View Code private Bitmap shot() { View views = getWindow().getDecorView();views.buil ...

最新文章

  1. 在Eclipse中使用Maven构建Spring项目
  2. python语言能干什么-python语言都可以做什么
  3. Android实训日志:基于外部存储的音乐播放器V06
  4. 使用mspaint查看图片像素
  5. Docker安装与镜像,容器命令管理
  6. ES6新特性之Generator函数
  7. PWN-COMPETITION-HGAME2022-Week4
  8. CentOS7环境下搭建ElasticSearch
  9. PyTorch学习笔记(四):PyTorch基础实战
  10. flutter自定义View(CustomPainter) 之 canvas的方法总结
  11. Tap titans乐趣
  12. android实战:密码箱三
  13. 3.深入了解listen函数
  14. <2021SC@SDUSC>【Overload游戏引擎】OvCore源码模块分析(三)——GlobalHelpers
  15. Mybatis入门 基于XML实现增删改查(包含动态SQL标签的使用)
  16. 2021年秋招面经分享·平头哥【芯片设计/验证/DFT工程师】
  17. wpf 字体模糊_WPF Effect 造成的字体模糊
  18. 数据安全法等相关法律等的归纳小结
  19. 【“鲸智搭”入驻钉钉应用市场!三步走,教你轻松搭建流程表单】
  20. 11.XGBoost

热门文章

  1. 简练网软考知识点整理-项目风险审计及风险评估
  2. 2022年5月8日 解决手机连接电脑无法选择“传输文件”
  3. mysql经常断电_MySQL突然断电异常解决
  4. 1.1根据应收账款明细计算下个付息日的应计利息
  5. 第三十四章 数论——高斯消元解线性方程组
  6. 统计表格中有内容的个数(COUNTA)
  7. Nutch 2.0 终于来了
  8. 86张脑图,一口气看完 React,想学React的看过来,React知识图谱汇总
  9. 利用签协议机会,字节跳动90后员工内幕交易
  10. 嵌入式 新建基于固件库的MDK5工程模板