Среда, 08.04.2026, 18:49
Вы вошли как Гость | Группа "Гости"Приветствую Вас Гость | RSS
Главная | ESP32 - Страница 2 - Форум | Мой профиль | Регистрация | Выход | Вход
Обитель RC-инженера
Форма входа
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Модератор форума: ВитГо  
ESP32
uwrteyДата: Пятница, 11.07.2025, 01:24 | Сообщение # 16
Генерал-майор
Группа: Администраторы
Сообщений: 3520
Репутация: 11
Статус: Offline
https://arduino-technology.ru/article....9149328

Partition Table

Таблица разделов в ESP32 определяет структуру и размер различных логических разделов флэш-памяти.
Это позволяет системе хранить и организовать необходимые данные и программные модули.
Правильная настройка таблицы разделов позволяет оптимально использовать флэш-объем.

Назначение каждого раздела таблицы:

nvs
Энергонезависимое хранение (Non-Volatile Storage)
— используется для хранения данных, которые должны сохраняться между перезагрузками устройства.
Например, настройки Wi-Fi.

otadata:
Хранение данных Over-The-Air Firmware Update
— этот раздел используется для хранения состояния процесса обновления прошивки 'по воздуху'.

app0
Основной раздел для размещения пользовательского приложения.
Именно в этом и аналогичных разделах вызывается программный код.

spiffs
Используется для хранения файлов в формате SPIFFS (SPI Flash File System)
— удобно для работы с файловой системой внутри устройства.

coredump
Раздел для извлечения данных после сбоя системы
— хранит дампы памяти, которые могут быть использованы для анализа ошибок и отладки.

---------------------------------------------------------

Для того, чтобы изменить разметку по умолчанию, нужно найти на компьютере папку

<LOCATION_OF_ARDUINO_ESP32>/tools/partitions
и создать в ней новый файл, например с именем max.csv. Далее копируем туда следующее содержимое:

я настроил первый раз вот так:

Код

# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     0x9000,  0x5000,
otadata,  data, ota,     0xe000,  0x2000,
app0,     app,  ota_0,   0x10000, 0x640000,
app1,     app,  ota_1,   0x650000,0x640000,
spiffs,   data, spiffs,  0xc90000,0x360000,
coredump, data, coredump,0xFF0000,0x10000,


Нашел примеры https://github.com/espress....titions

default_16MB.csv

Код

nvs,    data,    nvs,    0x9000,    0x5000,    
otadata,    data,    ota,    0xe000,    0x2000,    
app0,    app,    ota_0,    0x10000,    0x640000,    
app1,    app,    ota_1,    0x650000,    0x640000,    
spiffs,    data,    spiffs,    0xc90000,    0x360000,    
coredump,    data,    coredump,    0xFF0000,    0x10000,


-----------------------
default ( ?? 4 MB ?? )

Код

nvs    data    nvs    0x9000    0x5000    
otadata    data    ota    0xe000    0x2000    
app0    app    ota_0    0x10000    0x140000    
app1    app    ota_1    0x150000    0x140000    
spiffs    data    spiffs    0x290000    0x160000    
coredump    data    coredump    0x3F0000    0x10000


не успеваю за своими мыслями......
 
uwrteyДата: Пятница, 11.07.2025, 02:16 | Сообщение # 17
Генерал-майор
Группа: Администраторы
Сообщений: 3520
Репутация: 11
Статус: Offline
Цитата JackSmith ()
В NVS регионе на старой флешке должны храниться настройки радиочасти. Без них WIFI не заведется.

https://radiokot.ru/forum....4730767


не успеваю за своими мыслями......
 
uwrteyДата: Пятница, 11.07.2025, 03:36 | Сообщение # 18
Генерал-майор
Группа: Администраторы
Сообщений: 3520
Репутация: 11
Статус: Offline
в среде Ардуино создал точку доступа - работает нормально!!!
Проблема была не в памяти!!!
https://voltiq.ru/access-....4114017

Код


// Load Wi-Fi library
#include <WiFi.h>

// Replace with your network credentials
const char* ssid     = "ESP32-Access-Point";
const char* password = "123456789";

