STM32挂载SD卡基于Fatfs文件系统读取文件信息

news2024/12/25 23:47:18

STM32挂载SD卡基于Fatfs文件系统读取文件信息


  • 🔖本例程基于正点原子标准库修改而来。

  • 📍FatFs 相关API函数网站:http://elm-chan.org/fsw/ff/00index_e.html

  • 🌴分别测试了SD卡模块以及Mini SD卡模块。

  • 🌿STM32f1单片机和TF卡、SD卡连接采用SPI通讯方式。

  • SD模块:
    在这里插入图片描述

  • Mini SD卡模块:
    在这里插入图片描述

  • 👉🏻如果需要采用SDIO驱动方式,那么需要采用下面这种引出D0 和D1引脚的模块。
    在这里插入图片描述

  • 🍁2GBSD卡内容读取:
    在这里插入图片描述

  • 120MB的读取TF卡读取:
    在这里插入图片描述

🛠接线说明

TF卡/SD卡 ----STM32F1
CS  ------  PA3
SCK ------ PA5
MOSI ------ PA7
MISO ------ PA6

📑fatfs文件系统读取目录文件说明

  • 🌿如果仅仅是读取根目录下的文件,只需包含fatfs文件系统下的fattester.h头文件,调用mf_scan_files(u8 * path)函数。
  • 🌿遍历所有目录文件,调用scan_files(char* path)

📝主程序代码

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
//#include "lcd.h"
#include "key.h"
#include "usmart.h"
#include "malloc.h"
#include "MMC_SD.h"
#include "ff.h"
#include "exfuns.h"
#include "fattester.h"
#include "String.h"

FRESULT scan_files(char* path)
{
    FRESULT res; //定义结果对象
    DIR dir; //定义目录对象

    UINT i; //定义变量
    static FILINFO fno; //定义静态文件信息结构对象
    res = f_opendir(&dir, (const TCHAR*)path);  //打开目录,返回状态 和 目录对象的指针
    if(res == FR_OK) //打开成功
    {
        for(;;) //遍历
        {
            res = f_readdir(&dir, &fno); //读取目录,返回状态 和 文件信息的指针
            if(res != FR_OK || fno.fname[0] == 0)
                break; //若打开失败 或 到结尾,则退出
            if(fno.fattrib & AM_DIR) //判断是文件夹
            {
                i = strlen(path); //获取原目录长度
                sprintf(&path[i], "/%s", fno.fname); //将新目录添加在原目录后面
                printf("目录::%s \r\n", path);
                res = scan_files(path); //将新目录进行递归调用
                if(res != FR_OK) break; //打开失败则退出
                path[i] = 0;
            }
            else
            {
                printf(":%s/%s \r\n", path, fno.fname); //是文件
            }
        }
    }
    else
    {
        printf("失败 - %s", &res); //打开失败
    }
    f_closedir(&dir); //关闭目录
    return res; //返回状态
}

int main(void)
{
    u32 total, free;
    u8 Path1[] = "0:";
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
    delay_init();	    	 //延时函数初始化
    uart_init(9600);	 	//串口初始化为9600
    exfuns_init();		//为fatfs相关变量申请内存
//	LCD_Init();			//初始化液晶
    LED_Init();         //LED初始化
    usmart_dev.init(72);
    mem_init();			//初始化内存池
    while(SD_Initialize())					//检测SD卡
    {
        delay_ms(200);
        LED0 = !LED0; //PA8闪烁
        printf("SD NO Fount! \r\n");
    }
    exfuns_init();							//为fatfs相关变量申请内存
    f_mount(fs[0], " ", 0); 		//挂载SD、TF卡,第一个形参必须是fs[0],第三个形参可以是0或1
//    f_mount(fs[1], "1:", 1); 	//挂载FLASH.
    while(exf_getfree((u8*)"0", &total, &free))	//得到SD卡的总容量和剩余容量
    {
        delay_ms(100);
        LED1 = !LED1; //PD2闪烁
        printf("SD Fatfs Error! \r\n");
    }
    printf("FATFS OK!\r\n");
    printf("SD Total Size:%d MB SD  Free Size:%d\r\n", total >> 10, free >> 10);

    scan_files((char*)Path1);//遍历所有目录中的文件
    mf_scan_files(Path1);//遍历根目录下的所有文件
    while(1)
    {
        delay_ms(500);
        LED1 = !LED1;
//        printf("SD Total Size:%d MB SD  Free Size:%d\r\n", total >> 10, free >> 10);
    }
}

