From ca02a48684eec70372543faacc1c996cddab8bc8 Mon Sep 17 00:00:00 2001 From: Vitali Date: Fri, 7 Aug 2026 17:21:25 +0700 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=B8=D0=B0=D0=B3=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D0=B8=D0=BA=D0=B0:=20=D0=BF=D0=B5=D1=87=D0=B0=D1=82?= =?UTF-8?q?=D0=B0=D1=82=D1=8C=20=D1=81=D0=B5=D0=BA=D1=82=D0=BE=D1=80=20EEP?= =?UTF-8?q?ROM=20=D0=B8=20=D0=B3=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D1=8B=20FS?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D1=82=D0=B8=D0=B2=20=D1=84=D0=B8=D0=B7?= =?UTF-8?q?=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=BE=D0=B3=D0=BE=20=D1=84=D0=BB?= =?UTF-8?q?=D0=B5=D1=88=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit() возвращает false, то есть падает сам вызов SDK (spi_flash_erase_sector либо spi_flash_write). Самая вероятная причина — сектор EEPROM за пределами физической микросхемы. При раскладке 4MB/FS:2MB сектор EEPROM это 1019 (смещение 0x3FB000), что требует чипа не меньше 4 МБ. Теперь лог сам печатает это смещение и сравнивает с ESP.getFlashChipRealSize(), а также границы файловой системы — последнее важно, потому что при том же дефекте LittleFS по адресу 0x400000 окажется недоступен ровно так же. Co-Authored-By: Claude Opus 5 --- .../pump_controller_8_2_OLED_DONE.ino | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/pump_controller_8_2_OLED_DONE/pump_controller_8_2_OLED_DONE.ino b/pump_controller_8_2_OLED_DONE/pump_controller_8_2_OLED_DONE.ino index fc6dc87..6b19a40 100644 --- a/pump_controller_8_2_OLED_DONE/pump_controller_8_2_OLED_DONE.ino +++ b/pump_controller_8_2_OLED_DONE/pump_controller_8_2_OLED_DONE.ino @@ -41,6 +41,7 @@ #include #include #include +#include // EEPROM_start / FS_PHYS_ADDR — только для диагностики #include #include @@ -721,9 +722,24 @@ void setup() { flashIde == flashReal ? "совпадает" : "!!! НЕ СОВПАДАЕТ !!!"); Serial.printf("[FLASH] скетч %u Б, свободно под скетч %u Б\n", ESP.getSketchSize(), ESP.getFreeSketchSpace()); + + // Куда именно EEPROM собирается писать. Если это смещение выходит за размер + // физической микросхемы, spi_flash_erase_sector() провалится и commit() + // вернёт false — то есть настройки не сохранятся никогда. + uint32_t eepromOffset = EEPROM_start - 0x40200000; + Serial.printf("[FLASH] EEPROM пишет в сектор %u (смещение 0x%06X)%s\n", + eepromOffset / SPI_FLASH_SEC_SIZE, eepromOffset, + eepromOffset + SPI_FLASH_SEC_SIZE <= flashReal + ? "" : " <<< ЗА ПРЕДЕЛАМИ ФИЗИЧЕСКОГО ФЛЕША!"); + Serial.printf("[FLASH] файловая система: смещение 0x%06X, размер %u Б%s\n", + FS_PHYS_ADDR, FS_PHYS_SIZE, + FS_PHYS_ADDR + FS_PHYS_SIZE <= flashReal + ? "" : " <<< ЗА ПРЕДЕЛАМИ ФИЗИЧЕСКОГО ФЛЕША!"); + if (flashIde != flashReal) { - Serial.println(F("[FLASH] ВНИМАНИЕ: выберите в IDE верный размер флеша,")); - Serial.println(F("[FLASH] иначе EEPROM не сохраняется.")); + Serial.println(F("[FLASH] ВНИМАНИЕ: размер флеша в IDE не соответствует")); + Serial.println(F("[FLASH] микросхеме. Ни EEPROM, ни LittleFS работать не будут,")); + Serial.println(F("[FLASH] пока в Tools -> Flash Size не выбран верный размер.")); } EEPROM.begin(EEPROM_SIZE);