学习 stm32 FATFS文件系统基础知识与示例应用

2023-10-27

文件系统
负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。即在磁盘上组织文件的方法。
理解:包含了对介质存储器进行地址,内容,读取操作的一些封装的功能API方便应用层直接使用。

常用的文件系统

  1. -FAT / FATFS
  2. NTFS: 基于安全性的文件系统,是Windows NT所采用的独特的文件系统结构
  3. -CDFS:CDFS是大部分的光盘的文件系统
  4. -exFAT

主要说明FATFS文件系统

FATFS是一个完全免费开源的FAT 文件系统模块,专门为小型的嵌入式系统而设计。完全用标准C 语言编写,所以具有良好的硬件平台独立性。可以移植到8051、PIC、AVR、SH、Z80、H8、ARM 等系列单片机上而只需做简单的修改。它支持FATl2、FATl6 和FAT32,支持多个存储媒介;有独立的缓冲区,可以对多个文件进行读/写,并特别对8 位单片机和16 位单片机做了优化。

FATFS文件系统特点

  1. Windows兼容的FAT文件系统(支持FAT12/FAT16/FAT32)

  2. 支持所有C语言开发平台,移植简单。

  3. 全C语言编写。

  4. 代码量少、效率高。

  5. 多种配置选项

    支持多卷(物理驱动器或分区,最多10个卷)
    多个ANSI/OEM代码页包括DBCS
    支持长文件名、ANSI/OEM或Unicode
    支持RTOS
    支持多种扇区大小
    只读、最小化的API和I/O缓冲区等
    

FATFS模块的层次结构图
在这里插入图片描述

  1. 底层接口,包括存储媒介读/写接口(disk I/O)和供给文件创建修改时间的实时时钟,需要我们根据平台和存储介质编写移植代码。
  2. 中间层FATFS模块,实现了FAT 文件读/写协议。FATFS模块提供的是ff.c和ff.h。除非有必要,使用者一般不用修改,使用时将头文件直接包含进去即可。
  3. 最顶层是应用层,使用者无需理会FATFS的内部结构和复杂的FAT 协议,只需要调用FATFS模块提供给用户的一系列应用接口函数,如f_open,f_read,f_write 和f_close等,就可以像在PC 上读/写文件那样简单。

FATFS文件系统包下载地址
http://elm-chan.org/fsw/ff/00index_e.html
打开如下图所示
在这里插入图片描述
下载官方的资料包如下图所示
在这里插入图片描述
第一步骤,下载解压后内容如下
0.14版本
在这里插入图片描述在这里插入图片描述
updates.txt 更新的版本介绍一般不用看
打开00index_e.html 文件.查看每一个方法的使用可以点击查看一下,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
第二步骤解压mkfatimg.zip 里面就是源码了。
在这里插入图片描述在这里插入图片描述

在这里插入图片描述

第三步骤,导入项目,引入项目文件如下图,左右是不同的版本引入效果,左边0.12,右边0.14
在这里插入图片描述在这里插入图片描述
diskio.c和diskio.h是硬件层。
ff.c和ff.h是FatFs的文件系统层和文件系统的API层。
FATFS模块在移植的时候,我们一般只需要修改2个文件,即ffconf.h和diskio.c。FATFS模块的所有配置项都是存放在ffconf.h里面,我们可以通过配置里面的一些选项,来满足自己的需求。diskio.c是硬件层,负责与底层硬件接口适配。

ffconf.h : FATFS关键配置文件(需要自己去看重要的。列举常用的)

  1. _FS_TINY。这个选项在R0.07版本中开始出现,之前的版本都是以独立的C文件出现(FATFS和Tiny FATFS),有了这个选项之后,两者整合在一起了,使用起来更方便。我们使用FATFS,所以把这个选项定义为0即可。
  2. _FS_READONLY。这个用来配置是不是只读,本章我们需要读写都用,所以这里设置为0即可。
  3. _USE_STRFUNC。这个用来设置是否支持字符串类操作,比如f_putc,f_puts等,本章我们需要用到,故设置这里为1。
  4. _USE_MKFS。这个用来定时是否使能格式化,本章需要用到,所以设 置这里为1。

⑤ _USE_FASTSEEK。这个用来使能快速定位,我们设置为1,使能快速定位。

⑥ _USE_LABEL。这个用来设置是否支持磁盘盘符(磁盘名字)读取与设置。我们设置为1,使能,就可以通过相关函数来读取和设置磁盘的名字了。

⑦_CODE_PAGE。这个用于设置语言类型,包括很多选项(见FATFS官网说明),我们这里设置为936,即简体中文(GBK码,需要c936.c文件支持,该文件在option文件夹)。

