STM32
直播中

刘燕

7年用户 1330经验值
私信 关注
[问答]

如何通过文件系统在SD卡根目录下创建一个名为“GPSSave.txt”的文本文档?

如何通过文件系统在SD卡根目录下创建一个名为“GPSSave.txt”的文本文档?

回帖(1)

李维嘉

2021-10-22 10:48:06
最近两天由于之前研究的GPS+BD定位信息不只需要获取信息并显示,还需要对当时的信息进行存储,比如说我们在一个地方进行测量,测量人员记录了测量数值和位置,但是不免会出现错误,当然GPS出现错误也有可能,所以我们需要把每次测试的信息和位置同时记录一份,以便工作结束后数据比对校正。我的处理方式就是使用SD卡和FATFS搞定
首先要讲一点小知识
【SD卡根据其使用的系统规范】
[tr]系统规范版本时钟[/tr]
V3.311-20MHz
V4.2和V4.41-48MHz
这一点浪费了我一整天的时间在找问题(也怪我是个菜鸡,没有看完模块的说明就来干活,希望大家不要和我犯一样的错误)
今日目标


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

一、基本思路



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

二、操作步骤

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






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






3、使能串口1(usart1)

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





4、使能SDMMC

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





使能SDMMC1中断





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





5、使能FATFS

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





6、时钟树设置

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





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





7、项目设置

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





生成代码右上角GENERATE CODE

8、代码修改
为保证我们方便的使用串口打印信息,所以找到uart.c,并在/* USER CODE BEGIN 0 */后添加如下代码:
#include
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函数的输出口


在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"; // 文件名


在main.c函数中的/* USER CODE BEGIN 2 */后添加如下代码:
printf("rn ****** 文件系统 ******rnrn");

    /*-1- 挂载文件系统*/
    retSD = f_mount(&fs, "", 0);
    if(retSD)
    {
        printf(" mount error : %d rn",retSD);
        Error_Handler();
    }
    else
        printf(" mount sucess!!! rn");
     
    /*-2-创建新的文件并写入数据*/
    retSD = f_open(&fil, filename, FA_CREATE_ALWAYS | FA_WRITE);                //打开文件,权限包括创建、写(如果没有该文件,会创建该文件)
    if(retSD)                                                                                                                        //返回值不为0(出现问题)
        printf(" open file error : %drn",retSD);                                                //打印问题代码
    else
        printf(" open file sucess!!! rn");
     
    /*-3- 在txt文件中写入数据*/
    retSD = f_write(&fil, wtext, sizeof(wtext), (void *)&byteswritten);        //在文件内写入wtext内的内容
    if(retSD)                                                                                                                        //返回值不为0(出现问题)
        printf(" write file error : %drn",retSD);                                                //打印问题代码
    else
    {
        printf(" write file sucess!!! rn");
        printf(" write Data : %srn",wtext);                                                        //打印写入的内容
    }
     
    /*-4- 关闭txt文件*/
    retSD = f_close(&fil);                                                                                                //关闭该文件
    if(retSD)                                                                                                                        //返回值不为0(出现问题)
        printf(" close error : %drn",retSD);                                                        //打印问题代码
    else
        printf(" close sucess!!! rn");
     
    /*-5- 打开文件读取数据*/
    retSD = f_open(&fil, filename, FA_READ);                                                        //打开文件,权限为只读
    if(retSD)                                                                                                                        //返回值不为0(出现问题)
        printf(" open file error : %drn",retSD);                                                //打印问题代码
    else
        printf(" open file sucess!!! rn");
     
    /*-6- 读取txt文件数据*/
    retSD = f_read(&fil, rtext, sizeof(rtext), (UINT*)&bytesread);                //读取文件内容放到rtext中
    if(retSD)                                                                                                                        //返回值不为0(出现问题)
        printf(" read error!!! %drn",retSD);                                                        //打印问题代码
    else
    {
        printf(" read sucess!!! rn");
        printf(" read Data : %srn",rtext);                                                        //打印读取到的数据
    }
     
    /*-7- 关闭文件*/
    retSD = f_close(&fil);                                                                                                //关闭该文件
    if(retSD)                                                                                                                          //返回值不为0(出现问题)
        printf(" close error!!! %drn",retSD);                                                        //打印问题代码
    else
        printf(" close sucess!!! rn");
     
    /*##-8- 读写一致性检测 ############*/
    if(bytesread == byteswritten)                                                                                //如果读写位数一致
    {
        printf(" FatFs is working well!!!rn");                                                //打印文件系统工作正常
    }


编译、下载
三、结果验证

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





为保证我不是瞎搞的,现在来看看SD卡里的内容





文件名为:GPSSave.txt
打开后内容为:我就是那张SD卡,8G那张!!
到此试验成功。
                  Good Game!!!!!!接下来会推出一系列的关于串口外设使用的分享,有需要的猿们敬请关注!!!!! 以上内容欢迎大家转载引用,标明出处即可!!!!!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分