STM32Cube的FATFS+SD卡

最近两天由于之前研究的GPS+BD定位信息不只需要获取信息并显示,还需要对当时的信息进行存储,比如说我们在一个地方进行测量,测量人员记录了测量数值和位置,但是不免会出现错误,当然GPS出现错误也有可能,所以我们需要把每次测试的信息和位置同时记录一份,以便工作结束后数据比对校正。我的处理方式就是使用SD卡和FATFS搞定

首先要讲一点小知识
【SD卡根据其使用的系统规范】

系统规范版本 时钟
V3.31 1-20MHz
V4.2和V4.4 1-48MHz

这一点浪费了我一整天的时间在找问题(也怪我是个菜鸡,没有看完模块的说明就来干活,希望大家不要和我犯一样的错误)

今日目标

  1. 实现通过文件系统在SD卡根目录下创建一个名为“GPSSave.txt”的文本文档
  2. 在“GPSSave.txt”内写上“我就是那张SD卡,8G那张!!”
  3. 读取“GPSSave.txt”,将其内容写到串口上。

一、基本思路

  1. 需要接入SD卡,所以需要使能SDMMC
  2. 需要通过串口显示,需要使能UART
  3. 需要用文件系统管理,需要使能FATFS

二、操作步骤

1、根据自己的stm32的芯片型号来选择,我这里是STM32F767IGTx

在这里插入图片描述

2、选好芯片之后照旧设置RCC为外部时钟

在这里插入图片描述

3、使能串口1(usart1)

模式设为异步(Asynchronous)其他默认,波特率可以自己改,USART1为115200Bits/s,如图
在这里插入图片描述

4、使能SDMMC

模式设为SD 4 Bits Wide bus ,设置DMA,如图
在这里插入图片描述
使能SDMMC1中断
在这里插入图片描述
此处必须使得SDMMC的中断优先级高于DMA,才可正常工作,所以在中断设置中设置中断优先级

设备 优先级
SDMMC 5
DMA 6

在这里插入图片描述

5、使能FATFS

勾选SD Card,修改红框相应参数如图
在这里插入图片描述

6、时钟树设置

由于本人使用的SD卡系统规范的版本为V3.31所以需要保证SDMMC的时钟小于20MHz,如图:
在这里插入图片描述
之后下拉时钟树,找到SDMMC1的频率,修改时钟源为PLL48CLK,如图:
在这里插入图片描述

7、项目设置

有文件系统,堆栈改大一点0x1000
在这里插入图片描述
生成代码右上角GENERATE CODE

8、代码修改

  1. 为保证我们方便的使用串口打印信息,所以找到uart.c,并在/* USER CODE BEGIN 0 */后添加如下代码:
#include <stdio.h>
struct __FILE 
{ 
	int handle; 
}; 

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

用于重定义printf函数的输出口

  1. 在main.c函数中的/* USER CODE BEGIN PV */后添加如下定义
FATFS fs;                 //工作空间
FIL fil;                  // 文件项目
uint32_t byteswritten;    // 写文件计数
uint32_t bytesread;       // 读文件计数
uint8_t wtext[] = "我就是那张SD卡,8G那张!!"; // 写的内容
uint8_t rtext[1024];             // 读取的buff
char filename[] = "GPSSave.txt"; // 文件名
  1. 在main.c函数中的/* USER CODE BEGIN 2 */后添加如下代码:
printf("\r\n ****** 文件系统 ******\r\n\r\n");
 
    /*-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)															//返回值不为0(出现问题)
        printf(" open file error : %d\r\n",retSD);						//打印问题代码
    else
        printf(" open file sucess!!! \r\n");
     
    /*-3- 在txt文件中写入数据*/
    retSD = f_write(&fil, wtext, sizeof(wtext), (void *)&byteswritten);	//在文件内写入wtext内的内容
    if(retSD)															//返回值不为0(出现问题)
        printf(" write file error : %d\r\n",retSD);						//打印问题代码
    else
    {
        printf(" write file sucess!!! \r\n");
        printf(" write Data : %s\r\n",wtext);							//打印写入的内容
    }
     
    /*-4- 关闭txt文件*/
    retSD = f_close(&fil);												//关闭该文件
    if(retSD)															//返回值不为0(出现问题)
        printf(" close error : %d\r\n",retSD);							//打印问题代码
    else
        printf(" close sucess!!! \r\n");
     
    /*-5- 打开文件读取数据*/
    retSD = f_open(&fil, filename, FA_READ);							//打开文件,权限为只读
    if(retSD)															//返回值不为0(出现问题)
        printf(" open file error : %d\r\n",retSD);						//打印问题代码
    else
        printf(" open file sucess!!! \r\n");
     
    /*-6- 读取txt文件数据*/
    retSD = f_read(&fil, rtext, sizeof(rtext), (UINT*)&bytesread);		//读取文件内容放到rtext中
    if(retSD)															//返回值不为0(出现问题)
        printf(" read error!!! %d\r\n",retSD);							//打印问题代码
    else
    {
        printf(" read sucess!!! \r\n");
        printf(" read Data : %s\r\n",rtext);							//打印读取到的数据
    }
     
    /*-7- 关闭文件*/
    retSD = f_close(&fil);												//关闭该文件
    if(retSD)  															//返回值不为0(出现问题)
        printf(" close error!!! %d\r\n",retSD);							//打印问题代码
    else
        printf(" close sucess!!! \r\n");
     
    /*##-8- 读写一致性检测 ############*/
    if(bytesread == byteswritten)										//如果读写位数一致
    { 
        printf(" FatFs is working well!!!\r\n");						//打印文件系统工作正常
    }

编译、下载

三、结果验证

插上SD卡,打开串口调试助手并设置比特率等参数与串口1一致,上电
得到如下结果:
在这里插入图片描述
为保证我不是瞎搞的,现在来看看SD卡里的内容
在这里插入图片描述
文件名为:GPSSave.txt
打开后内容为:我就是那张SD卡,8G那张!!

到此试验成功。

		  Good Game!!!!!!

接下来会推出一系列的关于串口外设使用的分享,有需要的猿们敬请关注!!!!!

以上内容欢迎大家转载引用,标明出处即可!!!!!

发布了20 篇原创文章 · 获赞 53 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ASWaterbenben/article/details/100536926