当前位置: 首页 > news >正文

Cubemx+Fatfs(解决挂载Fatfs失败的问题)

一、基本思路

为了接入SD卡,需要启用SDMMC接口;为了通过串口进行数据显示,必须启用UART;为了进行文件系统管理,需要启用FATFS。

二、Cubemx操作步骤

1.选择好芯片

2.设置RCC为外部时钟

3.使能串口1(usart1)

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

4.使能SDMMC

笔者此处使用的芯片没有SDMMC,借用的SDIO的接口

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

使能SDMMC1中断,并在中断设置中设置中断优先级

设备优先级
SDMMC5
DMA6

此处必须使得SDMMC的中断优先级高于DMA,才可正常工作。

5、使能FATFS

此处参考链接选的 SD Card ,但此处笔者只有 User-Defined  这一个可以选。

6、时钟树设置

没有找到 给sdmmc的时钟

7、项目设置

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

生成代码  右上角GENERATE CODE

8、代码修改

1. 为方便的使用串口打印信息,所以找到uart.c,并在/* USER CODE BEGIN 0 */后添加如下代码用于重定义printf函数的输出口:

#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;
}

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

3. 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");                        //打印文件系统工作正常
    }

Debug

    FatFs[vol] = fs;                    /* Register new fs object */

    if (!fs || opt != 1) return FR_OK;    /* Do not mount now, it will be mounted later */

    res = find_volume(&path, &fs, 0);    /* Force mounted the volume */
    LEAVE_FF(fs, res);
}

FatFs[vol] = fs; /* 注册新的文件系统对象 */

if (!fs || opt != 1) return FR_OK; /* 不进行挂载,稍后挂载 */

res = find_volume(&path, &fs, 0); /* 强制挂载该卷 */
LEAVE_FF(fs, res);

这段代码的功能:

  1. 注册文件系统对象:将给定的 fs 对象(文件系统)与特定的卷关联,存储在 FatFs 数组中。
  2. 条件挂载卷:如果没有有效的文件系统对象(fs 为 NULL)或操作标志 opt 不为 1,则跳过挂载操作。
  3. 查找并挂载卷:如果条件符合,调用 find_volume() 查找与路径对应的卷并挂载它。
  4. 返回结果:操作结果保存在 res 中,LEAVE_FF() 用于处理和返回结果。

挂载前先格式化

    printf("\r\n ****** 文件系统 ******\r\n\r\n");
    /*格式化内存区*/
        // 格式化逻辑驱动器 0
    retSD = f_mkfs("0:", FM_FAT32, 0, work, sizeof(work));
    if (retSD != FR_OK) {
    处理格式化错误
            printf(" mkfs_err");
    }
 
    /*-1- 挂载文件系统*/

 

user_diskio.c

令Stat=0 磁盘状态设置为正常


 

MX_SDIO_MMC_Init()里初始化时手动改成1B

参考

STM32Cube的FATFS+SD卡_stm32l cube sd卡-CSDN博客

【CubeMX+STM32】SD卡 U盘文件系统 USB+FATFS_stm32 u盘 sd-CSDN博客


文章转载自:

http://OakQd4kZ.fgtLs.cn
http://l7Dg1QrZ.fgtLs.cn
http://43yaYV56.fgtLs.cn
http://bxtUrmB7.fgtLs.cn
http://w5uIVpZQ.fgtLs.cn
http://pnXZfwvS.fgtLs.cn
http://CYCH2oVv.fgtLs.cn
http://wGW5YwY9.fgtLs.cn
http://uLkj0Q3A.fgtLs.cn
http://00bXhaYQ.fgtLs.cn
http://qJzcxbAg.fgtLs.cn
http://ywnHtZkU.fgtLs.cn
http://yyVUWLqZ.fgtLs.cn
http://hAllNpdR.fgtLs.cn
http://tN86BLlm.fgtLs.cn
http://z6PS2AMJ.fgtLs.cn
http://qacjnjmW.fgtLs.cn
http://7cn5761t.fgtLs.cn
http://poHz68jP.fgtLs.cn
http://Cl3Ejnpu.fgtLs.cn
http://3nTuiLN9.fgtLs.cn
http://E64x0ATC.fgtLs.cn
http://6OA13AG1.fgtLs.cn
http://dwtBuIx2.fgtLs.cn
http://G5Hx7Y3D.fgtLs.cn
http://opumBP4x.fgtLs.cn
http://TCEGd4nF.fgtLs.cn
http://QYgOO8G1.fgtLs.cn
http://F9nwC33u.fgtLs.cn
http://EUV0YsLV.fgtLs.cn
http://www.dtcms.com/a/377450.html

相关文章:

  • UVa1063/LA3807 Marble Game
  • leetcode LCR 170.交易逆序对的总数
  • 【学习笔记】Https证书如何升级到国密
  • 期权行权期限一般多久?
  • 0基础Java学习过程记录——枚举、注解
  • 【C++】C++ 内存管理
  • C++ STL之list的使用
  • Midjourney绘画创作入门操作创作(宣传创意)
  • 【数据库约束】
  • 小白成长之路-centos7部署ceph存储
  • python学习进阶之面向对象(二)
  • 【芯片设计-信号完整性 SI 学习 1.1.1 -- Unit Interval,比特周期】
  • sudo apt update sudo apt upgrade -y 两个命令的作用
  • 每日算法刷题Day68:9.10:leetcode 最短路6道题,用时2h30min
  • apache详细讲解(apache介绍+apache配置实验+apache实现https网站)
  • 一些常用的激活函数及绘图
  • 第3节-使用表格数据-数据库设计
  • 同步时钟系统在体育场游泳馆的应用
  • QT里获取UUID当做唯一文件名称
  • 【Python】pytorch数据操作
  • iOS应用启动深度解析:dyld动态链接器的工作机制与优化实践
  • [硬件电路-175]:multisim中如何给让光电二极管产生光电流?
  • 小巧精准,安全无忧:安科瑞ADL200N-CT/D16-WF防逆流电表守护阳台光伏
  • NLP(自然语言处理, Natural Language Processing)
  • 【竞赛系列】机器学习实操项目07——全球城市计算AI挑战赛(baseline、时间序列分析、地铁流量预测)
  • 华为昇腾CANN开发实战:算子自定义与模型压缩技术指南
  • Java 多线程(二)
  • TCGA(The Cancer Genome Atlas)数据库是癌症基因组学研究的重要资源,包含了多种癌症类型的基因组、转录组、表观基因组和临床数据
  • 单片机与PLC:定义、异同及替代可能性解析
  • 金融知识:投资和融资