• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Не пишет во флеш

Добрый вечер всем!
Взял за основу этот пример:
Код:
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);
}
От уважаемого Garmin

Создал свои функции чтения и записи:

Код:
struct wConf // предварительно объявил структуры и переменные
{
   char ssid[32];
   char passwd[64];
   char id_send0[24];
   char id_send1[24];
};
struct wConf wifiApConf;

struct wConf ssidAp;


char ssid_str[32] = "CO2";
char pass_str[64] = "co2passwd";
char id_send0_str[8] = "012EF412";
char id_send1_str[8] = "012EF419";

Код:
void data_read()
{
      spi_flash_read(0x7c000, (uint32 *)&ssidAp, sizeof(ssidAp));

}

void data_write()
{
    os_memcpy(wifiApConf.ssid, &ssid_str, sizeof (ssid_str));
    os_memcpy(wifiApConf.passwd, &pass_str, sizeof (pass_str));
    os_memcpy(wifiApConf.id_send0, &id_send0_str, sizeof (id_send0_str));
    os_memcpy(wifiApConf.id_send1, &id_send1_str, sizeof (id_send1_str));

    spi_flash_erase_sector(0x7c);
    spi_flash_write(0x7c000, (uint32 *)&wifiApConf, sizeof(wifiApConf));
}
так пишу в переменную и сразу пытаюсь сохранить и прочитать:

Код:
else if(string_search("AT+AP_NSET=",cmdBuffer))
{

    x=0;
    while(cmdBuffer[x++]!=0)
    {
         y++;
    }

    for(x=11; x<y; x++)ssid_str[x-11] = cmdBuffer[x];
    //os_memcpy(wifiApConf.ssid, &buff_at, sizeof (buff_at));

    data_write();
y=0;
    data_read();
#ifdef PLATFORM_DEBUG
     ets_uart_printf("wifiApConf=%s \r\n", ssidAp.ssid);
     ets_uart_printf("%s \r\n", ssid_str);
     ets_uart_printf("NSET OK\r\n");
     clear_buf();
#endif
}
В отладке показывает что данные успешно сохранились и они правильные

После этого перезагружаю модуль и посылаю команду чтения из флеш параметра:

Код:
else if(string_search("AT+AP_NSET?",cmdBuffer))
{
    data_read();
#ifdef PLATFORM_DEBUG
    ets_uart_printf("result ssid: %s\n", ssidAp.ssid);
#endif
    clear_buf();
}
И считывается ерунда!
Как победить проблему? Помогите пожалуйста .
 
При записи строки отображается в терминале:

Командой:
AT+AP_NSET=1234
получаю:
wifiApConf=1234

1234

NSET OK

Проверяю:
командой:
AT+AP_NSET?
получаю:
result ssid: 1234
Вроде как все работает :)

Пробую перезагружать модуль...
После перезагрузки модуля:

командой проверяю:
AT+AP_NSET?
получаю:
result ssid: |
То есть прочитался какой то мусор..
 

de1m

New member
Эту проблему походу все проходят. Какой модуль? Сколько памяти?
У меня была похожая проблема с есп12, у которого 4МБ память. Там надо было при прошивке указывать сколько у меня памяти. Но это было в линуксе.

В общем у меня тоже писал, но правильно прочитать не мог.
Команда для прошики выглядела вот так:
$(ESPTOOL) --port $(ESPPORT) write_flash $(FW_FILE_1_ADDR) $(FW_FILE_1) $(FW_FILE_2_ADDR) $(FW_FILE_2) -fm dio -fs 32m
 

de1m

New member
Та строка выше это у меня в makefile написано. А для прошивки в линуксе исользутеся esptool.
Целиком команда выглядит так:
./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
 
Что то не вижу строки в makefile где бы указывался размер флешь:
Код:
#############################################################
#
# Root Level Makefile
#
# Version 2.0
#
# (c) by CHERTS <sleuthhound@gmail.com>
#
#############################################################

BUILD_BASE    = build
FW_BASE        = firmware

# Base directory for the compiler
XTENSA_TOOLS_ROOT ?= c:/Espressif/xtensa-lx106-elf/bin

# base directory of the ESP8266 SDK package, absolute
SDK_BASE    ?= c:/Espressif/ESP8266_SDK
SDK_TOOLS    ?= c:/Espressif/utils

# esptool path and port
ESPTOOL ?= $(SDK_TOOLS)/esptool.exe
ESPPORT ?= COM3
# Baud rate for programmer
BAUD ?= 256000

# SPI_SPEED = 40, 26, 20, 80
SPI_SPEED ?= 40
# SPI_MODE: qio, qout, dio, dout
SPI_MODE ?= qio
# SPI_SIZE_MAP
# 0 : 512 KB (256 KB + 256 KB)
# 1 : 256 KB
# 2 : 1024 KB (512 KB + 512 KB)
# 3 : 2048 KB (512 KB + 512 KB)
# 4 : 4096 KB (512 KB + 512 KB)
# 5 : 2048 KB (1024 KB + 1024 KB)
# 6 : 4096 KB (1024 KB + 1024 KB)
SPI_SIZE_MAP ?= 0