// Set web server port number to 80
WiFiServer server(80);

// Variable to store the HTTP request
String header;

// Auxiliar variables to store the current output state
String output26State = "off";
String output27State = "off";

// Assign output variables to GPIO pins
const int output26 = 26;
const int output27 = 27;

void setup() {
  Serial.begin(115200);
  // Initialize the output variables as outputs
  pinMode(output26, OUTPUT);
  pinMode(output27, OUTPUT);
  // Set outputs to LOW
  digitalWrite(output26, LOW);
  digitalWrite(output27, LOW);

  // Connect to Wi-Fi network with SSID and password
  Serial.print("Setting AP (Access Point)…");
  // Remove the password parameter, if you want the AP (Access Point) to be open
  WiFi.softAP(ssid, password);

  IPAddress IP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(IP);
  
  server.begin();
}

void loop(){
  WiFiClient client = server.available();   // Listen for incoming clients

  if (client) {                             // If a new client connects,
    Serial.println("New Client.");          // print a message out in the serial port
    String currentLine = "";                // make a String to hold incoming data from the client
    while (client.connected()) {            // loop while the client's connected
      if (client.available()) {             // if there's bytes to read from the client,
        char c = client.read();             // read a byte, then
        Serial.write(c);                    // print it out the serial monitor
        header += c;
        if (c == '\n') {                    // if the byte is a newline character
          // if the current line is blank, you got two newline characters in a row.
          // that's the end of the client HTTP request, so send a response:
          if (currentLine.length() == 0) {
            // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
            // and a content-type so the client knows what's coming, then a blank line:
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println("Connection: close");
            client.println();
            
            // turns the GPIOs on and off
            if (header.indexOf("GET /26/on") >= 0) {
              Serial.println("GPIO 26 on");
              output26State = "on";
              digitalWrite(output26, HIGH);
            } else if (header.indexOf("GET /26/off") >= 0) {
              Serial.println("GPIO 26 off");
              output26State = "off";
              digitalWrite(output26, LOW);
            } else if (header.indexOf("GET /27/on") >= 0) {
              Serial.println("GPIO 27 on");
              output27State = "on";
              digitalWrite(output27, HIGH);
            } else if (header.indexOf("GET /27/off") >= 0) {
              Serial.println("GPIO 27 off");
              output27State = "off";
              digitalWrite(output27, LOW);
            }
            
            // Display the HTML web page
            client.println("<!DOCTYPE html><html>");
            client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
            client.println("<link rel=\"icon\" href=\"data:,\">");
            // CSS to style the on/off buttons
            // Feel free to change the background-color and font-size attributes to fit your preferences
            client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");
            client.println(".button { background-color: #4CAF50; border: none; color: white; padding: 16px 40px;");
            client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");
            client.println(".button2 {background-color: #555555;}</style></head>");
            
            // Web Page Heading
            client.println("<body><h1>ESP32 Web Server</h1>");
            
            // Display current state, and ON/OFF buttons for GPIO 26  
            client.println("<p>GPIO 26 - State " + output26State + "</p>");
            // If the output26State is off, it displays the ON button       
            if (output26State=="off") {
              client.println("<p><a href=\"/26/on\"><button class=\"button\">ON</button></a></p>");
            } else {
              client.println("<p><a href=\"/26/off\"><button class=\"button button2\">OFF</button></a></p>");
            }
               
            // Display current state, and ON/OFF buttons for GPIO 27  
            client.println("<p>GPIO 27 - State " + output27State + "</p>");
            // If the output27State is off, it displays the ON button       
            if (output27State=="off") {
              client.println("<p><a href=\"/27/on\"><button class=\"button\">ON</button></a></p>");
            } else {
              client.println("<p><a href=\"/27/off\"><button class=\"button button2\">OFF</button></a></p>");
            }
            client.println("</body></html>");
            
            // The HTTP response ends with another blank line
            client.println();
            // Break out of the while loop
            break;
          } else { // if you got a newline, then clear currentLine
            currentLine = "";
          }
        } else if (c != '\r') {  // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
        }
      }
    }
    // Clear the header variable
    header = "";
    // Close the connection
    client.stop();
    Serial.println("Client disconnected.");
    Serial.println("");
  }
}


