EEPROM терпит неудачу после написания 255 раз

Cron-DK
Пт, 02 июня 2017 г., 7:34 утра
Привет,

Я пытаюсь написать большой блок на странице eeprom. Но, кажется, терпит неудачу после 255 раз писания.
Этот маленький код POC демонстрирует проблему: void setup() { EEPROM.PageBase0 = 0x801F000; EEPROM.PageBase1 = 0x801F800; EEPROM.PageSize = 0x400; EEPROM.init(); EEPROM.format(); uint16 result; delay(10000); for (uint16 addr = 100; addr<400; addr++) { Serial.println( addr ); do { result = EEPROM.write( addr, random(65535) ); if ( result != 0 ) { Serial.println( "FAIL!" ); delay( 2000 ); EEPROM.init(); } } while ( result !=0 ); } }

Пито
Пт, 02 июня 2017 г. 10:40
Какой чип STM32 вы используете? Есть 2 -страничные размеры на основе используемого чипа.

Cron-DK
Пт, 02 июня 2017 г. 14:33
STM32F103C8T6

Пито
Пт, 02 июня 2017 г. 15:41
C8T6 - это всего лишь 64 КБ вспышка официально :)

RMDMOBA
Пт, 02 июня 2017 г., 16:28
Если у вас есть размер страницы 0x400, это означает 1kbyte или 256 32-битных слов. Каждое 32-битное слово эмулирует одну клевету EEPROM и содержит 16-битный адрес и 16-битные данные. Одно слово зарезервировано в целях управления, поэтому вы можете хранить 255 значений.
С уважением, Франц

Cron-DK
Пт, 02 июня 2017 г., 19:59
Спасибо, это имеет смысл :)

Есть ли способ узнать, где найти свободные банки? Есть ли определенное место, куда идет загрузчик, определенное место для основной программы? Когда я пытаюсь написать на постоянное количество страниц выше страницы 100 в более крупном эскизе, я не пишу на некоторых страницах. Основная программа действительно разбросана на страницах памяти?

С наилучшими пожеланиями,
Алекс

RMDMOBA
Пт, 02 июня 2017 г., 20:37
Крон-Д.К. написал:Основная программа действительно разбросана на страницах памяти?

Cron-DK
SAT 03 июня 2017 г. 9:25 утра
Звучит справедливо, что это линейно. Я использую загрузчик STM32Duino, так что я думаю, это начнется по адресу 0x08000000?
Как насчет кода, который я загружаю через загрузчик, куда это будет? сразу после?

С наилучшими пожеланиями,
Алекс

RMDMOBA
SAT 03 июня 2017 г. 10:07
Крон-Д.К. написал: Я использую загрузчик STM32Duino, так что я думаю, это начнется по адресу 0x08000000?

Cron-DK
SAT 03 июня 2017 г. 9:20 вечера
Привет снова,

Я много царапал голову, я наконец выяснил, что страница должна быть отформатирована до написания новых данных. Это правильный вывод? В этом примере я сначала форматирует страницу 60, затем без проблем заполняю его одним значением. На следующей записи eeprom.Запись возвращает код ошибки 129.

Это имеет какое -то отношение к второй странице, о которой вы говорите? Вот мой пример:
#include "EEPROM.h" #define PAGE_SIZE 0x400 #define MEM_START 0x8000000 void setup() { Serial.begin(115200); delay(10000); formatPage( 60 ); fillPage( 60, 0x1111 ); fillPage( 60, 0x9999 ); // Second write fails } void loop() { } void fillPage( uint8 page, uint16 writeValue ) { uint16 result; uint16 readValue; EEPROM.PageBase0 = MEM_START + ( page * PAGE_SIZE ); EEPROM.PageSize = PAGE_SIZE; for ( uint16 addr = 0; addr <= 254; addr++ ) { Serial.print( "Page: " ); Serial.print( page ); Serial.print( ", Addr: " ); Serial.print( addr ); Serial.print( ", Value: " ); Serial.print( writeValue, HEX ); result = EEPROM.write( addr, writeValue ); if ( result != 0 ) { Serial.print( ", ERROR number: " ); Serial.println( result ); } else { result = EEPROM.read( addr, &readValue ); if ( readValue != writeValue ) { Serial.println( ", Read Back ERROR" ); } else Serial.println( ", OK" ); } } } void formatPage( uint8_t page ) { EEPROM.PageBase0 = MEM_START + page * PAGE_SIZE; EEPROM.PageSize = PAGE_SIZE; EEPROM.format(); } :twisted:

Rogerclark
SAT 03 июня 2017 г. 11:02
Это общая проблема с большинством MCU, которые имеют только вспышку для хранения данных.

Существует ряд различных стратегий, чтобы обойти ограничения флэш -памяти, я.E вам нужно стереть всю страницу, просто чтобы написать один байт, и иметь ограниченные циклы стирания.

Я уверен, что для этого есть код для других MCU, которые вы могли бы адаптировать. эн.G Nordic NRF51 / NRF52 SDK имеет библиотеку, которая каким -то образом достигает этого.

Кроме того, как указывалось ранее, загрузчик находится на уровне 0x800000, затем эскиз (который является переменным размером) находится выше этого (обычно на 0x8002000).
Таким образом, большинство людей просто используют страницы Flash с конца доступного пространства, и многое, если люди предполагают, что F103C8 имеет 128K, даже если он продается как 64K.
Или просто купите Maple Mini, который гарантированно будет иметь 128 тыс

Cron-DK
Солнце 04 июня 2017 г., 7:45
Хорошо, я думаю, я понял это... Нашел это хорошее руководство по реализации на эмулированной вспышке:

http: // www.ул.com/content/ccc/resource/ ... 165693.PDF

Спасибо за все вклад :)

С наилучшими пожеланиями,
Алекс