ifeq ($(SPI_SPEED), 26.7)
    freqdiv = 1
    flashimageoptions = -ff 26m
else
    ifeq ($(SPI_SPEED), 20)
        freqdiv = 2
        flashimageoptions = -ff 20m
    else
        ifeq ($(SPI_SPEED), 80)
            freqdiv = 15
            flashimageoptions = -ff 80m
        else
            freqdiv = 0
            flashimageoptions = -ff 40m
        endif
    endif
endif

ifeq ($(SPI_MODE), QOUT)
    mode = 1
    flashimageoptions += -fm qout
else
    ifeq ($(SPI_MODE), DIO)
        mode = 2
        flashimageoptions += -fm dio
    else
        ifeq ($(SPI_MODE), DOUT)
            mode = 3
            flashimageoptions += -fm dout
        else
            mode = 0
            flashimageoptions += -fm qio
        endif
    endif
endif

ifeq ($(SPI_SIZE_MAP), 1)
  size_map = 1
  flash = 256
  flashimageoptions += -fs 2m
else
  ifeq ($(SPI_SIZE_MAP), 2)
    size_map = 2
    flash = 1024
    flashimageoptions += -fs 8m
  else
    ifeq ($(SPI_SIZE_MAP), 3)
      size_map = 3
      flash = 2048
      flashimageoptions += -fs 16m
    else
      ifeq ($(SPI_SIZE_MAP), 4)
        size_map = 4
        flash = 4096
        flashimageoptions += -fs 32m
      else
        ifeq ($(SPI_SIZE_MAP), 5)
          size_map = 5
          flash = 2048
          flashimageoptions += -fs 16m
        else
          ifeq ($(SPI_SIZE_MAP), 6)
            size_map = 6
            flash = 4096
            flashimageoptions += -fs 32m
          else
            size_map = 0
            flash = 512
            flashimageoptions += -fs 4m
          endif
        endif
      endif
    endif
  endif
endif

# name for the target project
TARGET = app

# which modules (subdirectories) of the project to include in compiling
MODULES    = driver user
EXTRA_INCDIR = include $(SDK_BASE)/../extra/include

# libraries used in this project, mainly provided by the SDK
LIBS = c gcc hal phy pp net80211 lwip wpa main crypto

# compiler flags using during compilation of source files
CFLAGS = -Os -g -O2 -std=gnu90 -Wpointer-arith -Wundef -Werror -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals -mno-serialize-volatile -D__ets__ -DICACHE_FLASH

# linker flags used to generate the main object file
LDFLAGS = -nostdlib -Wl,--no-check-sections -u call_user_start -Wl,-static

# linker script used for the above linkier step
LD_SCRIPT = eagle.app.v6.ld

# various paths from the SDK used in this project
SDK_LIBDIR    = lib
SDK_LDDIR    = ld
SDK_INCDIR    = include include/json

# select which tools to use as compiler, librarian and linker
CC    := $(XTENSA_TOOLS_ROOT)/xtensa-lx106-elf-gcc
AR    := $(XTENSA_TOOLS_ROOT)/xtensa-lx106-elf-ar
LD    := $(XTENSA_TOOLS_ROOT)/xtensa-lx106-elf-gcc
OBJCOPY := $(XTENSA_TOOLS_ROOT)/xtensa-lx106-elf-objcopy
OBJDUMP := $(XTENSA_TOOLS_ROOT)/xtensa-lx106-elf-objdump