⑧_USE_LFN。该选项用于设置是否支持长文件名(还需要_CODE_PAGE支持),取值范围为03。0,表示不支持长文件名,13是支持长文件名,但是存储地方不一样,我们选择使用3,通过ff_memalloc函数来动态分配长文件名的存储区域。

⑨_VOLUMES。用于设置FATFS支持的逻辑设备数目,我们设置为3的话,即支持3个设备(磁盘)。

⑩_MAX_SS。扇区缓冲的最大值,一般设置为512。

重点 【FATFS移植步骤】

  1. 数据类型:在integer.h 里面去定义好数据的类型。这里需要了解你用的编译器的数据类型,并根据编译器定义好数据类型。
  2. 配置:通过ffconf.h配置FATFS的相关功能,以满足你的需要。
  3. 函数编写:打开diskio.c,进行底层驱动编写,一般需要编写6 个接口函数

操作函数如下
disk_initialize函数 【初始化磁盘驱动】
disk_status函数 【返回当前磁盘驱动的状态】
disk_read函数 【从磁盘驱动器上读取扇区】
disk_write函数 【向磁盘写入一个或多个扇区】
disk_ioctl函数 【控制设备指定特性和除了读写外的杂项功能】除了读写外的功能
get_fattime函数 【获取当前操作时间】

Application Interface 开放的的api 函数
FatFs为应用程序提供如下所示的各种文件系统功能
f_mount - 注册/注销一个工作区域(Work Area)
f_open - 打开/创建一个文件
f_close - 关闭一个文件
f_read - 读文件
f_write - 写文件
f_lseek - 移动文件读/写指针
f_truncate -截断文件
f_sync - 冲洗缓冲数据 Flush Cached Data
f_forward - 直接转移文件数据到一个数据流
f_stat - 获取文件状态
f_opendir - 打开一个目录
f_closedir -关闭一个已经打开的目录
f_readdir - 读取目录条目
f_mkdir - 创建一个目录
f_unlink -删除一个文件或目录
f_chmod - 改变属性(Attribute)
f_utime -改变时间戳(Timestamp)
f_rename - 重命名/移动一个文件或文件夹
f_chdir - 改变当前目录
f_chdrive - 改变当前驱动器
f_getcwd - 获取当前工作目录
f_getfree - 获取空闲簇 Get Free Clusters
f_getlabel - Get volume label
f_setlabel - Set volume label
f_mkfs - 在驱动器上创建一个文件系统
f_fdisk - Divide a physical drive
f_gets - 读一个字符串
f_putc - 写一个字符
f_puts - 写一个字符串
f_printf - 写一个格式化的字符串
f_tell - 获取当前读/写指针
f_eof - 测试文件结束
f_size - 获取文件大小
f_error - 测试文件上的错误

/******************************************************************************************************************************/
学习资料与系统源码下载
FATFS 官方资料下载的0.12,0和0.14最新版以及部分前人整理的
链接:https://pan.baidu.com/s/13IEQ9y2xApiZ8kD9uE0ulA
提取码:jnuj
–来自百度网盘超级会员V10的分享
下面是同步收集的哔站的FATFS视频教程
0902-1、stm32 FATFS文件系统基础知识讲解

/******************************************************************************************************************************/

上一节 学习stm32 pwm 多路舵机的控制(PWM 的频率的理解)

