Как хранить данные во флэш-памяти ESP32?

Я пытаюсь использовать эту библиотеку для хранения данных во флэш-памяти ESP32. Я особенно использую этот пример для записи и чтения значений с плавающей запятой. Я только что добавил Serial.println ("ошибка") в этот код следующим образом:

for (uint8_t i = 0; i < arrayLen(floatAddr); i++) 
  {
    if (flash.writeFloat(0x00, testFloat[i])) 
    {
      Serial.print(testFloat[i]);
      Serial.print(" written to 0x");
      Serial.println(floatAddr[i], HEX);
    }
    else
    {
      Serial.println("error");
    }
    
    _float = flash.readFloat(floatAddr[i]);
    Serial.print(_float);
    Serial.print(" read from 0x");
    Serial.println(floatAddr[i], HEX);
  }

Если я запускаю этот код, выводится сообщение об ошибке, т.е. flash.write не работает. Я только что видел некоторые инструкции на странице, что для ESP32 требуются некоторые модификации. *

"Альтернативная версия SPIFlash flash (SPIPinsArray) можно использовать конструктор (на данный момент только с платой ESP32), чтобы включить использование пользовательских контактов SPI. SPIPinsArray должен быть массивом из 4 элементов. содержащие пользовательские номера выводов SPI (как целые числа со знаком - int8_t) в следующий порядок - сск, мисо, моси, сс. Также не забудьте включить flash.begin(CHIPSIZE*) в void setup(). Это позволяет библиотеке определять тип установленного флэш-чипа. и загрузите правильные параметры. * Необязательный"

Поэтому я изменил свой код следующим образом:

#include<SPIMemory.h>

#if defined(ARDUINO_SAMD_ZERO) && defined(SERIAL_PORT_USBVIRTUAL)
// Required for Serial on Zero based boards
#define Serial SERIAL_PORT_USBVIRTUAL
#endif

#if defined (SIMBLEE)
#define BAUD_RATE 250000
#else
#define BAUD_RATE 115200
#endif

#define arrayLen(x) sizeof(x)/sizeof(x[0])
uint32_t strAddr[3], floatAddr[2], byteAddr[4];
String testStr[] = {
  "Test String 0",
  "Test String 1",
  "Test String 2"
};
float testFloat[] = {
  3.1415, 6.283
};
byte testByte[] = {
  3, 245, 84, 100
};
int8_t SPIPinsArray[] = {18,21,19,5}; //sclk,miso,mosi,ss
//SPIFlash flash(SS1, &SPI1);       //Use this constructor if using an SPI bus other than the default SPI. Only works with chips with more than one hardware SPI bus
//SPIFlash flash;
SPIFlash flash(int8_t *SPIPinsArray);
void getAddresses();
void writeData();
void setup() {
  Serial.begin(BAUD_RATE);
#if defined (ARDUINO_ARCH_SAMD) || (__AVR_ATmega32U4__) || defined(ARCH_STM32)
  while (!Serial) ; // Wait for Serial monitor to open
#endif
  delay(50); //Time to terminal get connected
  Serial.print(F("Initialising Flash memory"));
  for (int i = 0; i < 10; ++i)
  {
    Serial.print(F("."));
  }
  Serial.println();
  flash.begin();
  
  Serial.println();
  Serial.println();

 // getAddresses();
  dataIO();
  //flash.eraseChip();      // Uncomment this if you would like to erase chip
}

void loop() 
{

}



// Function to write data
void dataIO() 
{
  uint8_t _byte;
  float _float;
  String _string;
 

  for (uint8_t i = 0; i < arrayLen(floatAddr); i++) 
  {
    if (flash.writeFloat(0x00, testFloat[i])) 
    {
      Serial.print(testFloat[i]);
      Serial.print(" written to 0x");
      Serial.println(floatAddr[i], HEX);
    }
    else
    {
      Serial.println("error");
    }
    
    _float = flash.readFloat(floatAddr[i]);
    Serial.print(_float);
    Serial.print(" read from 0x");
    Serial.println(floatAddr[i], HEX);
  }

  
}

Но я получаю следующую ошибку, когда делаю это -

запрос для члена «начать» во «флеш», который не относится к классу 'SPIFlash(int8_t*) {aka SPIFlash(signed char*)}' flash.begin;

Что означает эта ошибка? Я не могу отладить его. Может ли кто-нибудь помочь мне в решении этой проблемы?

[UX] Категории и настройки внешнего вида Flash-сообщений
[UX] Категории и настройки внешнего вида Flash-сообщений
Flash-сообщение - это обычный веб-элемент, используемый для отправки короткого сообщения пользователю. Например, на странице входа в систему может...
1
0
3 241
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Некоторые ESP32 имеют встроенную флэш-память. Некоторые используют внешний флэш-чип. Эта флэш-память содержит прошивку приложения, может иметь файловую систему (обычно SPIFFS) и может иметь хранилище значений ключа (NVS). Эта флэш-память является основной и обычно единственной флэш-памятью на ESP32.

Библиотека, которую вы пытаетесь использовать, не может правильно работать с основной флэш-памятью, описанной выше. Библиотека, которую вы пытаетесь использовать, потребует, чтобы дополнительный флэш-чип был подключен к ESP32. Если бы он использовал основную флэш-память, он взял бы ее под контроль и помешал бы способности ESP32 запускать свою прошивку. Используйте эту библиотеку, только если вы подключили вторичную вспышку к ESP32.

Чтобы использовать флэш-память, поставляемую с ESP32, либо используйте SPIFFS для файловой системы, либо используйте Preferences (NVS) для хранилища значений ключа. Оба являются частью Arduino Core для ESP32, просты в использовании и не требуют второго флэш-чипа SPI.

привет @romkey, мое приложение требует хранения около 50 значений с плавающей запятой в секунду во флэш-памяти в течение примерно 5 часов. Я думал об использовании spiffs, но это требует записи и чтения файлов, но не дает свободы доступа к отдельным байтам. Я хотел бы хранить данные по определенным адресам и читать данные с этих адресов (должен иметь возможность читать и записывать данные с адресов и по адресам для флэш-памяти более 4 МБ на моем esp32-wroom). Я пытался использовать eeprom.read и write, но это не позволяет мне адресовать больше 4 КБ. Я еще не пробовал использовать настройки, но как мне использовать флэш-память для хранения такого огромного объема данных?

blazingcannon 17.12.2020 07:51

Настройки не годятся для больших объемов данных. Используйте SPIFFS для записи двоичного файла. Группируйте записи, чтобы свести к минимуму количество операций записи во флэш-память. Затем используйте lseek() для доступа к данным в определенных местах. Имейте в виду, что флэш-память в большинстве ESP32 рассчитана примерно на 100 000 операций записи, поэтому ее легко уничтожить, слишком часто сохраняя в ней что-то. SPIFFS помогает с выравниванием износа, но постарайтесь свести к минимуму записи. Как бы вы это ни делали, библиотека, на которую вы ссылаетесь, бесполезна без дополнительной внешней микросхемы флэш-памяти.

romkey 17.12.2020 08:09

Также имейте в виду, что некоторые из 4 МБ в вашем ESP32 уже используются для хранения прошивки вашего приложения. Вы не сможете использовать все это.

romkey 17.12.2020 08:10

Другие вопросы по теме