# no user configurable options below here
SRC_DIR        := $(MODULES)
BUILD_DIR    := $(addprefix $(BUILD_BASE)/,$(MODULES))
SDK_LIBDIR    := $(addprefix $(SDK_BASE)/,$(SDK_LIBDIR))
SDK_INCDIR    := $(addprefix -I$(SDK_BASE)/,$(SDK_INCDIR))
SRC            := $(foreach sdir,$(SRC_DIR),$(wildcard $(sdir)/*.c))
OBJ            := $(patsubst %.c,$(BUILD_BASE)/%.o,$(SRC))
LIBS        := $(addprefix -l,$(LIBS))
APP_AR        := $(addprefix $(BUILD_BASE)/,$(TARGET)_app.a)
TARGET_OUT    := $(addprefix $(BUILD_BASE)/,$(TARGET).out)

LD_SCRIPT    := $(addprefix -T$(SDK_BASE)/$(SDK_LDDIR)/,$(LD_SCRIPT))

INCDIR            := $(addprefix -I,$(SRC_DIR))
EXTRA_INCDIR    := $(addprefix -I,$(EXTRA_INCDIR))
MODULE_INCDIR    := $(addsuffix /include,$(INCDIR))

V ?= $(VERBOSE)
ifeq ("$(V)","1")
Q :=
vecho := @true
else
Q := @
vecho := @echo
endif

vpath %.c $(SRC_DIR)

define compile-objects
$1/%.o: %.c
    $(vecho) "CC $$<"
    $(Q) $(CC) $(INCDIR) $(MODULE_INCDIR) $(EXTRA_INCDIR) $(SDK_INCDIR) $(CFLAGS)  -c $$< -o $$@
endef

.PHONY: all checkdirs clean flash flashinit flashonefile rebuild

all: checkdirs $(TARGET_OUT)

$(TARGET_OUT): $(APP_AR)
    $(vecho) "LD $@"
    $(Q) $(LD) -L$(SDK_LIBDIR) $(LD_SCRIPT) $(LDFLAGS) -Wl,--start-group $(LIBS) $(APP_AR) -Wl,--end-group -o $@
    $(vecho) "------------------------------------------------------------------------------"
    $(vecho) "Section info:"
    $(Q) $(OBJDUMP) -h -j .data -j .rodata -j .bss -j .text -j .irom0.text $@
    $(vecho) "------------------------------------------------------------------------------"
    $(Q) $(ESPTOOL) elf2image $(TARGET_OUT) -o$(FW_BASE)/ $(flashimageoptions)
    $(vecho) "------------------------------------------------------------------------------"
    $(vecho) "Generate 0x00000.bin and 0x40000.bin successully in folder $(FW_BASE)."
    $(vecho) "0x00000.bin-------->0x00000"
    $(vecho) "0x40000.bin-------->0x40000"
    $(vecho) "Done"

$(APP_AR): $(OBJ)
    $(vecho) "AR $@"
    $(Q) $(AR) cru $@ $^

checkdirs: $(BUILD_DIR) $(FW_BASE)

$(BUILD_DIR):
    $(Q) mkdir -p $@

$(FW_BASE):
    $(Q) mkdir -p $@

flashonefile: all
    $(SDK_TOOLS)/gen_flashbin.exe $(FW_BASE)/0x00000.bin $(FW_BASE)/0x40000.bin 0x40000
    $(Q) mv eagle.app.flash.bin $(FW_BASE)/
    $(vecho) "Generate eagle.app.flash.bin successully in folder $(FW_BASE)."
    $(vecho) "eagle.app.flash.bin-------->0x00000"
    $(ESPTOOL) -p $(ESPPORT) -b $(BAUD) write_flash $(flashimageoptions) 0x00000 $(FW_BASE)/eagle.app.flash.bin

flash: all
    $(ESPTOOL) -p $(ESPPORT) -b $(BAUD) write_flash $(flashimageoptions) 0x00000 $(FW_BASE)/0x00000.bin 0x40000 $(FW_BASE)/0x40000.bin

# ===============================================================
# From http://bbs.espressif.com/viewtopic.php?f=10&t=305
# master-device-key.bin is only need if using espressive services
# master_device_key.bin 0x3e000 is not used , write blank
# See 2A-ESP8266__IOT_SDK_User_Manual__EN_v1.1.0.pdf
# http://bbs.espressif.com/download/file.php?id=532
#
# System parameter area is the last 16KB of flash
# 512KB flash - system parameter area starts from 0x7C000 
#     download blank.bin to 0x7E000 as initialization.
# 1024KB flash - system parameter area starts from 0xFC000 
#     download blank.bin to 0xFE000 as initialization.
# 2048KB flash - system parameter area starts from 0x1FC000 
#     download blank.bin to 0x1FE000 as initialization.
# 4096KB flash - system parameter area starts from 0x3FC000 
#     download blank.bin to 0x3FE000 as initialization.
# ===============================================================

# FLASH SIZE
flashinit:
    $(vecho) "Flash init data:"
    $(vecho) "Default config (Clear SDK settings):"
    $(vecho) "blank.bin-------->0x3e000"
    $(vecho) "blank.bin-------->0x3fc000"
    $(vecho) "esp_init_data_default.bin-------->0x3fc000"
    $(ESPTOOL) -p $(ESPPORT) write_flash $(flashimageoptions) \
        0x3e000 $(SDK_BASE)/bin/blank.bin \
        0x3fc000 $(SDK_BASE)/bin/esp_init_data_default.bin \
        0x3fe000 $(SDK_BASE)/bin/blank.bin

rebuild: clean all

clean:
    $(Q) rm -f $(APP_AR)
    $(Q) rm -f $(TARGET_OUT)
    $(Q) rm -rf $(BUILD_DIR)
    $(Q) rm -rf $(BUILD_BASE)
    $(Q) rm -rf $(FW_BASE)

$(foreach bdir,$(BUILD_DIR),$(eval $(call compile-objects,$(bdir))))
 
Нашел в makefile где указывается размер , но как узнать размер флешки в модуле? Экран запаян наглухо ...
 

de1m

New member
у esptool есть команда либо "chip_id" либо "flash_id" одна из них показывает названия флеш чипа, а потом гуглить
 
Сверху Снизу