下一节 学习 stm32 FATFS文件系统的示例应用

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学习 stm32 FATFS文件系统基础知识与示例应用 的相关文章

  • 51单片机 数码管中断操作

    实践目的 1 掌握中断的概念和思想 2 掌握51单片机中断系统和相关软硬件设计 实践内容 1 利用单片机的P0口接数码管的字段脚 P1 0脚接共阴极 P3 2 P3 3引脚接独立按键产生外部中断信号 编写程序 当程序正常运行时数码管显示H字
  • 如何更改闪存的起始地址?

    我正在使用 STM32F746ZG 和 FreeRTOS Flash的起始地址是0x08000000 但我想把它改成0x08040000 我通过谷歌搜索了这个问题 但没有找到解决方案 我更改了链接器脚本 如下所示 MEMORY RAM xr
  • c项目makefile多重定义错误

    这个问题是一个对应于创建的repexthis问题 在我的嵌入式 C 项目中 我有两个独立的板 我想为每个板创建两个 c 文件 master c 和 Slave c 其中包含自己的特定main 功能 我使用 stm32cumbemx 生成带有
  • CMSIS 库是否应该包含在版本控制中? [复制]

    这个问题在这里已经有答案了 通常 我曾经在版本控制中包含芯片供应商 ST 提供的设备特定标头和源以及 CMSIS Core 标头 数量不多 也没有更新的习惯 我使用STM32微控制器 但我不使用立方体框架 or the 标准外设库 最近 我
  • 135-基于stm32单片机超声波非接触式感应水龙头控制系统Proteus仿真+源程序

    资料编号 135 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 电机 超声波传感器 制作一个基于stm32单片机超声波非接触式感应水龙头控制系统Proteus仿真 2 通过DHT11传感器检测当前
  • HAL库STM32常用外设教程(二)—— GPIO输入\输出

    HAL库STM32常用外设教程 二 GPIO输入 输出 文章目录 HAL库STM32常用外设教程 二 GPIO输入 输出 前言 一 GPIO功能概述 二 GPIO的HAl库驱动 三 GPIO使用示例 1 示例功能 四 代码讲解 五 总结
  • rt-thread studio中新建5.02版本报错

    先吐槽一下 rt thread studio出现BUG真多 好多时间都是在找BUG 但里面用好多控件还是挺好用的 真是又爱又恨 所以一般使用功能不多的话还是用keil多一点 创建5 02版本工程之后直接进行编译 直接会报下面这个错误 资源
  • STM32F4 通过软复位跳转到引导加载程序,无需 BOOT0 和 BOOT1 引脚

    我问这个问题是因为可以在这里找到类似问题的答案 通过应用程序跳转到 STM32 中的引导加载程序 即从用户闪存在引导模式下使用引导 0 和引导 1 引脚 用户 JF002 JF002回答 当我想跳转到引导加载程序时 我在其中一个备份寄存器中
  • STM32用一个定时器执行多任务写法

    文章目录 main c include stm32f4xx h uint32 t Power check times 电量检测周期 uint32 t RFID Init Check times RFID检测周期 int main Timer
  • STM32F103

    提示 来源正点原子 参考STM32F103 战舰开发指南V1 3PDF资料 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 开发环境硬件普中科技 接线图在g
  • HAL库学习

    CMSIS简介 CMSIS Cortex Microcontroller Software Interface Standard 微控制器软件接口标准 由ARM和其合作的芯片厂商 ST NXP 软件工具厂商 KEIL IAR 共同制定的标准
  • [屏驱相关]【SWM166-SPI-Y1.28C1测评】+ 有点惊艳的开箱

    耳闻华芯微特许久了 看到论坛得评测活动赶紧上了末班车 毕竟对有屏幕得板子也是很喜欢得 京东快递小哥客客气气 微笑着把快递给了我 好评 直接拆了包 在此之前没看过视频号 所以这个圆盘盘得模具还是有点惊喜的 正面照如下 开机有灯光秀 还有动画
  • 最终启动顺序错误 - STM32L476 的 Eclipse System Workbench 调试

    我正在尝试调试和运行 STM32L476 的简单汇编代码 我已经设置了 Eclipse Oxygen 在 Eclipse 中安装了最新版本的 System Workbench 插件并安装了 ST Link 驱动程序 IDE 成功构建了程序
  • 库函数点亮Led

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 例如 随着人工智能的不断发展 机器学习这门
  • 从没有中断引脚并且在测量准备好之前需要一些时间的传感器读取数据的最佳方法

    我正在尝试将压力传感器 MS5803 14BA 与我的板 NUCLEO STM32L073RZ 连接 根据 第 3 页 压力传感器需要几毫秒才能准备好读取测量值 对于我的项目 我对需要大约 10 毫秒来转换原始数据的最高分辨率感兴趣 不幸的
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • 在 Contiki 程序中使用 malloc

    考虑以下 Contiki 程序 include
  • STM32F0、ST-link v2、OpenOCD 0.9.0:打开失败

    我在用着发射台 http www ti com ww en launchpad about htmlgcc arm none eabi 4 9 2015q2 为 STM32F0 进行编译 现在我想使用该集合中的 arm none eabi
  • 使用 STM32 USB 设备库将闪存作为大容量存储设备

    我的板上有这个闪存IC 它连接到我的STM32F04 ARM处理器 处理器的USB端口可供用户使用 我希望我的闪存在通过 USB 连接到 PC 时被检测为存储设备 作为第一步 我在程序中将 USB 类定义为 MSC 效果很好 因为当我将主板
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE

