ARM32开发-fat_fs文件系统

FAT_FS 文件系统

FAT (File Allocation Table) 文件系统是一种广泛使用的基于磁盘的文件系统,尤其适用于小型嵌入式系统和存储卡。FAT_FS 就是一个专门针对 FAT 文件系统的开源实现。

FAT_FS 的主要特点

  1. 轻量级和高度可移植:
    • FAT_FS 是一个非常轻量级的文件系统实现,占用资源少,非常适合嵌入式系统。
    • 它被设计为可以在不同的硬件平台和操作系统上运行,具有很强的可移植性。
  1. 支持 FAT12/16/32 文件系统:
    • FAT_FS 支持 FAT12、FAT16 和 FAT32 三种常见的 FAT 文件系统格式。
    • 可以方便地在这些文件系统格式之间进行切换和转换。
  1. 功能丰富:
    • FAT_FS 提供了完整的文件系统功能,包括文件和目录的创建、读写、删除等。
    • 还支持长文件名、时间戳、属性标志等特性。

FAT_FS 与 SDIO 的关系

SDIO (Secure Digital Input Output) 是一种通信协议,用于与 SD/SDHC/SDXC 存储卡进行数据交互。而 FAT_FS 则是一种文件系统,用于管理存储在这些存储卡上的文件数据。

通常情况下,嵌入式系统会将 FAT_FS 文件系统与 SDIO 驱动程序集成在一起,形成一个完整的存储子系统。SDIO 驱动程序负责与物理存储卡进行底层的数据交互,而 FAT_FS 则提供上层的文件系统功能,使得应用程序可以方便地访问存储卡上的文件数据。

这种组合使得嵌入式系统能够轻松地支持基于 SD 卡的文件存储和交换功能,广泛应用于各种电子设备中。

fat_fs仓库地址:FatFs - Generic FAT Filesystem Module

1. SDIO

  1. 从GD32固件库的SDIO文件夹中复制sdcard.hsdcard.c文件到自己的工程中
  2. 核对2366行代码中,引脚是否与自己的开发板相符合,若不相符,则修改引脚

  1. 在sdcard.c文件中,声明变量
sd_card_info_struct sd_cardinfo;  
  1. 在sd_init函数中,增加获取sd卡信息的函数,方便后续调用
if(SD_OK == status) {status = sd_card_information_get(&sd_cardinfo);
}

2. fat_fs

将下载的文件导入到工程中

替换diskio.c文件内容

📎diskio.c

2.1. 测试代码

#include "ff.h"
FATFS fs;
u8 buff_tx[512]="SD卡扇区读写测试,fat文件系统读写测试www.icheima.com\r\n";
u8 buff_rx[512];
void test_fatfs_write(const TCHAR *file_name,u8 *buff,u32 len);
void test_fatfs_read(const TCHAR *file_name,u8 *buff,u32 len);void test_fatfs(){uint8_t stat=f_mount(&fs,"0:",1);//SD卡挂载printf("stat=%d\r\n",stat);if(stat==0) printf("磁盘挂载成功\r\n");test_fatfs_write("0:/icheima.txt",buff_tx,strlen((char *)buff_tx));test_fatfs_read("0:/icheima.txt",buff_rx,strlen((char *)buff_tx));printf("rx:%s\r\n",buff_rx);//while(1){}
}
void test_fatfs_write(const TCHAR *file_name,u8 *buff,u32 len)
{/*1.打开文件*/FIL fp;FRESULT res;UINT bw;res=f_open(&fp,file_name,FA_WRITE|FA_CREATE_ALWAYS);//写+创建if(res!=FR_OK){printf("文件打开或创建失败:ERR%d\r\n",res);return ;}printf("文件创建或打开成功\r\n");res=f_write(&fp,buff,len,&bw);if(res==FR_OK){printf("数据写入成功 %d Byte\r\n",bw);}else printf("写入失败ERR:%d\r\n",res);f_close(&fp);//关闭文件
}void test_fatfs_read(const TCHAR *file_name,u8 *buff,u32 len)
{/*1.打开文件*/FIL fp;FRESULT res;UINT br;res=f_open(&fp,file_name,FA_READ);//读if(res!=FR_OK){printf("文件打开失败:ERR%d\r\n",res);return ;}printf("文件打开成功\r\n");res=f_read(&fp,buff,len,&br);if(res!=FR_OK){printf("读取数据失败ERR:%d \r\n",res);}else{printf("读取数据成功 %d byte\r\n",br);}f_close(&fp);//关闭文件
}

2.2. error:13

uint8_t stat=f_mount(&fs,"0:",1);//SD卡挂载

调用以上代码,如果出现13错误码,则使用SDFormatter对SD卡进行格式化即可

3. lvgl中启用文件系统

3.1. 模拟器中