📚程序源码

链接:https://pan.baidu.com/s/1WWyv9S1G5ZWqmhNNMX_ayA 
提取码:a5ro

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/672021.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录二刷day29 | 回溯之 491.递增子序列 46.全排列 47.全排列 II

day29 491.递增子序列回溯三部曲 46.全排列回溯三部曲 47.全排列 II 491.递增子序列 题目链接 解题思路: 回溯三部曲 递归函数参数 本题求子序列,很明显一个元素不能重复使用,所以需要startIndex,调整下一层递归的起始位置。…

【Python 基础篇】Python各种运算符详解

文章目录 引言一、算术运算符二、比较运算符三、逻辑运算符四、赋值运算符总结 引言 在 Python 编程中,运算符是用于执行各种数学和逻辑操作的特殊符号。它们使我们能够对变量和值进行各种计算和比较。本篇博客将深入探讨 Python 中的常见运算符,并通过…

【如何将多个类似 DDR-dataset.zip.010 文件文件合并成一个zip文件,然后解压】

如何将多个类似 DDR-dataset.zip.010 文件文件合并成一个zip文件,然后解压 问题描述 DDR-dataset.zip.01、DDR-dataset.zip.02、DDR-dataset.zip.03、…、DDR-dataset.zip.010,如何将他们合并到一起并解压? 解决方法 Windows 系统 在Windo…

原生Jdbc获取库、表、字段

文章目录 一、简介1、概述2、Jdbc获取连接3、执行器 二、获取链接1、获取链接2、关闭连接3、Statement4、PrepatedStatement5、 ResultSet6、ResultSetMetaData 三、执行SQL2.1 增/删/改2.2 查询 四、获取库、表结构1、获取Catalog2、获取库列表3、获取表名4、获取字段 一、简介…

为什么本地部署的低代码平台更有优势?

编者按:快速发展的企业需要跟上不断变化的市场趋势。在这种环境下,低代码开发平台可以成为企业快速进入市场的利器。低代码开发的优势可以影响新软件的交付速度,而可视化开发是推动这种无与伦比的速度的关键功能。私有化部署方案和源码交付机…

27-2BP_Adaboost强分类器公司财务预管建模——强分类器和弱分类器(附matlab程序)

1.简述 Adaboost算法的思想是合并多个“弱”分类器的输出以产生有效分类。其主要步骤为:首先给出弱学习算法和样本空间(x,y),从样本空间中找出m组训练数据,每组训练数据的权重都是1/m。然后用弱学习算法迭代运算T次&am…

SIP协议学习笔记

SIP 协议(Session initialization Protocol)会话发起协议 是IETF制定的多媒体通信协议,是一个基于文本的应用层控制协议,用于建立,修改和终止IP网上的双方或多方的多媒体会话,支持代理、重定向、登记定位用户等功能 支持用户的移动&#xff…

Packet Tracer - 使用思科 IOS 配置 DHCP

Packet Tracer - 使用思科 IOS 配置 DHCP 地址分配表 设备 接口 IPv4 地址 子网掩码 默认网关 R1 G0/0 192.168.10.1 255.255.255.0 不适用 S0/0/0 10.1.1.1 255.255.255.252 不适用 R2 G0/0 192.168.20.1 255.255.255.0 不适用 G0/1 已分配 DHCP 已分配 …

python安装/卸载模块方法步骤详解(附详细图解)

在日常工作中会需要安装或者卸载Python模块.于是我整理了一下,下面这篇文章主要给大家介绍了关于python安装/卸载模块的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下 以pygame模块举例 1,通过pycharm导入 (1)直接点击install …

Redis 2023面试5题(三)

