共计 1923 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
在 ESP32 开发中,我们经常遇到一个棘手的问题:设备重启后,运行时参数丢失。这是因为 ESP32 的 RTC 内存是易失性的,断电后数据无法保留。虽然可以使用 EEPROM 模拟存储,但它存在两个明显短板:

- 有限的擦写次数(约 10 万次),频繁写入容易导致损坏
- 存储容量通常只有几 KB,无法满足复杂配置需求
而基于 SPIFFS/LittleFS 的文件系统方案,不仅能突破这些限制,还支持日志记录和大规模配置存储,是物联网设备的理想选择。
技术选型
ESP32 支持两种主流文件系统:
- SPIFFS:轻量级,但缺乏目录支持,磨损均衡算法简单
- LittleFS:支持目录操作,具有更好的磨损均衡,推荐新项目使用
对于配置存储格式,常见有两种选择:
- 二进制格式:节省空间但可读性差
- JSON 格式:人类可读,方便调试,推荐使用
核心实现
1. 文件系统初始化
使用 LittleFS 前,需要先初始化并挂载文件系统:
#include "FS.h"
#include "LittleFS.h"
void setup() {if(!LittleFS.begin()){Serial.println("挂载文件系统失败!");
return;
}
}
2. 关键 API 使用
文件操作主要涉及三个核心方法:
- File.open():打开或创建文件
- File.write():写入数据
- File.close():关闭文件释放资源
3. 原子写入保障
为防止写入过程中断电导致数据损坏,应采用临时文件 + 重命名的策略:
- 先将配置写入临时文件
- 确保写入完整后,重命名为目标文件
- 读取时检查临时文件是否存在并处理
完整代码示例
下面是一个健壮的参数存储类实现:
#include <ArduinoJson.h>
class ConfigManager {
public:
bool loadConfig(const char* path) {File file = LittleFS.open(path, "r");
if(!file) return false;
size_t size = file.size();
if(size > 1024) { // 防止内存溢出
file.close();
return false;
}
DynamicJsonDocument doc(1024);
DeserializationError error = deserializeJson(doc, file);
file.close();
if(error) return false;
// 解析配置项
this->ssid = doc["wifi_ssid"].as<String>();
this->interval = doc["report_interval"].as<int>();
return true;
}
bool saveConfig(const char* path) {
// 先写入临时文件
File file = LittleFS.open("/config.tmp", "w");
if(!file) return false;
DynamicJsonDocument doc(1024);
doc["wifi_ssid"] = this->ssid;
doc["report_interval"] = this->interval;
if(serializeJson(doc, file) == 0) {file.close();
return false;
}
file.close();
// 重命名为正式文件
if(!LittleFS.rename("/config.tmp", path)) {LittleFS.remove("/config.tmp");
return false;
}
return true;
}
private:
String ssid;
int interval;
};
生产环境考量
闪存寿命优化
- 避免频繁写入相同位置
- 启用 LittleFS 的磨损均衡功能
- 估算写入频率,确保在设备生命周期内
断电保护
- 采用原子写入策略
- 定期备份重要配置
- 实现配置恢复机制
多任务安全
- 使用互斥锁保护文件操作
- xSemaphoreCreateMutex() 创建锁
- xSemaphoreTake()/xSemaphoreGive() 加解锁
避坑指南
- 忘记初始化 :务必先调用 LittleFS.begin()
- 未格式化分区 :首次使用前需要格式化
- 频繁开关文件 :保持文件打开状态进行批量操作
- 内存不足 :合理设置 ArduinoJson 文档大小
- 未验证数据 :检查文件完整性和 JSON 解析结果
延伸思考
- 如何实现配置版本迁移?当设备固件升级导致配置结构变化时,如何平滑过渡?
- 在多设备场景下,如何同步配置变更?
- 如何加密敏感配置项,防止泄露?
通过本文介绍的文件系统方案,你可以轻松实现 ESP32 参数的持久化存储。这种方法不仅可靠,还便于调试和维护,是物联网开发的必备技能。
正文完
