• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Определение размера памяти ESP8266

Agasfer

New member
Вроде часто спрашивают, как определить размер установленной памяти.
Нашел в дебрях инета скетч для Arduino. При старте ESP8266 пишет в терминал размер памяти в Байтах(!)

Код:
extern "C" {
#include "c_types.h"
#include "ets_sys.h"
#include "os_type.h"
#include "osapi.h"
#include "spi_flash.h"
}

size_t fs_size()
{
// returns the flash chip's size, in BYTES
uint32_t id = spi_flash_get_id();
uint8_t mfgr_id = id & 0xff;
uint8_t type_id = (id >> 8) & 0xff; // not relevant for size calculation
uint8_t size_id = (id >> 16) & 0xff; // lucky for us, WinBond ID's their chips as a form that lets us calculate the size
return 1 << size_id;
}
void setup() {
  Serial.begin(9600);
  Serial.print("Flash Size = ");
  Serial.println(fs_size());
}
 

tolyan23

New member
некоторые модули при старте сами пишут размер свой памяти. достаточно открыть терминал на скорости 76000 (да это не опечатка скорость нестандартная) я использую doclight терминал.
При запуске модуль пишет
ets Jan 8 2013,rst cause:2, boot mode:(3,6)<CR><LF>
<CR><LF>
load 0x40100000, len 1396, room 16 <CR><LF>
tail 4<CR><LF>
chksum 0x89<CR><LF>
load 0x3ffe8000, len 776, room 4 <CR><LF>
tail 4<CR><LF>
chksum 0xe8<CR><LF>
load 0x3ffe8308, len 540, room 4 <CR><LF>
tail 8<CR><LF>
chksum 0xc0<CR><LF>
csum 0xc0<CR><LF>
<CR><LF>
2nd boot version : 1.4(b1)<CR><LF>
SPI Speed : 40MHz<CR><LF>
SPI Mode : DIO<CR><LF>
SPI Flash Size & Map: 8Mbit(512KB+512KB)<CR><LF>
jump to run user1 @ 1000<CR><LF>
(однако более старый модуль остановился на строчке csum 0xc0<CR><LF> )
 
  • Like
Реакции: Andr

casius

New member
Вот у меня валялись два модуля ESP-07 куплены в начале 2015 года. Решил посмотреть их память.
Пользуюсь программой ESPlorer v0.2.0-rc2.
К компьютеру подключаю через обычный USB-TTL переходник. Прошивка на ESP "базовая" Version:0.9.2.4
Не получается узнать количество памяти. Модуль коннектится нормально. На нажатие кнопки "chip info" пишет:
ready
print(node.chipid())

wrong syntax

ERROR

Как же мне узнать кол-во установленной памяти?
 

casius

New member
В общем, прешил на прошивку AT21SDK95-2015-01-24. Запустил ESPlorer, показывает следующее:
wdt reset
load 0x40100000, len 816, room 16
tail 0
chksum 0x8d
load 0x3ffe8000, len 788, room 8
tail 12
chksum 0xcf
ho 0 tail 12 room 4
load 0x3ffe8314, len 288, room 12
tail 4
chksum 0xcf
csum 0xcf

2nd boot version : 1.2
SPI Speed : 40MHz
SPI Mode : QIO
SPI Flash Size : 4Mbit
jump to run user1

Я так понимаю, что памяти у моего модуля: 512 кбайт(4 мегабита)?
 

Вложения

vad7

Active member
Может и врать, где-то читал, что при загрузке у кого-то выдавалось стандартное значение при большей памяти.
Хотя, если судить по модели и дате покупки модуля, врядли в нем больше 512к.
 

Mоnk

Member
Для Arduino IDE команда
[inline]ESP.getFlashChipSize()[/inline]
С этой командой непонятки.
Если в Arduino IDE указать Flash Size 512К или 1М получаю после прошивки 524288 и 1048576 соответственно.
А эскиз из первого поста и ESPFlashDownloadTool_v3.3.6 показывают 4194304 и 32Mbit соответственно.
 
