Jump to content

    

stm32 EEPROM алгоритмы экономии ресурса ячеек

Девайс пишет при выключении питания в EEPROM значение int(4 байта). Из алгоритмов на ум приходит только запись в ячейки 10 000 циклов, потом смена ячеек. Но меняющийся счетчик циклов будет также хранится в ячейках EEPROM, запись в которые также ограничена. Как в этом случе быть?

 

Процессор STL32L151. EEPROM внутренняя. Пользуюсь функцией HAL_FLASHEx_DATAEEPROM_Program которая также пытается экономить ресурс ячеек. Теме не менее вопрос остался.

 

Почему возник вопрос - есть опасение что детектирование пропадание питания сработает слишком поздно - электролиту подпитки не хватит энергии питать процессор. Такое бывает если напряжение питания убывает плавно а не падает до нуля резко. Большой электролит возможности поставить уже нет. Батарею подпитки тоже. Хотелось бы писать параметры в EEPROM хотя бы раз в 5 минут. EEPROM размером 4K.

Edited by Димон Безпарольный

Share this post


Link to post
Share on other sites

Один из вариантов - писать каждый раз в новую группу ячеек EEPROM по кругу, это позволяет размазать износ на несколько ячеек и, соответсвенно, увеличить суммарный ресурс. Чтобы при чтении была возможность определить где последнее записанное значение частью записанного значения должен быть счетчик. Где между соседними записями значение счетчика меняется скачком, а не на 1 там и была сделана запись в прошлый раз.

Share this post


Link to post
Share on other sites
Один из вариантов - писать каждый раз в новую группу ячеек EEPROM по кругу, это позволяет размазать износ на несколько ячеек и, соответсвенно, увеличить суммарный ресурс. Чтобы при чтении была возможность определить где последнее записанное значение частью записанного значения должен быть счетчик. Где между соседними записями значение счетчика меняется скачком, а не на 1 там и была сделана запись в прошлый раз.

Но счетчик тоже в EEPROM писать надо. Это значит на 20 000 значений ресурс ячейки кончится.

Share this post


Link to post
Share on other sites

1. А там точно 10 000 циклов заявлено, не более?

2. Сколько времени (лет) должно работать устройство, чтобы израсходовать заявленный ресурс?

3. Литиевая батарейка, питающая BackUp память, спасет гиганта мысли.

Share this post


Link to post
Share on other sites
Но счетчик тоже в EEPROM писать надо. Это значит на 20 000 значений ресурс ячейки кончится.

Не нужно: к каждой записи добавляется номер, при инициализации лекго находится последняя.

Share this post


Link to post
Share on other sites

STM32L151 EEPROM 4K

Пишем по 8 байт (4 счетчик + 4 значение)

Достаем калькулятор

4 * 1024 / 8 = 512

512 * 5 = 2560 минут / 60 = 42 часа

42 * 10 000 = 420 000 часов / 24 = 17500 дней

17500 / 365 = 47 лет

 

 

Share this post


Link to post
Share on other sites
STM32L151 EEPROM 4K

Пишем по 8 байт (4 счетчик + 4 значение)

Достаем калькулятор

4 * 1024 / 8 = 512

512 * 5 = 2560 минут / 60 = 42 часа

42 * 10 000 = 420 000 часов / 24 = 17500 дней

17500 / 365 = 47 лет

Так годится. Спасибо. Я так понимаю в счетчике упаковано 2 значения - начальный адрес текущих ячеек данных и счетчик циклов текущих ячеек?

Edited by Димон Безпарольный

Share this post


Link to post
Share on other sites
Я так понимаю в счетчике упаковано 2 значения - начальный адрес текущих ячеек данных и счетчик циклов текущих ячеек?

Ни к чему там 2 значения и четыре байта: просто счетчик, разрядность которого

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

Получится массив записей счетчик-данные вида:

0365 <DATA>

0366 <DATA>

00BC <DATA>

00BD <DATA>

...

Понятно, что запись под номером 0366 является последней.

И с какой целью считать циклы?

Share this post


Link to post
Share on other sites

Одного бита хватило бы, чтобы показать, где проходит граница между новыми и старыми записями в выделенном пространстве. Сначала пишем, к примеру, 1. А как дошли до конца, начинаем сначала, и пишем уже 0. И т.д. По переходу из 1 в 0 или наоборот находим границу. Она всегда одна будет, "аномалия".

Придумал только что за 1 минуту. :rolleyes:

Share this post


Link to post
Share on other sites

Ещё минуту надо подумать.

Share this post


Link to post
Share on other sites

Минута истекла, ответ - в студию! B)

Share this post


Link to post
Share on other sites

Где будет граница после записи 1 в последнее слово EEPROM и перезагрузки устройства ?

"Ещё минуту надо было подумать"

это было пожелание к предыдущему посту.

Share this post


Link to post
Share on other sites
Где будет граница после записи 1 в последнее слово EEPROM и перезагрузки устройства ?

На нуле, например. А где еще?

 

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

содержимого памяти. Но это не всегда нужно.

Share this post


Link to post
Share on other sites

Там, в конце и будет. А если потом в нулевую ячейку запишем, в ней уже ноль запишем.

Бит - это так, пример. Нет смысла программировать один бит. Байт - другое дело. Или поле в байте.

Share this post


Link to post
Share on other sites

В даташите на STM32L151 сказано, что количество стираний EEPROM - 300.000 (рисунок внизу).

Размер стираемого/записываемого блока: Double word, Word, Half word, Byte.

 

Если предположить, что ресурс 300К относится к каждому Double word (64 бит или 8 байт), а остальных ячеек не касается, то ресурс записи всей памяти будет:

1) 4096 байт / 8 байт = 512 Double word-ячеек.

2) 512 * 300.000 = 153.600.000 перезаписей. 153 миллиона!!! :w00t:

3) если писать каждые 5 минут один Double word (8 байт), то: 153600000 * 5 / 1440 = 533333 суток, или 1461 год.

Выглядит заманчиво, но что-то мне не верится. Такой ресурс может быть только у FRAM.

 

Скорее всего 300.000 перезаписей относится ко всему блоку EEPROM 4K.

В этом случае ресурс записи в EEPROM такой (при одной записи каждые 5 минут):

1) 300.000 * 5 / 1440 = 1041 сутки, или 2 года и 311 суток :laughing:

post-45309-1533581103_thumb.png

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now