не успеваю за своими мыслями......
 
uwrteyДата: Суббота, 12.07.2025, 00:37 | Сообщение # 19
Генерал-майор
Группа: Администраторы
Сообщений: 3520
Репутация: 11
Статус: Offline
flash_download_tool_3.9.6 и 3.9.9 не могут прошить
flash_download_tools_v3.6.5 - шьет нормально
ESPrtk ссылается на режим developer

ошибка такая
Код

secure boot v1 enable. Not allow write flash
ESP32 BurnEfuseKeyError esp_write_flash


среда ардуино тоже шьет без проблем

****


не успеваю за своими мыслями......
 
uwrteyДата: Суббота, 12.07.2025, 04:21 | Сообщение # 20
Генерал-майор
Группа: Администраторы
Сообщений: 3520
Репутация: 11
Статус: Offline
загрузик ( bootloader )
https://docs.espressif.com/project....er.html


не успеваю за своими мыслями......
 
uwrteyДата: Понедельник, 14.07.2025, 00:23 | Сообщение # 21
Генерал-майор
Группа: Администраторы
Сообщений: 3520
Репутация: 11
Статус: Offline
куда грузить бинарники полученные в ардуино

bootloader_qio_80m.bin тут:
C:\Users\name\AppData\Local\Arduino15\packages\esp32\tools\esp32-arduino-libs\idf-release_v5.3-489d7a2b-v1\esp32\bin

boot_app0.bin тут:
C:\Users\name\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.1.3\tools\partitions

Цитата
Помогло. Нужно загрузить все 4 .bin-файла:
/esp32/tools/partitions/boot_app0.bin по адресу 0xe000
/esp32/tools/sdk/bin/bootloader_qio_80m.bin по адресу 0x1000
sketch.ino.bin по адресу 0x10000
sketch_dec.ino.partitions.bin по адресу 0x8000

https://github.com/espress....6190309


не успеваю за своими мыслями......
 
uwrteyДата: Вторник, 15.07.2025, 00:41 | Сообщение # 22
Генерал-майор
Группа: Администраторы
Сообщений: 3520
Репутация: 11
Статус: Offline
esp32-ntrip-DUO ( на основе xbee )
https://github.com/incarvr6/esp32-ntrip-DUO
загрузился без проблем

xbee - нифига не запускается
https://github.com/nebkat/esp32-xbee?ysclid=md3mmibgtv517309415

заказал новый модуль - все заработало без проблем.
интересно в чем проблема..


не успеваю за своими мыслями......
 
uwrteyДата: Вторник, 15.07.2025, 00:44 | Сообщение # 23
Генерал-майор
Группа: Администраторы
Сообщений: 3520
Репутация: 11
Статус: Offline
ESP32 WROVER содержит чип ESP32-D0WDQ6
ESP32 WROOM-32 содержит чип ESP32 D0WD V3 (версия v3.1)


не успеваю за своими мыслями......
 
uwrteyДата: Вторник, 15.07.2025, 03:59 | Сообщение # 24
Генерал-майор
Группа: Администраторы
Сообщений: 3520
Репутация: 11
Статус: Offline
запаял на место старую флешку на 4МБ
прошить с помощью flash_download_tool_3.9.9 не удалось ( ESP32 xbee )
но flash_download_tools_v3.6.5 справился


не успеваю за своими мыслями......
 
uwrteyДата: Понедельник, 30.03.2026, 00:49 | Сообщение # 25
Генерал-майор
Группа: Администраторы
Сообщений: 3520
Репутация: 11
Статус: Offline
Документация ESP32

Просмотр по сериям
https://documentation.espressif.com/en/home



заходим в ESP32
затем в Технические характеристики ESP32-WROOM-32E и ESP32-WROOM-32UE

https://documentation.espressif.com/esp32-w....en.html