一、Redis集群数据hash分片算法是怎么回事? Redis集群数据hash分片算法是一种将数据分散存储在不同的节点上来实现的机制。具体来说,Redis集群将数据分成16384个槽位,每个槽位对应一个节点。当需要访问某个key时,Redis会根据key的…

nginx主配置文件及实战案例

文章目录 一.nginx主配置文件nginx.conf1.认识nginx服务的主配置文件2.全局配置3.I/O事件配置4.HTTP配置5.检查配置文件是否正确6.浏览器测试7.总配置文件图示7.1 nginx总配置文件的三个模块7.2 HTTP文件配置的图示&am…

【Matlab】语音信号分析与处理实验报告

一、目的 使用Matlab分析与设计实验,理解与掌握以下知识点: 1、信号的采样、频谱混叠 2、信号的频谱分析 3、信号的幅度调制与解调方法 4、理想滤波器的时域和频域特性 5、数字滤波器的设计与实现 二、内容 1、录制一段个人的语音信号 2、采用合适的频…

Unity3D制作一个会移动的方块(还不会移动照相机)

学习Unity3D这么久了,如果你还不会制作一个按下WASD就可以移动的方块的话,那么你的学习将没有一点成就感,我学习的时候,我决定先学习移动,这样我就会对Unity更加感兴趣,学习起来的动力会更为充足 先创建一…

Nseeus安装及使用教程

Nessus是一款目前使用较多的系统漏洞扫描与分析软件 文章目录 Nessus下载安装使用启动:https://localhost:8834/ Nessus Nessus是一款目前使用较多的系统漏洞扫描与分析软件 下载 下载链接:https://www.tenable.com/downloads/nessus 安装 傻瓜式安装 使用 最…

Baumer工业相机堡盟工业相机如何使用新版本NEOAPI SDK控制相机数据流的开启和关闭(C++)

Baumer工业相机堡盟工业相机如何使用新版本NEOAPI SDK控制相机数据流的开启和关闭(C) Baumer工业相机Baumer工业相机NEOAPI SDK的技术背景Baumer工业相机使用NEOAPISDK控制相机数据流的方式1.引用合适的类文件2.使用NEOAPISDK控制相机数据流的方式2.使用…

Xshell 连接虚拟机Ubuntu系统失败解决方案

背景知识: Xshell 是一个强大的安全终端模拟软件,可以进行远程登录,它支持 SSH1, SSH2, 以及 Microsoft Windows 平台的 TELNET 协议。 xshell通过ip连接,所以需要知道虚拟机的IP地址 使用XShell的主要目的是在Windows环境下登…

leetcode111. 二叉树的最小深度(java)

二叉树的最小深度 leetcode111. 二叉树的最小深度题目描述 DFS 深度优先遍历解题思路代码演示 BFS 广度优先遍历解题思路代码演示 往期经典 leetcode111. 二叉树的最小深度 来源:力扣(LeetCode) 链接:https://leetcode.cn/problem…

基于立创EDA的原理图设计

目录 学习目标 一、开发中原理图的作用 1.1 原理图 1.2 产品开发原理图设计阶段 1.3 原理图中的具体工作内容 二、 立创EDA软件使用基础 2.1 立创EDA电路设计软件 2.2 新建工程 2.3 设计元件原理图封装 三、项目实战(单片机最小系统) 学习目标…

Kaggle 比赛总结:BirdCLEF 2023

赛题名称:BirdCLEF 2023赛题任务:识别音景中的鸟叫声赛题类型:语音识别 https://www.kaggle.com/competitions/birdclef-2023文章目录 一、比赛背景二、比赛任务三、评价方法四、优胜方案4.1 第一名4.2 第二名4.3 第三名4.4 第四名4.5 第五名…

SpringCloud Alibaba入门2之用户子模块开发

在上一章的基础上进行子模块的开发SpringCloud Alibaba入门之创建多模块工程_qinxun2008081的博客-CSDN博客 一、引入SpringBoot 我们在父项目统一管理引入的jar包的版本。我们采用父项目中以depencyMangement方式引入spring-boot,子项目依赖parent父配置即可。 &…