Problema intentando utilizar Littlefs en Nano ESP32S3

Estoy intentando utilizar LittleSF para tener un sencillo fichero de configuración en un Nano ESP32. He empezado por el ejemplo que viene incorporado (LittleFS_test). El skecth se compila correcto pero al ejecutarlo indica el texto de que falla el montar LittleFS. Adjunto el ino, que es el original al que simplemente he añadido dos líneas para asegurar la conexión con el serial.
No sé si falta algún proceso previo para definir zona de FS. ¿Alguna idea?

#include <Arduino.h>
#include "FS.h"
#include <LittleFS.h>

/* You only need to format LittleFS the first time you run a
   test or else use the LITTLEFS plugin to create a partition
   https://github.com/lorol/arduino-esp32littlefs-plugin
   
   If you test two partitions, you need to use a custom
   partition.csv file, see in the sketch folder */

//#define TWOPART

#define FORMAT_LITTLEFS_IF_FAILED true

void listDir(fs::FS &fs, const char * dirname, uint8_t levels){
    Serial.printf("Listing directory: %s\r\n", dirname);

    File root = fs.open(dirname);
    if(!root){
        Serial.println("- failed to open directory");
        return;
    }
    if(!root.isDirectory()){
        Serial.println(" - not a directory");
        return;
    }

    File file = root.openNextFile();
    while(file){
        if(file.isDirectory()){
            Serial.print("  DIR : ");
            Serial.println(file.name());
            if(levels){
                listDir(fs, file.path(), levels -1);
            }
        } else {
            Serial.print("  FILE: ");
            Serial.print(file.name());
            Serial.print("\tSIZE: ");
            Serial.println(file.size());
        }
        file = root.openNextFile();
    }
}

void createDir(fs::FS &fs, const char * path){
    Serial.printf("Creating Dir: %s\n", path);
    if(fs.mkdir(path)){
        Serial.println("Dir created");
    } else {
        Serial.println("mkdir failed");
    }
}

void removeDir(fs::FS &fs, const char * path){
    Serial.printf("Removing Dir: %s\n", path);
    if(fs.rmdir(path)){
        Serial.println("Dir removed");
    } else {
        Serial.println("rmdir failed");
    }
}

void readFile(fs::FS &fs, const char * path){
    Serial.printf("Reading file: %s\r\n", path);

    File file = fs.open(path);
    if(!file || file.isDirectory()){
        Serial.println("- failed to open file for reading");
        return;
    }

    Serial.println("- read from file:");
    while(file.available()){
        Serial.write(file.read());
    }
    file.close();
}

void writeFile(fs::FS &fs, const char * path, const char * message){
    Serial.printf("Writing file: %s\r\n", path);

    File file = fs.open(path, FILE_WRITE);
    if(!file){
        Serial.println("- failed to open file for writing");
        return;
    }
    if(file.print(message)){
        Serial.println("- file written");
    } else {
        Serial.println("- write failed");
    }
    file.close();
}

void appendFile(fs::FS &fs, const char * path, const char * message){
    Serial.printf("Appending to file: %s\r\n", path);

    File file = fs.open(path, FILE_APPEND);
    if(!file){
        Serial.println("- failed to open file for appending");
        return;
    }
    if(file.print(message)){
        Serial.println("- message appended");
    } else {
        Serial.println("- append failed");
    }
    file.close();
}

void renameFile(fs::FS &fs, const char * path1, const char * path2){
    Serial.printf("Renaming file %s to %s\r\n", path1, path2);
    if (fs.rename(path1, path2)) {
        Serial.println("- file renamed");
    } else {
        Serial.println("- rename failed");
    }
}

void deleteFile(fs::FS &fs, const char * path){
    Serial.printf("Deleting file: %s\r\n", path);
    if(fs.remove(path)){
        Serial.println("- file deleted");
    } else {
        Serial.println("- delete failed");
    }
}

// SPIFFS-like write and delete file, better use #define CONFIG_LITTLEFS_SPIFFS_COMPAT 1

void writeFile2(fs::FS &fs, const char * path, const char * message){
    if(!fs.exists(path)){
		if (strchr(path, '/')) {
            Serial.printf("Create missing folders of: %s\r\n", path);
			char *pathStr = strdup(path);
			if (pathStr) {
				char *ptr = strchr(pathStr, '/');
				while (ptr) {
					*ptr = 0;
					fs.mkdir(pathStr);
					*ptr = '/';
					ptr = strchr(ptr+1, '/');
				}
			}
			free(pathStr);
		}
    }

    Serial.printf("Writing file to: %s\r\n", path);
    File file = fs.open(path, FILE_WRITE);
    if(!file){
        Serial.println("- failed to open file for writing");
        return;
    }
    if(file.print(message)){
        Serial.println("- file written");
    } else {
        Serial.println("- write failed");
    }
    file.close();
}

