• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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
 
Сверху Снизу