Всем доброго дня. Подниму топик.
Я заказал на Алиэкспресс чипы памяти Winbond W25Q32FVSSIG для апгрейда Sonoff Basic до 4GB. Но продавец прислал чипы с маркировкой SST25VF64C (8GB) и я искал способ проверить работу и реальный размер памяти. ESP.getFlashChipRealSize() возвращает 2048 байт .
Нашел в сети пример для SPIFFS и на его основе написал программу, которая создает файлы по 100kB в SPIFFS до тех пор пока не выдаст ошибку "невозможно создать файл". Это показывает приблизительный размер памяти. Оказалось, что размер моих чипов очень похож на 8GB.
Вот програмка - весь вывод отдает в Serial. Не уверен на 100%, что все правильно, делал по-быстрому, т.к. нужно закрывать заказ. Но проверял на нескольких разных ESP платах от 1 до 16GB - результаты похожи на правду. И интересные результаты - первые файлы записываются по 3-4 сек, последние - до 3-х и больше минут (на 80 MHz). Как это объяснить?

Код:
//Based on example from
// https://circuits4you.com/2018/01/31/example-of-esp8266-flash-file-system-spiffs/


// FLASH MODE: DOUT


/*
* ESP8266 SPIFFS Basic Reading and Writing File
*
*/

#include <ESP8266WiFi.h>
#include <FS.h>   //Include File System Headers

#define FILE_SIZE 100000    // change to desired value
#define FILES_NUM 200            // change to desired value
char filename[16] = "/file";
char last_filename[16];
char fileext[5] = ".txt";
char str[11];
int i;
int start;
int sec0;
int sec1;
 