随机推荐

  • React中如何使用refs

    ref是React中的一种属性 当render函数返回某个组件的实例时 可以给render中的某个虚拟DOM节点添加一个ref属性 如下面的代码所示 html view plain copy print
  • Node学习1

    Node 加载模块 加载内置模块和第三方模块直接require 名字 自定义模块需要加路径 require 加载模块时候会自 动调用被加载模块代码 require永远以module export所指向的对象为准 模块作用域 和函数作用域类似
  • 解决VScode使用git报错:Git: Bad status code: 500

    VS CODE GIT 500 问题处理 pudn com相关错误的处理链接博客 作为记录
  • C++ STL各标准容器使用手册

    原文 http blog csdn net nohackcc article details 8900017 1 vector 内部实现 数组 就是没有固定大小的数组 vector直接翻译是向量的意思 支持操作 begin 取首个元素 返回
  • 第10课 微信小程序数据存储(同步缓存、异步缓存,本地读取缓存):

    第10课 微信小程序数据存储 同 异步缓存 本地读取缓存 同步缓存 wx setStorageSync key value 异步缓存 wx setStorage Object object 同步删除缓存 wx removeStorageSy
  • java开发:java多线程(三):lock方式实现线程同步机制

    java多线程系列文章 java多线程 一 synchronized 对象锁和类锁的区别 java多线程 二 wait sleep join 和yield 区别 这章博客讲解lock如何实现同步机制 比较和synchronized 的区别
  • unity项目过程中本菜新遇到的问题和解决方案

    试出了奇怪的效果 还挺好看 canvas background text 在unity中打开的vs编辑器中没有代码提示 流星曳尾 博客园 这里我一开始不知道为啥text显示不出来 调成screen size才发现 是canvas方向反了 调
  • C语言-01

    以下内容为个人笔记 无实际参考意义 取地址符 int a 9 int pa 9 定义了一个今天类型的变量a 给他的值为9 定义了一个int类型的指针pa 指向变量a的地址 指定a输出的结果为9 指定 a输出的结果为存放a变量的地址 指定pa
  • linux如何做到不丢日志,rsyslogd日志丢失的解决

    最近发现跑keepalived的几台机器的日志总是打印不完 还好给抛了一个报错 信息如下 root yw lvs2 backup etc tail n 1000000 var log messages 20130526 grep rate
  • c语言中如何实现生成随机数

    文章目录 一 rand 函数 二 rand srand 三 rand sranf time 一 rand 函数 c语言中自带的生成随机数的函数rand 只要引用头文件 include
  • Apache Kafka Connect JNDI注入漏洞 (CVE-2023-25194) 安全风险通告

    https mp weixin qq com s biz MzU5NDgxODU1MQ mid 2247497666 idx 1 sn b58717baf54fe52ec517b89fe370f589 chksm fe79d35ac90e5
  • 自动化测试用例要怎么写,据说这是最全的......

    前言 自动化测试是使用专门的软件工具来验证软件解决方案 这通常涉及自动化功能作为测试过程的一部分 测试自动化最常见的对象是 测试管理和缺陷管理 单元和单元集成测试 功能测试 回归测试 非功能测试 如性能和可扩展性 自动化测试用例的编写是实现
  • 学习日记——《MQTT-JX》例程讲解(完结版)

    头文件 include ets sys h include driver uart h include osapi h include mqtt h include wifi h include config h include debug
  • 程序员思维方式

    今天去设备部修电脑的时候 看到他们部门在讨论个商业题目 看他们的津津有味 如痴如醉 吊起了我的无限兴趣 临走时让那妹子给我发了份邮件 回去好好研究研究 现将题目共享出来 和大家一起讨论讨论 据说这是一道可以测出一个人有没有商业头脑的数学题
  • NetCore连接MySQL

    打开VS 工具 NuGet包管理器 管理解决方案的NuGet程序包 搜索MySql Data并安装 测试连接MySQL的代码 using System using System Collections Generic using Syste
  • vue使用qrcode

    借鉴 vue中使用qrcode 生成二维码 有蝉的博客 CSDN博客 qrcode vue一 安装qrcode jsnpm install save qrcode二 封装生成二维码的组件index vue
  • 如何理解递归

    基本思想 写好递归要掌握几个技巧 1 明确递归函数的作用 将递归函数看作一个黑盒 我自己把该技巧称为黑盒思想 我认为黑盒思想对于理解递归有很大的作用 递归函数就是隐藏了很多细节 我们没必要去一步一步地模拟递归函数的运行 那样大脑也受不了 比
  • python:如何删除符合条件的图片

    import os import Image fileName fp open fileName rb im Image open fp fp close x y im size if x lt 300 or y lt 300 os rem
  • 自主设计,模拟实现 RabbitMQ - 多虚拟主机管理

    目录 前言 一 多虚拟主机管理 1 1 需求分析 1 1 1 回顾 1 1 2 实现方案 1 2 具体实现 lt
  • 学习 stm32 FATFS文件系统基础知识与示例应用

    文件系统 负责管理和存储文件信息的软件机构称为文件管理系统 简称文件系统 即在磁盘上组织文件的方法 理解 包含了对介质存储器进行地址 内容 读取操作的一些封装的功能API方便应用层直接使用 常用的文件系统 FAT FATFS NTFS 基于