在lv_conf配置文件中,启用文件系统

#define LV_USE_FS_WIN32 1
#if LV_USE_FS_WIN32#define LV_FS_WIN32_LETTER  'D'    /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/#define LV_FS_WIN32_PATH "D:/videos/code/lv_port_pc_eclipse-release-v8.3/images"         /*Set the working directory. File/directory paths will be appended to it.*/#define LV_FS_WIN32_CACHE_SIZE 0    /*>0 to cache this number of bytes in lv_fs_read()*/
#endif

其中“D:/videos/code/lv_port_pc_eclipse-release-v8.3/images”表示windows上面的路径,我们将它映射为lvgl中的文件盘符为D

例如,我们想访问“D:/videos/code/lv_port_pc_eclipse-release-v8.3/images”下的aaa.txt文件,在代码中我们其实只需要写"D:/aaa.txt"即可

在代码中调用

void demo14(){printf("demo14\n");lv_fs_dir_t d;if (lv_fs_dir_open(&d, "/") == LV_FS_RES_OK){char b[50];memset(b, 0, 50);while (lv_fs_dir_read(&d, b) == LV_FS_RES_OK){printf("%s\n", b);}lv_fs_dir_close(&d);} lv_fs_file_t  file_p;lv_fs_res_t res = lv_fs_open(&file_p,"D:/mergeBinFile.c",LV_FS_MODE_RD);// 1. 获取屏幕lv_obj_t* screen = lv_scr_act();// 2. 创建要显示的内容lv_obj_t* img = lv_img_create(screen);// 3. 对内容进行设置  参数1:img, 参数2:要显示的图片lv_img_set_src(img,"D:/a0001.bin");int i = 1;int time_count=0;char buffer[10];while(1){if(time_count%5 == 0){if(i > 392){i=0;}sprintf(buffer, "D:/a%04d.bin", i);printf("%s \n",buffer);lv_img_set_src(img,buffer);i++;}time_count++;lv_timer_handler();usleep(5 * 1000);} 
}

运行上述代码,我们可以看到视频画面

3.2. 单片机中

在lv_conf文件中配置

在代码中,初始化SD卡

uint8_t stat=f_mount(&fs,"D",1);//SD卡挂载
printf("stat=%d\r\n",stat);

初始化lvgl中的文件系统

lv_fs_fatfs_init();

参考示例代码

     // 1. 获取屏幕lv_obj_t* screen = lv_scr_act();// 2. 创建要显示的内容lv_obj_t* img = lv_img_create(screen);// 3. 对内容进行设置  参数1:img, 参数2:要显示的图片lv_img_set_src(img,"D:/images/a0001.bin");

注: 上面代码需要在sd根目录新建images文件夹,并在其中放入a0001.bin文件

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

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

相关文章

人脸识别考勤机给企业带来了哪些好处

人脸识别考勤机给企业带来了哪些好处 随着考勤软件在国内各企业中逐渐使用,人们对于考勤的这种方式已不再生疏,传统的纸质签到、指纹打卡已因存在不灵敏、易作弊、难统计等诸多弊病,逐步被可以管理考勤的手机软件索取代; 近些…

【网络安全的神秘世界】渗透之信息收集流程

🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 渗透测试之信息收集 切记:搜索到敏感信息之后,不要随意下载和传播,属于违法行为&#xf…

如何基于ITIL构建有效的IT服务管理体系

在数字经济时代,IT服务管理已成为企业运作的核心支撑。随着信息技术的快速发展和应用,企业对IT服务的需求不断增加,而如何高效地管理这些服务成为一个重要挑战。基于ITIL(信息技术基础架构库)构建有效的IT服务管理体系…

Virtualbox7.0版本安装报错:Invalid installation directory

错误情况 我在安装virtualbox最新版7.0.18时候,因为默认安装在C盘,我改成了E盘,然后就报错 Invalid installation directory The chosen installation directory is invalid, as it does not meet the security requirements. Refer to th…

那些年我为了考PMP踩过的坑.....

说到考PMP我尊嘟很难过且伤心,众所周知,报考PMP都是要报机构的而且还是PMI认证的机构,所以在报考PMP过程中选的机构我可以说踩过了很多坑了...... Q:包过吗? 大家千万不要信某某机构说的包过噱头,真的很坑…

4000字读懂实时数仓的过去现在和未来(建议收藏)

1991年,比尔恩门(Bill Inmon)出版了他的第一本关于数据仓库的书《Building the Data Warehouse》,标志着数据仓库概念的确立。 我们所常说的企业数据仓库Enterprise Data Warehouse (EDW) ,就是一个用于聚合不同来源的…

【嵌入式】嵌入式Linux开发实战指南:从交叉编译到触摸屏交互

