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

Решено Пример записи и чтения память(flash)

de1m

New member
Код:
static void ICACHE_FLASH_ATTR test() {
   os_printf("SDK version:%s\n", system_get_sdk_version());
    struct wConf
    {
       char ssid[32];
       char passwd[64];
    };
    struct wConf wifiApConf;
    char const ssid_str[32] = "CO2";
    char const pass_str[64] = "co2passwd";
    os_memcpy(wifiApConf.ssid, &ssid_str, sizeof (ssid_str));
    os_memcpy(wifiApConf.passwd, &pass_str, sizeof (pass_str));

    struct wConf ssidAp;
    int i = spi_flash_erase_sector(0x8c);
    os_printf("spi_flash_erase_sector: %d\n", i);
    int o = spi_flash_write(0x8c000, (uint32 *)&wifiApConf, sizeof(wifiApConf));
    os_printf("spi_flash_write: %d\n", o);
    int p = spi_flash_read(0x8c000, (uint32 *)&ssidAp, sizeof(ssidAp));
    os_printf("spi_flash_read: %d\n", p);
    os_printf("result ssid: %s\n", ssidAp.ssid);
    os_printf("result password: %s\n", ssidAp.passwd);
}
Проблему с перезагрузкой я походу решил, пример заработал, только когда я адрес сменил с "0х8с" на "0х7с"

Собственно у меня ещё есть вопрос, я как-то не до конца понимаю, сколько места я могу использовать и и какие адреса у этих мест. Я использую esp12e c 4МБ места, в принципе я туда довольно таки много записать смогу.

Подскажите что читать и куда смотреть, пдф я почитал, но там тоже не всё ясно(может быть только мне не ясно)
 

Garmin

Member
У вас при прошивке отображаются адреса записи?
У меня пишет адрес и процент записи при target Flash
Оттуда и пляшу. Хотя есть программа чтения ID флешки и определения размера, я собирался писать в конце флеша перед пользовательскими настройками, но что-то не срослось. Сейчас пишу в дырку между бинами.
 
Последнее редактирование:

de1m

New member
Оттуда и пляшу. Хотя есть программа чтения ID флешки и определения размера, я собирался писать в конце флеша перед пользовательскими настройками, но что-то не срослось. Сейчас пишу в дырку между бинами.
Вот тут нашел свою память - Winbond W25Q32BV, ну и даташит для неё тоже не проблема найти. Но как-то мне это сильно не помогает. Если посмотерть AT прошику, то последний "blank.bin" пишется с адреса 0x7e000 и занимает 4KБ, то есть идёт до 0x7F000, потом до esp_init_data 0x3fc000 получается пусто и я могу теоретически что-то писать, но если я что-то пишу по адресу 0х8С000, то данные пишутся и читаются, но чип уходит в ребут.
Сейчас я записал данные немного подальше 1с0*4096 = 1835008, вроде работает.

Можно посчитать(с запасом) и начать писать данные после первых 800КБ - (800*1024)/4096 = 200 = 0xC8

Но это конечно на esp12, где память целых 4МБ и можно с 800КБ начать. В версиях помладше (с 512КБ), там надо более точнее считать, но я думаю можно тупо вместо "blank.bin" писать, во всяком случае у меня работало.
 

Garmin

Member
У меня первый файл называется 0x00000.bin, пишется с адреса 0000 и имеет длину 38 кБайт, а второй файл 0x10000.bin пишется с адреса 10000 и имеет длину 254 кБайт
Я взял сектор 0x0D, это адрес 0xD000, и пишу туда. Это дырка между двумя записями во флеш (user data). Как я говорил, у меня ESP-12 с 1Мбайтом памяти, и вначале я использовал сектор 0xFF8. Но такой адрес (может по совсем другой причине) вызывал ошибку записи. Я остановился на секторе 0x00D и всё работает.
 

de1m

New member
Я помечу тему как "Решено". Я забыл написать ещё один момент, при прошивке надо указывать сколько память и метод записи (если я правильно понял) если этого не указывать, то запись всегда происходит с ошибкой.
Возможно это надо указывать только если используется "esptool". В общем это выгдит вот так для модели с 4МБ памяти:
esptool --port /dev/ttyUSB0 write_flash 0x00000 workspace/esp-hello-world/firmware/0x00000.bin 0x40000 workspace/esp-hello-world/firmware/0x40000.bin -fm dio -fs 32m
 
Сверху Снизу