STM32F767将数据写入SD卡
文章目录
- 一、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卡相关推荐
- open failed: EACCES (Permission denied)权限已加,写入sd卡仍报错的解决办法
不知道大家有没有碰到过这种情况,在运行虚拟机时,或者使用高版本的安卓手机时,即使是在清单文件中加了权限,向sd卡写入数据时还是会报错:open failed: EACCES (Permission d ...
- /storage/emulated/0 (Permission denied) 权限已开,写入sd卡仍报错的解决办法
在运行虚拟机时,或者使用高版本的安卓手机时,即使是在清单文件中加了权限,向sd卡写入数据时还是会报错: 其实这个问题是由于Android6.0更新了权限机制,在6.0之前,写入sd卡权限只需在清单文件 ...
- dd与cp的区别,以及rootfs.ext4写入SD卡
目录 1.dd与cp的区别 2.rootfs.ext4写入SD卡 1.dd与cp的区别 cp与dd的区别在于cp可能是以字节方式读取文件,而dd是以扇区方式记取.显然dd方式效率要高些. dd最大的用 ...
- android sd卡写入,Android写入SD卡文件夹
Android写入SD卡文件夹 我正在使用以下代码从我的服务器下载一个文件,然后将其写入SD卡的根目录,所有这些都很好:package com.downloader;import java.io.Fi ...
- java卡写入_写入SD卡的权限
问题 我希望我的应用程序将应用程序数据库存档到SD卡.在我的代码中,我检查目录canWrite()是否存在,如果不存在,则抛出anIOException.在这个特定的实例中,我试图将db文件复制到SD ...
- 最佳sd卡恢复数据软件/sd卡恢复照片软件
你知道如何恢复从sd卡中删除的照片?在你已经格式化了你的SD卡,USB,或外部硬盘的情况下,有一个方法可以恢复你的数据,就是通过数据恢复软件.继续阅读本文了解一下有那些软件可以用它来找回你的照片吧. ...
- sd卡怎么恢复数据?sd卡照片恢复,只需1个方法就能做到?
sd卡照片恢复怎么做?sd卡是什么?恐怕我们能想到的就是手机上的内存卡,但其实sd卡只是内存卡中的其中一种,其作用自然就是存储数据而存在,别看体型不大,能存储的东西可不是一般的多. sd卡有几种? 我 ...
- 解决安卓系统写入SD卡权限问题
1.需要用户手动赋予的权限( Dangerous Permissions) 所属权限组 权限 日历 READ_CALENDAR 日历 WRITE_CALENDAR 相机 CAMERA 联系人 READ ...
- Android 截屏并写入SD卡中
-----------截屏方法 View Code private Bitmap shot() { View views = getWindow().getDecorView();views.buil ...
最新文章
- 在Eclipse中使用Maven构建Spring项目
- python语言能干什么-python语言都可以做什么
- Android实训日志:基于外部存储的音乐播放器V06
- 使用mspaint查看图片像素
- Docker安装与镜像,容器命令管理
- ES6新特性之Generator函数
- PWN-COMPETITION-HGAME2022-Week4
- CentOS7环境下搭建ElasticSearch
- PyTorch学习笔记(四):PyTorch基础实战
- flutter自定义View(CustomPainter) 之 canvas的方法总结
- Tap titans乐趣
- android实战:密码箱三
- 3.深入了解listen函数
- <2021SC@SDUSC>【Overload游戏引擎】OvCore源码模块分析(三)——GlobalHelpers
- Mybatis入门 基于XML实现增删改查(包含动态SQL标签的使用)
- 2021年秋招面经分享·平头哥【芯片设计/验证/DFT工程师】
- wpf 字体模糊_WPF Effect 造成的字体模糊
- 数据安全法等相关法律等的归纳小结
- 【“鲸智搭”入驻钉钉应用市场!三步走,教你轻松搭建流程表单】
- 11.XGBoost