文章目录 前言:1.简介1.1. 交叉编译工具1.2. 项目开发流程:1.3. ARM开发板的连接方法 2. 开发板连接3. 系统文件 IO4. 设置共享文件夹3.1. 读文件3.2. 写文件3.2. 设置文件偏移量 4. LCD显示屏显示4.1. LCD 显示颜色4.2. 将文件下载到开发板4.2.1. 在CRT…

002.Linux CentOS7 安装

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉&…

Git Extensions gui工具差异显示乱码

某些IDE例如KEIL等默认编码格式为GB2312,而git extensions默认utf-8,如果不想修改文件格式为utf-8的话就修改git extensions格式为GB2312。 默认是没有chines 这个选项的,我这里是已经添加好的。方法为上方工具栏->设置->Git->设置…

Linux C编译器从零开发三

AST语法树 BNF抽象 expr equality equality relational ("" relational | "!" relational)* relational add ("<" add | "<" add | ">" add | ">" add)* add mul ("" …

为什么很多Java程序员会下意识觉得Java的就是最好的?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Java的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;做为一个真正热爱编程&#…

【并发程序设计】总篇集 Linux下 C语言 实现并发程序

11_Concurrent_Programing 文章目录 11_Concurrent_Programing1.进程概念进程内容进程类型进程状态 2.进程常用命令进程信息命令top 命令进程信息表 进程优先级命令nice 命令renice 命令 后台进程命令 3.子进程创建子进程fork 函数 结束进程exit 函数_exit 函数 回收子进程wait…

功能测试 之 单模块测试----抢购模块

1.先测后台&#xff0c;再测前台 面试题1: 当你发现研发实现的结果与需求不一致时怎么办? 需求评审的时候&#xff1a;需要确认所有输入类型的校验是针对单独的输入框做的还是在最终提交时校验 抢购模块&#xff1a;需求跟实现的内容不一致 (跟产品和研发一起确认。研发为什…

【Python教程】如何搭建一个高效的Python开发环境?结尾附安装包直通车

前言&#xff1a; Python 丰富的函数库和组件库是这门语言强大的核心原因&#xff01;但我们不可能去记忆所有的方法名和参数名&#xff0c;往往只能记住一些常用的或者某个方法开头的几个字母。这个时候一个好的开发工具就需要能聪明地“猜”出你想输入的代码&#xff0c;并给…

Java数据结构与算法——稀疏数组和队列

一、稀疏数组sparsearray数组 该二维数组的很多值是默认值0,因此记录了很多没有意义的数据&#xff0c;可以采用稀疏数组进行压缩 1.基本介绍: 当一个数组中大部分元素为0&#xff0c;或者为同一个值的数组时&#xff0c;可以使用稀疏数组来保存该数组。 稀疏数组的处理方法…

深入解析Linux权限管理:从基本原理到应用

目录 Shell 命令及运行原理 Shell 与 Kernel Linux 权限的概念 命令提示符 Linux 权限管理 1. 访问者的分类 ugo 2. 类型和访问权限 3. 权限值表示方法 4. chmod 访问权限设置 掩码命令&#xff1a;umask 5.目录权限 粘滞位&#xff1a; 文章手稿见文末 Shell 命令…

Unity OpenCVForUnity 安装和第二个案例详解 <二>

目录 一、前言 二、场景介绍 1.WebCamTextureToMatExample脚本 2.FpsMonitor脚本 三、 结构体Scaler 四、找到相机并使用 1.相机的启用 2.格式转换 a.把webCamTexture转换成Mat b.把Mat转换成Texture2D 五、脚本组合 六、作者的碎碎念 一、前言 第二个案例&#xf…

大语言模型的昨天、今天和明天

引言 近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术突飞猛进&#xff0c;其中大语言模型&#xff08;LLM&#xff09;无疑是最引人瞩目的技术之一。从OpenAI的GPT系列到Meta的Llama模型&#xff0c;大语言模型的发展不仅改变了人们对AI的认知&#xff0c;也在各行…

通过防抖动代码解决ResizeObserver loop completed with undelivered notifications.

通过防抖动代码解决ResizeObserver loop completed with undelivered notifications. 一、报错内容二、解决方案解释&#xff1a; 一、报错内容 我通过el-tabs下的el-tab-pane切换到el-table出现的报错&#xff0c;大致是渲染宽度出现了问题 二、解决方案 扩展原生的 Resiz…

DevOps学习回顾01-技能发展路线-岗位能力-体系认知

事为先&#xff0c;人为重–事在人为 参考来源&#xff1a; 极客时间专栏&#xff1a;DevOps实战笔记&#xff0c;作者&#xff1a;石雪峰 课程链接&#xff1a;https://time.geekbang.org/column/intro/235 时代的典型特征 VUCA VUCA 是指易变性&#xff08;Volatility&…