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,一经查实,立即删除!

相关文章

学懂C#编程:让函数返回 多个返回值 的几种常用技术

1. 使用 out 或 ref 参数 out 和 ref 参数允许方法修改传入变量的值,并通过它们“返回”多个值。ref 需要变量事先初始化,而 out 不要求。 public void GetValues(out int val1, out string val2) {val1 10;val2 "Hello"; }// 使用示例 int…

升级CENTOS 系统内核

更新系统和安装ELRepo存储库: sudo yum update sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org sudo yum install https://www.elrepo.org/elrepo-release-7.0-5.el7.elrepo.noarch.rpm安装最新的主线(Mainline)内核&…

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

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

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

🌝博客主页:泥菩萨 💖专栏: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…

深入理解 JS/TS 中的 filter 方法及其布尔值筛选功能

今天写需求的时候,需要对后端传回来的数据做乱码校验处理,需要筛除乱码数据。 这里我使用正则表达式并封装了一个判断是否为正常字段的方法。(如果是正常字段返回true,乱码字段返回false) 对后端返回的数据&#xff…

快速创建SpringBoot项目

在项目开发时候,我们不会自己创建一个maven项目,自己慢慢导入依赖,有更方便的方法: 1.idea快速创建spring boot项目 使用Spring Initializr 注意1:需要联网 注意2:resources里的目录结构: …

【js判断机型】

var isIOS /(iPhone|iPad|iPod)/i.test(navigator.userAgent) var isiPad navigator.userAgent.match(/(iPad)/) || (navigator.platform ‘MacIntel’ && navigator.maxTouchPoints > 1) 上面这个不行的话,再试下这个 var isiPad (navigator.userAg…

那些年我为了考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零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉&…

【Android面试八股文】Kotlin内置标准函数apply的原理是什么?

文章目录 一、原理解析二、 示例代码2.1 具体示例应用场景2.2 为什么使用 `apply`?apply 是 Kotlin 标准库中的一个高阶函数,它的作用是在对象上执行一个代码块,并返回这个对象本身。其原理涉及到函数类型和接收者对象的结合使用。 一、原理解析 函数类型与接收者对象的结合…

代码随想录算法训练营DAY42|1049. 最后一块石头的重量 II、494. 目标和、474.一和零

1049. 最后一块石头的重量 II 题目链接:1049. 最后一块石头的重量 II class Solution(object):def lastStoneWeightII(self, stones):""":type stones: List[int]:rtype: int"""n len(stones)sum_stones sum(stones)weight sum_…

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;做为一个真正热爱编程&#…

使用rufus做Kali Linux时持久分区大小如何设置

持久分区大小是什么意思&#xff1a; 持久分区大小指的是在U盘安装引导Kali Linux时&#xff0c;为保存Kali修改后的设置&#xff08;如中文界面显示等&#xff09;而预留的空间大小。这个空间相当于电脑中的D盘&#xff0c;用于保存修改后的设置。 而剩下的空间则用于安装Kali…

UE5 发射物目标追踪

UE5 发射物目标追踪 思路 求出需要旋转的角度&#xff0c;然后每帧旋转&#xff0c;再更新速度 实现&#xff1a; 求出发射物当前方向和目标方向的旋转后&#xff0c;插值求每帧的旋转。 //向目标旋转 float Speed MovementComponent->Velocity.Length(); //获取发射物…