基于STM32F407通过STM32CubeMX实现FATFS+SD卡多行存储

在实际的工程运用中,大多数都需要将获取的数据进行存储,防止数据的丢失以及后期的数据验证。

一、主要任务

1 配置FATFS实现在SD卡中创建TXT文件;
2 将数据分行写入SD卡的TXT文件中;
3 将写入的数据读出,并通过串口1打印出来。

二、执行步骤
1 选择芯片型号STM32F407ZG,可直接搜索,点击即可。
在这里插入图片描述
2 基本配置,设置RCC为外部时钟。
在这里插入图片描述
3 配置SYS。
在这里插入图片描述
4 STM32F407ZG的SD卡通过SDIO接入芯片,故需要配置SDIO。
在这里插入图片描述
5.1 配置FATFS,勾远SD Card;在Set Defines中进行如下修改。
在这里插入图片描述
5.2 配置Platform Solutions,设置PE2为输入模式–>点击System View–>点击GPIO,进行设置。
在这里插入图片描述
进入FATFS配置配置Platform Solutions。
在这里插入图片描述
6 配置串口1。
在这里插入图片描述
7 配置时钟树。
在这里插入图片描述
8 设置工程基本信息:工程名、工程位置 4、IDE、Linker Setting,并建议将.c和.h分开。

在这里插入图片描述
在这里插入图片描述
9 配置完成,生成代码,创建工程。

三、代码实现
1 配置串口1printf打印。在usart.c中添加如下代码:
#include <stdio.h>
struct __FILE
{
int handle;
};

FILE __stdout;
void _sys_exit(int x)
{
x = x;
}
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);
USART1->DR=(uint8_t)ch;
return ch;
}

2 通过fatfs函数进行文件创建、打开、写入、读取关闭等操作。
2.1创建变量
/xxxxxxxxxxxxxxxxxxxxxxxx存储变量xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/
FATFS fs; //工作空间
FIL fil; // 文件项目
uint32_t byteswritten; // 写文件计数
uint32_t bytesread; // 读文件计数
uint8_t wtext[10]; // 写的内容
uint8_t rtext[1024]; // 读取的buff
char filename[] = “温度.txt”; // 文件名
const uint8_t newline[]={0X0D,0X0A};//换行
/xxxxxxxxxxxxxxxxxxxxxxxxDS18B20变量xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/
uint8_t t=0;
short temperature;
2.2挂载文件系统并创建文件
void InitFatFas(void)
{
/-1- 挂载文件系统/
retSD = f_mount(&fs, “”, 0);
if(retSD)
{
printf(“mount error : %d \r\n”,retSD);
Error_Handler();
}
else
printf(“mount sucess!!! \r\n”);
/-2-创建新的文件/
retSD = f_open(&fil, filename, FA_CREATE_ALWAYS | FA_WRITE); //打开文件,权限包括创建、写(如果没有该文件,会创建该文件)
if(retSD==FR_OK) printf("\r\ncreater file sucess!!! \r\n");
else printf("\r\ncreater file error : %d\r\n",retSD);
f_close(&fil); //关闭该文件
HAL_Delay(100);
}

2.3 写入数据与读出,并通过printf打印、同时多行存入,避免数据覆盖。
此处存入文件数据来自于DS18B20的采集。
void FatFsTest(void)
{
HAL_Delay(1);
//周期性读取数据并存储
if(t%1000==0)//每1000ms读取一次
{
temperature=DS18B20_Get_Temp();
if(temperature<0)
{
temperature=-temperature; //转为正数
}
wtext[0]=’ ‘;
wtext[1]=(temperature/100)+48;
wtext[2]=((temperature%100)/10)+48;
wtext[3]=’.’;
wtext[4]=((temperature%100)%10)+48;
wtext[5]=‘C’;

/-2-创建新的文件并写入数据/

retSD = f_open(&fil, filename,FA_WRITE); //打开文件,权限包括创建、写(如果没有该文件,会创建该文件)
if(retSD==FR_OK) //返回值不为0(出现问题)
{
f_lseek(&fil,f_size(&fil));//将指针指向文件末尾
retSD=f_write(&fil,wtext, sizeof(wtext), (void *)&byteswritten); //写数据
if(retSD) printf("\r\nwrite file error : %d\r\n",retSD); //打印问题代码
else
{
printf("\r\nwrite file sucess!!! \r\n");
printf("\r\nwrite Data : %s\r\n",wtext); //打印写入的内容
}
f_write(&fil, newline,2, (void *)&byteswritten); //换行
f_close(&fil);
}
else printf(“open file error : %d\r\n”,retSD); //打印问题代码
}

}

四、下载验证
1 串口查看打印
在这里插入图片描述
2 SD卡查看
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/STM32F103ZET789/article/details/106889072