void setup()
{
  delay(1000);
  Serial.begin(115200);
  delay(1000);
  Serial.println();

   Serial.println("***************************"); //  returns a String containing the core version
   Serial.println("*** ESP8266 SPIFFS TEST ***"); //  returns a String containing the core version
   Serial.println("***************************"); //  returns a String containing the core version

  Serial.printf("\nESP CHIP ID %08X\n", ESP.getChipId());
  Serial.printf("\nFLASH CHIP ID %08X\n\n", ESP.getFlashChipId());

   Serial.print("ESP.getCoreVersion= ");
   Serial.println(ESP.getCoreVersion()); //  returns a String containing the core version
   Serial.print("ESP.getSdkVersion= ");
   Serial.println(ESP.getSdkVersion());  // returns the SDK version as a char.
   Serial.print("ESP.getFreeHeap()="); // returns the free heap size.
   Serial.println(ESP.getFreeHeap()); // returns the free heap size.
   Serial.printf("ESP.getCpuFreqMHz()="); // returns the CPU frequency in MHz as an unsigned 8-bit integer.
   Serial.println(ESP.getCpuFreqMHz()); // returns the CPU frequency in MHz as an unsigned 8-bit integer.
   Serial.print("ESP.getSketchSize()="); // returns the size of the current sketch as an unsigned 32-bit integer.
   Serial.println(ESP.getSketchSize()); // returns the size of the current sketch as an unsigned 32-bit integer.
   Serial.print("ESP.getFreeSketchSpace()="); // returns the free sketch space as an unsigned 32-bit integer.
   Serial.println(ESP.getFreeSketchSpace()); // returns the free sketch space as an unsigned 32-bit integer.
   Serial.print("ESP.getSketchMD5()="); //returns a lowercase String containing the MD5 of the current sketch.
   Serial.println(ESP.getSketchMD5()); //returns a lowercase String containing the MD5 of the current sketch.
   Serial.print("ESP.getFlashChipId()="); //returns the flash chip ID as a 32-bit integer.
   Serial.print("ESP.getFlashChipSize()="); //returns the flash chip size, in bytes, as seen by the SDK (may be less than actual size).
   Serial.println(ESP.getFlashChipSize()); //returns the flash chip size, in bytes, as seen by the SDK (may be less than actual size).
   Serial.print("ESP.getFlashChipRealSize()="); //returns the real chip size, in bytes, based on the flash chip ID.
   Serial.println(ESP.getFlashChipRealSize()); //returns the real chip size, in bytes, based on the flash chip ID.
   Serial.print("ESP.getFlashChipSpeed()="); // returns the flash chip frequency, in Hz.
   Serial.println(ESP.getFlashChipSpeed()); // returns the flash chip frequency, in Hz.
   Serial.print("ESP.getCycleCount()="); //returns the cpu instruction cycle count since start as an unsigned 32-bit. This is
   Serial.println(ESP.getCycleCount()); //returns the cpu instruction cycle count since start as an unsigned 32-bit. This is



  //Initialize File System
  Serial.println("\n***** Init (Can be up to 30 sec or more...)");
    sec0 = millis() / 1000;
  if(SPIFFS.begin())
  {
        Serial.printf("*SPIFFS Initialize....ok. %03d sec\n", (millis() / 1000) - sec0);
  }
  else
  {
        Serial.printf("*SPIFFS Initialization...failed. %03d sec\n", (millis() / 1000) - sec0);
  }

  //Format File System
  Serial.println("\n***** Format (Can be long time too...)");
    sec0 = millis() / 1000;
  if(SPIFFS.format())
  {
        Serial.printf("*File System Formatted. %03d sec\n", (millis() / 1000) - sec0);
  }
  else
  {
        Serial.printf("*File System Formatting Error. %03d sec\n", (millis() / 1000) - sec0);
  }

  //Create New File And Write Data to It
  //w=Write Open file for writing
  Serial.println("\n***** Write");

    for(int i1 = 1; i1 <= FILES_NUM; i1++)
    {
        sec0 = millis() / 1000;
        snprintf(filename, 10, "/FILE_%03d%s", i1, fileext);
        File f = SPIFFS.open(filename, "w");
 
        if (!f) {
            Serial.printf("%s open failed. %03d sec\n", filename,  (millis() / 1000) - sec0);
        }
        else
        {
            //Write data to file
            Serial.printf("Writing Data to %s\n", filename);
            for(int i2=1; i2 <= (FILE_SIZE / 10); i2++)
                {
                    snprintf(str, 11, "%03d_%05d ", i1, i2);
                    f.print(str);
                }
            f.close();  //Close file
            Serial.printf("%s. %03d sec\n", str, (millis() / 1000) - sec0);
            strcpy(last_filename, filename);        }
    }


  //Read File data
      Serial.println("\n***** Read last written file");
  File f = SPIFFS.open(last_filename, "r");
 
  if (!f) {
            Serial.printf("%s open failed\n", last_filename);
  }
  else
  {
            Serial.printf("*Reading Data from %s\n", last_filename);
      //Data from file
        sec0 = millis() / 1000;
      for(i=0;i<f.size();i++) //Read upto complete file size
      {
        Serial.print((char)f.read());
      }
      f.close();  //Close file
            Serial.printf("\n*%s Closed. %03d sec\n", last_filename, (millis() / 1000) - sec0);
  }

    Serial.printf("\n*****Finished.\nTotal time: %03d sec\n", (millis() / 1000) - start);
  delay(5000);
}

void loop()
{
}
 

futsker

New member
Вот програмка - весь вывод отдает в Serial. Не уверен на 100%, что все правильно, делал по-быстрому, т.к. нужно закрывать заказ. Но проверял на нескольких разных ESP платах от 1 до 16GB - результаты похожи на правду.
не, что-то не так. На моей LoLin v3 установлено 4Мбайта
Программа показала
ESP.getFlashChipId()=ESP.getFlashChipSize()=4194304
ESP.getFlashChipRealSize()=4194304
И при этом записала всего 9 файлов по 100Кбайт
 

nikolz

Well-known member
не, что-то не так. На моей LoLin v3 установлено 4Мбайта
Программа показала
ESP.getFlashChipId()=ESP.getFlashChipSize()=4194304
ESP.getFlashChipRealSize()=4194304
И при этом записала всего 9 файлов по 100Кбайт
возьмите прогу разработчика ESP8266 DOWNLOAD TOOL
она все вам покажет. в окошке DETECTED INFO
 
Сверху Снизу