news 2026/3/21 9:24:18

SPIFFS文件系统

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SPIFFS文件系统

我是嵌入式学习菌,一名热爱学习的嵌入式工程师

关注我,一起变得更加优秀!

嵌入式学习菌

CSDN、B 站视频号同名同步分享嵌入式学习点滴~ 无捷径唯有坚持,愿与你并肩稳步前行!

一、先明确:SPIFFS是什么?

SPIFFS(SPIFlashFileSystem)是专门为ESP32等嵌入式设备的SPI闪存设计的轻量级文件系统,特点是占用资源少、适合小容量存储,核心作用是让ESP32能像电脑一样「创建文件、读写文件、保存文件」,且数据掉电不丢失(闪存特性)。

二、配置结构体esp_vfs_spiffs_conf_t逐参数解释

代码里的conf是配置结构体,相当于给SPIFFS挂载时的「设置清单」,每个参数都决定了文件系统的使用规则:

esp_vfs_spiffs_conf_tconf={ .base_path="/spiffs",//1. 挂载路径 .partition_label=NULL,//2. 分区标签 .max_files=10,//3. 最大同时打开文件数 .format_if_mount_failed=true,//4. 挂载失败自动格式化 };

1..base_path="/spiffs":文件系统的“访问入口”

含义:把SPIFFS文件系统挂载到ESP32的虚拟文件系统(VFS)的/spiffs路径下。

通俗理解:相当于给ESP32的“闪存硬盘”分配了一个“文件夹路径”,后续要读写SPIFFS里的文件,必须通过这个路径访问。

例子:要读取SPIFFS里的config.json配置文件,路径就是/spiffs/config.json;要创建日志文件,就写/spiffs/log.txt。

作用:统一文件访问路径,让ESP32能区分“SPIFFS里的文件”和其他存储(如NVS、SD卡)的文件。

2..partition_label=NULL:指定要使用的闪存分区

含义:NULL表示“使用ESP32固件分区表中第一个标记为SPIFFS类型的分区”。

背景:ESP32的闪存会被分成多个“分区”(类似电脑硬盘分C盘、D盘),比如「程序分区」(存固件)、「NVS分区」(存键值对配置)、「SPIFFS分区」(存文件)。

作用:告诉系统“要使用哪个分区当文件存储区”,设为NULL是简化配置(默认用第一个SPIFFS分区),如果有多个SPIFFS分区,可填分区标签(如"spiffs_data")指定。

3..max_files=10:限制同时打开的文件数量

含义:同一时间最多能打开10个文件(比如同时读2个配置文件+写1个日志文件,共3个,未超限制)。

原因:嵌入式设备内存有限,每个打开的文件都会占用一定内存(文件描述符、缓存等),限制数量是为了避免内存溢出。

注意:不是“最多能存10个文件”,而是“最多同时操作10个文件”,只要不同时打开,存几百个文件都可以。

4..format_if_mount_failed=true:挂载失败时自动“格式化”

含义:如果尝试挂载SPIFFS时失败(比如文件系统损坏、分区是新的未格式化),系统会自动格式化该分区,再重新挂载。

通俗理解:类似电脑硬盘损坏后,格式化后才能重新使用(格式化会清除所有数据,但能恢复文件系统可用性)。

作用:保证文件系统“尽可能可用”——嵌入式设备可能因掉电、异常重启导致文件系统损坏,这个参数能自动修复,避免设备因存储问题无法运行;但要注意:格式化会丢失原有数据,适合“数据可重建”的场景(如配置文件可重新生成,日志可重新记录)。

三、初始化流程细化(为什么要这么做?)

err=esp_vfs_spiffs_register(&conf);//注册并挂载

这行代码是核心操作,完整流程分3步,每一步都对应实际需求:

1.注册SPIFFS到VFS(虚拟文件系统)

ESP32的VFS是一个“统一文件访问接口”——不管是SPIFFS、SD卡、内存文件系统,都通过同一套函数(如fopen打开文件、fwrite写文件、fclose关闭文件)操作。

esp_vfs_spiffs_register(&conf)的作用:把配置好的SPIFFS注册到VFS,让系统识别/spiffs路径对应的是SPIFFS文件系统,后续调用标准文件函数就能操作闪存。

2.挂载文件系统(连接“分区”和“路径”)

注册后,系统会将指定的SPIFFS分区(.partition_label对应的分区)与/spiffs路径绑定,这个过程叫“挂载”。

挂载成功后,访问/spiffs下的文件,本质就是读写闪存的SPIFFS分区。

3.失败处理(自动格式化)

若挂载失败(如分区未格式化、文件系统损坏),因为.format_if_mount_failed=true,系统会执行:

格式化SPIFFS分区(清除所有数据,重建文件系统结构);

重新尝试挂载;

若格式化后仍失败,才返回错误码(如ESP_ERR_NO_MEM内存不足、ESP_ERR_INVALID_ARG参数错误)。

补充:挂载成功后的后续操作(代码中隐含)

代码里提到“通过esp_spiffs_check检查文件系统完整性”:相当于挂载后“扫描硬盘”,确认文件系统没有隐藏错误,避免后续读写文件时崩溃;

打印“总空间和已用空间”:方便调试(比如通过串口查看闪存还剩多少空间,避免存储满了导致写文件失败)。

四、核心作用:为什么要初始化SPIFFS

嵌入式设备(如ESP32)的RAM是“临时存储”(掉电数据丢失),而闪存是“持久化存储”(掉电数据不丢)。SPIFFS初始化的核心作用,就是给ESP32提供「持久化的文件级存储能力」,具体用在这些场景:

保存配置文件:比如WiFi账号密码、设备参数(如传感器校准值、工作模式),设备重启后能直接读取,不用重新配置;

记录日志文件:运行过程中的错误信息、状态数据(如传感器采集的温湿度),保存到日志文件,后续可通过串口或网络导出排查问题;

存储静态资源:比如网页文件(HTML/CSS/JS)、图片、固件升级包(OTA升级时临时存储);

简单说:没有SPIFFS,ESP32只能用NVS存储“键值对”(比如wifi_ssid="ABC"),无法存储“完整文件”;有了SPIFFS,就能像电脑一样管理文件,更灵活地处理持久化数据。

总结

这段代码的本质是「给ESP32的闪存分区“装一个文件系统”」:通过配置结构体指定“访问路径、使用分区、最大同时打开文件数、失败处理规则”;调用esp_vfs_spiffs_register完成“注册+挂载”,让ESP32能通过标准文件函数(fopen/fwrite等)操作闪存;核心目的:提供持久化的文件存储,支撑配置保存、日志记录等需要“掉电不丢数据”的场景,同时通过自动格式化保证系统稳定性。

小编也为零基础小白整理了一份嵌入式学习资料大全。

思维导图、C语言学习、单片机、学习笔记、实例项目……你需要的知识都在这儿!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/16 17:04:39

如何让MacBook电池续航翻倍?这个免费工具做到了

如何让MacBook电池续航翻倍?这个免费工具做到了 【免费下载链接】gSwitch macOS menu bar app that allows control over the gpu on dual gpu macbooks 项目地址: https://gitcode.com/gh_mirrors/gs/gSwitch 作为一名MacBook用户,你是否曾经有过…

作者头像 李华
网站建设 2026/3/19 9:11:11

基于Dlib的疲劳驾驶检测系统完整教程:快速实现实时安全监控

基于Dlib的疲劳驾驶检测系统完整教程:快速实现实时安全监控 【免费下载链接】Fatigue-Driving-Detection-Based-on-Dlib 项目地址: https://gitcode.com/gh_mirrors/fa/Fatigue-Driving-Detection-Based-on-Dlib 🚗 疲劳驾驶检测已成为现代交通安…

作者头像 李华
网站建设 2026/3/12 14:07:01

打破AI开发壁垒:ivy框架如何让深度学习模型在异构硬件上无缝运行

打破AI开发壁垒:ivy框架如何让深度学习模型在异构硬件上无缝运行 【免费下载链接】ivy unifyai/ivy: 是一个基于 Python 的人工智能库,支持多种人工智能算法和工具。该项目提供了一个简单易用的人工智能库,可以方便地实现各种人工智能算法的训…

作者头像 李华
网站建设 2026/3/13 22:37:00

阿里开源Wan2.2-Animate-14B:单模型实现电影级角色动画与替换

阿里开源Wan2.2-Animate-14B:单模型实现电影级角色动画与替换 【免费下载链接】Wan2.2-Animate-14B 项目地址: https://ai.gitcode.com/hf_mirrors/Wan-AI/Wan2.2-Animate-14B 导语 2025年9月,阿里巴巴通义实验室开源Wan2.2-Animate-14B模型&am…

作者头像 李华
网站建设 2026/3/19 23:38:07

Linux下进程的控制

一、进程的创建1.1fork函数初识在 linux 中 fork 函数是非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程, 而原进程为父进程1.2fork函数返回值(1)子进程返回0 (2)父进程返回的是子进程的pi…

作者头像 李华
网站建设 2026/3/21 2:46:05

Chrome 107自动化测试终极指南:3步搞定chromedriver配置

Chrome 107自动化测试终极指南:3步搞定chromedriver配置 【免费下载链接】Chrome107版本及对应chromedriver下载仓库 该项目专注于为开发者提供Chrome 107版本浏览器及其配套的chromedriver下载资源,助力自动化测试和开发工作顺利进行。通过该仓库&#…

作者头像 李华