ESP32-D0WD-V3 or ESP32-D0WDR2-V3 embedded
Xtensa dual-core 32-bit LX6 microprocessor
частота - до 240 MHz
ПЗУ - 448 KB ROM
ОЗУ - KB SRAM
ОЗУ - часов реального времени 16 KB SRAM in RTC

На модуле распаяны:
40 MHz crystal oscillator
4/8/16 MB SPI flash
2 MB PSRAM только для ESP32-D0WDR2-V3


не успеваю за своими мыслями......
 
uwrteyДата: Понедельник, 30.03.2026, 01:20 | Сообщение # 26
Генерал-майор
Группа: Администраторы
Сообщений: 3520
Репутация: 11
Статус: Offline
нужен документ
Technical Reference Manual для esp32 D0WD V3

я нашел такой - esp32_technical_reference_manual_en.pdf

изучаем ПАМЯТЬ

Адреса меньше 0x4000_0000 обслуживаются с помощью шины данных.
Адреса в диапазоне 0x4000_0000 ~ 0x4FFF_FFFF обслуживаются с помощью шины инструкций.
Адреса выше 0x5000_0000 включительно совместно используются шиной данных и шиной инструкций.

Прикрепления: 1405735.jpg (115.2 Kb)


не успеваю за своими мыслями......
 
uwrteyДата: Понедельник, 30.03.2026, 02:35 | Сообщение # 27
Генерал-майор
Группа: Администраторы
Сообщений: 3520
Репутация: 11
Статус: Offline
4.3.2.2 External Memory

Во-первых, блок управления кэшем имеет фиксированный размер страницы - 64 КБ для внешней флэш-памяти и 32 КБ для внешней ОЗУ (RAM)

Virtual Address for External Memory

VAddr0 - 4 MB ->3F40_0000 ~ 3F7F_FFFF

VAddr1 - 4 MB -> 4000_0000 ~ 403F_FFFF **** ( 400C_2000 ~ 403F_FFFF )

VAddr2 - 4 MB -> 4040_0000 ~ 407F_FFFF
VAddr3 - 4 MB -> 4080_0000 ~ 40BF_FFFF
VAddr4 - 1 MB -> 3F40_0000 ~ 3F4F_FFFF - Обратите внимание, что V Addr4 является подмножеством V Addr0.

VAddrRAM - 4 MB -> 3F80_0000 ~ 3FBF_FFFF ( ОЗУ )

**** Записи конфигурации для диапазона адресов 0x4000_0000 ~ 0x403F_FFFF реализованы и задокументированы так,
как если бы это был полный диапазон адресов в 4 МБ,
но доступ к нему как таковому не осуществляется.
Вместо этого диапазон адресов 0x4000_0000 ~ 0x400C_1FFFобращается к встроенной памяти. ( ROM )
Это означает, что некоторые записи конфигурации для V Addr1 не будут использоваться.


не успеваю за своими мыслями......
 
uwrteyДата: Понедельник, 30.03.2026, 03:24 | Сообщение # 28
Генерал-майор
Группа: Администраторы
Сообщений: 3520
Репутация: 11
Статус: Offline
внешняя флэш-память

Каждая запись конфигурации MMU сопоставляет виртуальную адресную страницу процесса ЦП с физической адресной страницей.
Запись имеет ширину 32 бита.
Из них биты 0–7 указывают физическую страницу, на которую отображается виртуальная страница.
Бит 8 должен быть сброшен, чтобы указать, что запись MMU действительна;
записи с этим установленным ( лог1) битом не будут сопоставлять какой-либо физический адрес с виртуальным адресом.
Биты с 10 по 32 не используются и должны быть записаны как ноль.
Поскольку в записи MMU восемь адресных битов (256 значений) , а размер страницы для внешней флэш-памяти составляет 64 КБ,
поддерживается максимум 256 × 64 КБ = 16 МБ внешней флэш-памяти.

Прикрепления: 4109130.jpg (37.0 Kb)


не успеваю за своими мыслями......
 
uwrteyДата: Вторник, 31.03.2026, 03:50 | Сообщение # 29
Генерал-майор
Группа: Администраторы
Сообщений: 3520
Репутация: 11
Статус: Offline
Flash память

