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文件

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

html5 video去除边框

video的属性: autoplay 视频在就绪后自动播放。 controls 显示控件,比如播放按钮。 height 设置视频播放器的高度。 width 设置视频播放器的宽度。 loop 循环播放 muted 视频的音频输出静音。 poster 视频加载时显示的图像,或者在用户点击播…

虚拟机的NAT模式连不上互联网

标题 虚拟机的NAT模式连不上互联网相关设备情况。我遇到了啥问题解决办法最后说一句 虚拟机的NAT模式连不上互联网 今天遇到了一个网络连接问题,是关于虚拟机的NAT模式上网的。 相关设备情况。 虚拟机上用到操作系统是centos7。宿主机的操作系统是windows10。虚拟…

mac14.1.2 M1芯片终端使用brew命令提示“zsh- command not found- brew ”解决方案

mac14.1.2 M1芯片终端使用brew命令提示“zsh- command not found- brew ” 原因:brew默认安装目录在/opt/homebrew/bin,zshrc文件中找不到对应的PATH路径导致。(可通过右键finder的图标选择「前往文件”-输入/opt/homebrew/bin」来查看brew是…

防火墙双双机热备

设备直路部署,上下行连接交换机 如 图所示,DeviceA和DeviceB的业务接口都工作在三层,上下行分别连接二层交换机。上行交换机连接运营商的接入点,运营商为企业分配的IP地址为1.1.1.3和1.1.1.4。现在希望DeviceA和DeviceB以负载分担…

nodejs安装(2024最最最最新版)

node官网 Index of /dist/https://nodejs.org/dist/ 选择版本 我比较喜欢16.20.1或者是14.16.1,这两个版本简直天下无敌了 下一步 选择这个,下载下来一个文件 一直点击下一步,就安装成功了 可能遇见的问题 1.安装了node,为什么不生效还是以前自己电脑安装的版本? 答: 可…

vue2中的组件自定义事件

1.绑定事件: <组件 :自定义名称"方法" /> 2.调用 this.$emit(方法,参数) 3.关闭 this.$off(方法) 案例: 1.提前准备好组件 Student组件 <template><div class"student"><h1>学校名称:{{ st…

Golang 百题(实战快速掌握语法)_2

返回集合中满足指定条件的最后一个元素 本实验将实现判断给定集合中的元素是否符合&#xff0c;并返回符合的最后一个元素。 知识点 forfmt.Error 适合人群 本课程属于基础课程。需要用户掌握 Go 语言编程基础知识、计算机基础知识和 Linux 环境的基本用法。 许可证 内容…

windows安装nvm

文章目录 前言一、NVM下载方式一&#xff1a;官网下载方式二&#xff1a;GitHub 下载 二、NVM安装三、Node安装四、配置 NVM 和 NodeJS4.1. 环境变量配置4.2 配置node_global和node_cache 前言 NVM&#xff08;Node Version Manager&#xff09;是一个命令行工具&#xff0c;用…

Redis队列自研组件

背景 年初的时候设计实践过一个课题&#xff1a;SpringBootRedis实现不重复消费的队列&#xff0c;并用它开发了一个年夜饭下单和制作的服务。不知道大家还有没有印象。完成这个课题后&#xff0c;我兴致勃勃的把它运用到了项目里面&#xff0c;可谁曾想&#xff0c;运行不久后…

phpMyAdmin 4.0.10 文件包含 -> getshell

phpMyAdmin 4.0.10 文件包含 -> getshell 前言&#xff1a;这里这个漏洞相对来说审计起来不是特别难&#xff0c;但是对于初学者还是有点挑战性的&#xff0c;从zkaq web课过来的小伙伴想挑战一下自己代码审计能力的话&#xff0c;可以直接跳到最后下载源码&#xff0c;聂风…

【总结】在SpringBoot项目中如何动态切换数据源、数据库?(可直接CV)

注意&#xff1a;文章若有错误的地方&#xff0c;欢迎评论区里面指正 &#x1f36d; 前言 本文参考若依源码&#xff0c;介绍了如何在SpringBoot项目中使用AOP和自定义注解实现MySQL主从数据库的动态切换&#xff0c;当从库故障时&#xff0c;能自动切换到主库&#xff0c;确…

手写SpringMVC之ApplicationContextListener

什么是Spring MVC&#xff1f; Spring Web MVC是基于Servlet API构建的原始Web框架&#xff0c;从一开始就包含在Spring Framework中。正式名称“Spring Web MVC”来自其源模块的名称&#xff08; spring-webmvc &#xff09;&#xff0c;但它通常被称为“Spring MVC”。 手写…

SD-WAN解决多云环境的挑战

随着SD-WAN成为远程用户访问基于云的应用程序的主要途径&#xff0c;促使越来越多的部署多云环境以优化性能的企业、IT专业人员选择支持安全、低延迟且易于管理的SD-WAN技术。与此同时&#xff0c;SD-WAN供应商和云服务供应商之间的合作&#xff0c;有助于跨多个云供应商轻松管…

分别使用netty和apache.plc4x测试读取modbus协议的设备信号

记录一下常见的工业协议数据读取方法 目录 前言Modbus协议说明Netty 读取测试使用plc4x 读取测试结束语 前言 Modbus 是一种通讯协议&#xff0c;用于在工业控制系统中进行数据通信和控制。Modbus 协议主要分为两种常用的变体&#xff1a;Modbus RTU 和 Modbus TCP/IP Modbus …

基于51单片机太阳能风能风光互补路灯控制器

一.硬件方案 本设计由STC89C52单片机电路太阳能电池板电路风机发电电路锂电池充电保护电路升压电路稳压电路光敏电阻电路4位高亮LED灯电路2档拨动开关电路电源电路设计而成。 二.设计功能 &#xff08;1&#xff09;采用风机和太阳能电池板给锂电池充电&#xff0c;具有充电…

微服务开发 —— 项目环境搭建篇

环境搭建 Linux 环境搭建 Linux 环境搭建大家可以使用虚拟机 VMware、VirtualBox 等应用创建虚拟机&#xff0c;使用Vagrant也可以快捷搭建虚拟环境&#xff1b;Windows 中有 WSL2&#xff0c;Windows 中的 Docker 也对 WSL 进行了支持&#xff0c;也是一个不错的选择。或者可…

麒麟系统安装Redis

一、背景 如前文&#xff08;《麒麟系统安装MySQL》&#xff09;所述。 二、下载Redis源码 官方未提供麒麟系统的Redis软件&#xff0c;须下载源码编译。 下载地址&#xff1a;https://redis.io/downloads 6.2.14版本源码下载地址&#xff1a;https://download.redis.io/re…

构建LangChain应用程序的示例代码:46、使用 Meta-Prompt 构建自我改进代理的 LangChain 实现

Meta-Prompt 实现 摘要&#xff1a; 本文介绍了 Noah Goodman 提出的 Meta-Prompt 方法的 LangChain 实现&#xff0c;该方法用于构建能够自我反思和改进的智能代理。 核心思想&#xff1a; Meta-Prompt 的核心思想是促使代理反思自己的性能&#xff0c;并修改自己的指令。…

降低IT运营成本,提升客户体验 |LinkSLA亮相第十届CDIE

6月25-26日&#xff0c;中国数字化创新博览会&#xff08;CDIE 2024&#xff09;在上海张江科学会堂举行。本届展览主题为“AI创新&#xff0c;引领商业增长新格局”&#xff0c;旨在交流企业在数字化时代&#xff0c;如何以科技为驱动&#xff0c;在转型中如何把握机遇&#x…

文本编辑命令和正则表达式

一、 编辑文本的命令 正则表达式匹配的是文本内容&#xff0c;Linux的文本三剑客&#xff0c;都是针对文本内容。 文本三剑客 grep&#xff1a;过滤文本内容 sed&#xff1a;针对文本内容进行增删改查 &#xff08;本文不相关&#xff09; awk&#xff1a;按行取列 &#x…