打印
[应用相关]

STM32Cube的FATFS+SD卡

[复制链接]
652|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
目标

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


一、基本思路

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


使用特权

评论回复
沙发
guanjiaer|  楼主 | 2021-7-1 16:46 | 只看该作者
二、操作步骤
1、根据自己的stm32的芯片型号来选择,我这里是STM32F767IGTx



使用特权

评论回复
板凳
guanjiaer|  楼主 | 2021-7-1 16:47 | 只看该作者
2、选好芯片之后照旧设置RCC为外部时钟


使用特权

评论回复
地板
guanjiaer|  楼主 | 2021-7-1 16:47 | 只看该作者
3、使能串口1(usart1)

模式设为异步(Asynchronous)其他默认,波特率可以自己改,USART1为115200Bits/s,如图


使用特权

评论回复
5
guanjiaer|  楼主 | 2021-7-1 16:48 | 只看该作者
4、使能SDMMC

模式设为SD 4 Bits Wide bus ,设置DMA,如图


使能SDMMC1中断


此处必须使得SDMMC的中断优先级高于DMA,才可正常工作,所以在中断设置中设置中断优先级




使用特权

评论回复
6
guanjiaer|  楼主 | 2021-7-1 16:48 | 只看该作者
5、使能FATFS

勾选SD Card,修改红框相应参数如图


使用特权

评论回复
7
guanjiaer|  楼主 | 2021-7-1 16:49 | 只看该作者
6、时钟树设置

由于本人使用的SD卡系统规范的版本为V3.31所以需要保证SDMMC的时钟小于20MHz,如图:


之后下拉时钟树,找到SDMMC1的频率,修改时钟源为PLL48CLK,如图:


使用特权

评论回复
8
guanjiaer|  楼主 | 2021-7-1 16:49 | 只看该作者
7、项目设置

有文件系统,堆栈改大一点0x1000


生成代码右上角GENERATE CODE


使用特权

评论回复
9
guanjiaer|  楼主 | 2021-7-1 16:49 | 只看该作者
8、代码修改

为保证我们方便的使用串口打印信息,所以找到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函数的输出口



使用特权

评论回复
10
guanjiaer|  楼主 | 2021-7-1 16:50 | 只看该作者
在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"; // 文件名


使用特权

评论回复
11
guanjiaer|  楼主 | 2021-7-1 16:50 | 只看该作者
在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");                                                //打印文件系统工作正常
    }


编译、下载

使用特权

评论回复
12
guanjiaer|  楼主 | 2021-7-1 16:50 | 只看该作者
三、结果验证

插上SD卡,打开串口调试助手并设置比特率等参数与串口1一致,上电
得到如下结果:


使用特权

评论回复
13
guanjiaer|  楼主 | 2021-7-1 16:50 | 只看该作者
为保证我不是瞎搞的,现在来看看SD卡里的内容


文件名为:GPSSave.txt
打开后内容为:我就是那张SD卡,8G那张!!

到此试验成功。


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

4146

帖子

2

粉丝