void deleteFile2(fs::FS &fs, const char * path){
    Serial.printf("Deleting file and empty folders on path: %s\r\n", path);

    if(fs.remove(path)){
        Serial.println("- file deleted");
    } else {
        Serial.println("- delete failed");
    }

    char *pathStr = strdup(path);
    if (pathStr) {
        char *ptr = strrchr(pathStr, '/');
        if (ptr) {
            Serial.printf("Removing all empty folders on path: %s\r\n", path);
        }
        while (ptr) {
            *ptr = 0;
            fs.rmdir(pathStr);
            ptr = strrchr(pathStr, '/');
        }
        free(pathStr);
    }
}

void testFileIO(fs::FS &fs, const char * path){
    Serial.printf("Testing file I/O with %s\r\n", path);

    static uint8_t buf[512];
    size_t len = 0;
    File file = fs.open(path, FILE_WRITE);
    if(!file){
        Serial.println("- failed to open file for writing");
        return;
    }

    size_t i;
    Serial.print("- writing" );
    uint32_t start = millis();
    for(i=0; i<2048; i++){
        if ((i & 0x001F) == 0x001F){
          Serial.print(".");
        }
        file.write(buf, 512);
    }
    Serial.println("");
    uint32_t end = millis() - start;
    Serial.printf(" - %u bytes written in %u ms\r\n", 2048 * 512, end);
    file.close();

    file = fs.open(path);
    start = millis();
    end = start;
    i = 0;
    if(file && !file.isDirectory()){
        len = file.size();
        size_t flen = len;
        start = millis();
        Serial.print("- reading" );
        while(len){
            size_t toRead = len;
            if(toRead > 512){
                toRead = 512;
            }
            file.read(buf, toRead);
            if ((i++ & 0x001F) == 0x001F){
              Serial.print(".");
            }
            len -= toRead;
        }
        Serial.println("");
        end = millis() - start;
        Serial.printf("- %u bytes read in %u ms\r\n", flen, end);
        file.close();
    } else {
        Serial.println("- failed to open file for reading");
    }
}

void setup(){
    Serial.begin(115200);
    while(!Serial){;}
    delay(10000);

#ifdef TWOPART
    if(!LittleFS.begin(FORMAT_LITTLEFS_IF_FAILED, "/lfs2", 5, "part2")){
    Serial.println("part2 Mount Failed");
    return;
    }
    appendFile(LittleFS, "/hello0.txt", "World0!\r\n");
    readFile(LittleFS, "/hello0.txt");
    LittleFS.end();

    Serial.println( "Done with part2, work with the first lfs partition..." );
#endif

    if(!LittleFS.begin(FORMAT_LITTLEFS_IF_FAILED)){
        Serial.println("LittleFS Mount Failed");
        return;
    }
    Serial.println( "SPIFFS-like write file to new path and delete it w/folders" );
    writeFile2(LittleFS, "/new1/new2/new3/hello3.txt", "Hello3");
    listDir(LittleFS, "/", 3);
    deleteFile2(LittleFS, "/new1/new2/new3/hello3.txt");
    
    listDir(LittleFS, "/", 3);
	createDir(LittleFS, "/mydir");
	writeFile(LittleFS, "/mydir/hello2.txt", "Hello2");
	listDir(LittleFS, "/", 1);
	deleteFile(LittleFS, "/mydir/hello2.txt");
	removeDir(LittleFS, "/mydir");
	listDir(LittleFS, "/", 1);
    writeFile(LittleFS, "/hello.txt", "Hello ");
    appendFile(LittleFS, "/hello.txt", "World!\r\n");
    readFile(LittleFS, "/hello.txt");
    renameFile(LittleFS, "/hello.txt", "/foo.txt");
    readFile(LittleFS, "/foo.txt");
    deleteFile(LittleFS, "/foo.txt");
    testFileIO(LittleFS, "/test.txt");
    deleteFile(LittleFS, "/test.txt");
	
    Serial.println( "Test complete" ); 
}

void loop(){

}

El IDE que utilizo es el 2.3.3.