Каждый сектор flash памяти имеет минимальный размер 4 КБ или 0x1000 байт в шестнадцатеричном представлении.
Здесь и далее все размеры - именно в шестнадцатеричном виде.
То есть задать размер раздела 0x0100 или 0x0500 у вас не выйдет.

Начальная область Flash-памяти по умолчанию занята под загрузчик
(конечно, если вы его используете, но он используется в большинстве случаев).
Поэтому прикладные разделы должны располагаться начиная с адреса,
заданного в константе CONFIG_PARTITION_TABLE_OFFSET
- это так называемое смещение по умолчанию.
На момент написания статьи это 0x8000.
Однако, в некоторых случаях загрузчик не впихивается в отведенное ему место
(например если вы включили отладочные сообщения в лог для загрузчика)
и вам потребуется увеличить это значение.

Длина таблицы разделов составляет 0xC00 ( dec: 3072 ) байт,
то есть допускается максимум 95 записей.
Контрольная сумма MD5, используемая для проверки целостности таблицы разделов во время запуска,
добавляется сразу же после данных таблицы.
Таким образом, таблица разделов занимает целый сектор флэш-памяти.
В результате любой следующий за ним раздел должен располагаться,
как минимум, по адресу смещение по умолчанию + 0x1000.
То есть начало "нашей" таблицы разделов увеличивается до 0x9000.

Важно: https://dzen.ru/a/Y4WaxnUQuy4xF5Xi


не успеваю за своими мыслями......
 
uwrteyДата: Вторник, Вчера, 03:51 | Сообщение # 30
Генерал-майор
Группа: Администраторы
Сообщений: 3520
Репутация: 11
Статус: Offline
Таблица разделов
https://docs.espressif.com/project....le.html

Цитата
Смещение должно быть кратно 4 КБ (0x1000),
а для разделов приложений оно должно быть выровнено по 64 КБ (0x10000).
Если оставить поле пустым, смещение будет автоматически рассчитано на основе конца предыдущего раздела, включая необходимое выравнивание.
Однако смещение для первого раздела всегда должно быть установлено равным 0x9000 ,
а для первого раздела приложений — 0x10000 .


Код
[b]пример: 8 МБ с OTA и хранилищем[/b]

# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     36K,     20K,
otadata,  data, ota,     56K,     8K,
app0,     app,  ota_0,   64K,     2M,
app1,     app,  ota_1,   ,        2M,
spiffs,   data, spiffs,  ,        3M,


это то-же самое что:

Код
[b]пример: 8 МБ с OTA и хранилищем[/b]

# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     0x9000,     0x5000,
otadata,  data, ota,     0xE000,     0x2000,
app0,     app,  ota_0,   0x10000,     0x200000,
app1,     app,  ota_1,   ,        0x200000,
spiffs,   data, spiffs,  ,        0x300000,


---------------------------------------------------------------
Загрузчик
https://docs.espressif.com/project....er.html
Цитата

Каждый файл .bin приложения или загрузчика ESP-IDF содержит заголовок с параметрами:
CONFIG_ESPTOOLPY_FLASHMODE
CONFIG_ESPTOOLPY_FLASHFREQ
CONFIG_ESPTOOLPY_FLASHSIZE .
Они используются для настройки SPI-флэш-памяти во время загрузки.

Первый этап (ПЗУ) загрузчика считывает информацию из заголовка второго этапа загрузчика из флэш-памяти
и использует эту информацию для загрузки остальной части второго этапа загрузчика из флэш-памяти.
Однако в это время тактовая частота системы ниже заданной, и поддерживаются не все режимы работы флэш-памяти.
После запуска второго этапа загрузчика он переконфигурирует флэш-память,
используя значения, считанные из заголовка выбранного в данный момент исполняемого файла приложения (а НЕ из заголовка второго этапа загрузчика ).
Это позволяет с помощью OTA-обновления изменить используемые настройки SPI-флэш-памяти.


не успеваю за своими мыслями......
 
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Поиск:


Copyright MyCorp © 2026
Сделать бесплатный сайт с uCoz