Tienes que usar el ESP32 Sketch Data Upload

sigue este tutorial.

Gracias; voy a probarlo. Aunque yo no quiero hacer un upload de un fichero sino generarlo, ecribir y leer directamente desde el Nano. ¿Así y todo es necesario hacer un upload primero?. Os informaré si haciendo primero un upload funciona.

He probado el tutorial. He cargado el plugin, generado carpeta data en un sketch vacio, incluido un ficherito .txt en esa carpeta y activado el plugin upload.

El proceso acaba en error:

LittleFS Filesystem Uploader v1.2.1 -- https://github.com/earlephilhower/arduino-littlefs-upload

 Sketch Path: C:\Users\xapic\AppData\Local\Temp\.arduinoIDE-unsaved2024929-4672-17hk8gi.yxgw\sketch_oct29a
   Data Path: C:\Users\xapic\AppData\Local\Temp\.arduinoIDE-unsaved2024929-4672-17hk8gi.yxgw\sketch_oct29a\data
      Device: ESP32 series, model esp32s3
Using partition: default
  Partitions: C:\Users\xapic\AppData\Local\Arduino15\packages\arduino\hardware\esp32\2.0.18-20240930.arduino3\tools\partitions\default.csv

Building LittleFS filesystem
Command Line: C:\Users\xapic\AppData\Local\Arduino15\packages\esp32\tools\mklittlefs\3.0.0-gnu12-dc7f933\mklittlefs.exe -c C:\Users\xapic\AppData\Local\Temp\.arduinoIDE-unsaved2024929-4672-17hk8gi.yxgw\sketch_oct29a\data -p 256 -b 4096 -s 1441792 C:\Users\xapic\AppData\Local\Temp\tmp-1480-f7VR2frsxPn3-.littlefs.bin
/test_example.txt

Uploading LittleFS filesystem
Command Line: C:\Users\xapic\AppData\Local\Arduino15\packages\esp32\tools\esptool_py\4.5.1\esptool.exe --chip esp32s3 --port COM4 --baud NaN --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size detect 2686976 C:\Users\xapic\AppData\Local\Temp\tmp-1480-f7VR2frsxPn3-.littlefs.bin
usage: esptool [-h]
               [--chip {auto,esp8266,esp32,esp32s2,esp32s3beta2,esp32s3,esp32c3,esp32c6beta,esp32h2beta1,esp32h2beta2,esp32c2,esp32c6,esp32h2}]
               [--port PORT] [--baud BAUD]
               [--before {default_reset,usb_reset,no_reset,no_reset_no_sync}]
               [--after {hard_reset,soft_reset,no_reset,no_reset_stub}]
               [--no-stub] [--trace] [--override-vddsdio [{1.8V,1.9V,OFF}]]
               [--connect-attempts CONNECT_ATTEMPTS]
               {load_ram,dump_mem,read_mem,write_mem,write_flash,run,image_info,make_image,elf2image,read_mac,chip_id,flash_id,read_flash_status,write_flash_status,read_flash,verify_flash,erase_flash,erase_region,merge_bin,get_security_info,version}
               ...
esptool: error: argument --baud/-b: invalid arg_auto_int value: 'NaN'


ERROR:  Upload failed, error code: 2

El terminal no está activo, por tanto no creo que sea ese el problema. Supongo que el problema ( por lo indicado en el error) es ese valor de parámetro "NaN" para el baudrate, pero, ¿cómo puedo indicar un valor válido? No sé cómo modificar esa línea (si es que está en algún fichero de configuración y se puede)

¿Algún sugerimento?

Parece que el S3 no soporta LittleFS sino FFat (o eso interpreto).

Probá

if (!LittleFS.begin(true, "/littlefs", 10, "ffat"))

Supongo que deberías incluir la librería FFat...

Fuente :
https://forums.adafruit.com/viewtopic.php?t=203910

Muchas gracias MaximoEsfuerzo! he puesto esos parámetros en la begin y parece que funciona. Aún voy a hacer algunas pruebas, pero el sketch de test funciona.
Aunque la verdad no entiendo porqué no funciona tal como estaba. Es el sketch de ejemplo que queda disponible con la board Arduino Nano ESP32. Y he estado viendo varios ejemplos en internet que utilizan LittleFS con ESP32.
Te agradezco mucho la solución indicada.

Si, pero no todos los ESP32 son iguales, son como los autos, se supone que mejoran las versiones pero siempre le sacan algo que la anterior tenía... :grin:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.