Можно ли использовать дополнительную флэш-память AVR в качестве энергонезависимого хранилища флэш-памяти типа EEPROM?

В микроконтроллерах STM32 можно использовать технологию, которую ST называет IAP, или программированием в приложении, для записи во флэш-память из работающего приложения. У них даже есть хорошее примечание к приложению (например: AN2594), где описывается действительно гениальный способ использования двух страниц флэш-памяти для эмуляции EEPROM с использованием «выравнивания износа» для снижения износа флэш-памяти во время циклов стирания.

Я годами задавался вопросом: может ли AVR сделать то же самое? Например, микроконтроллер ATmega328 в Arduino Uno, Nano и т. д. — Можно ли написать код для сохранения данных из вашего приложения во Flash-память, тем самым увеличив объём энергонезависимого хранилища, например, для сбора данных?

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

, 👍3


1 ответ


Лучший ответ:

5

Ответ: «да, вы можете использовать дополнительную флэш-память AVR как энергонезависимое хранилище флэш-памяти типа EEPROM, очень похожее на микроконтроллер STM32».

Когда-нибудь я напишу библиотеку для Arduino, чтобы упростить задачу для новичков. Пока же я буду просто публиковать ссылки на ценные материалы с полными ответами, которые мне ещё предстоит изучить самостоятельно.

Документация по реализации чтения/записи флэш-памяти:

- Компания Atmel (теперь принадлежащая Microchip) часто называет это «самопрограммированием».

Чтобы найти эти ресурсы, я перешёл на главную страницу справки по ATmega328, нажал ссылку «Документация», а затем выполнил поиск на веб-странице по слову «flash».

Вот что я нашел (в порядке важности — сначала самые важные ссылки):

  1. AVR106: функции C для чтения и записи во флэш-память на устройствах tinyAVR и megaAVR
  2. «Описание: В этом примечании к применению представлены функции C для доступа к флэш-памяти с использованием самопрограммируемой программной памяти, что позволяет перепрограммировать флэш-память во время выполнения программы».
  3. Введение: Устройства Atmel® AVR® имеют функцию самопрограммируемой памяти программ. Эта функция позволяет устройству AVR перепрограммировать флэш-память во время выполнения программы. Такая функция полезна для приложений, которым необходимо самостоятельно обновлять прошивку или сохранять параметры во флэш-памяти. В этом руководстве по применению подробно описаны функции C для доступа к флэш-памяти.
  4. Данное примечание к применению содержит исходный код, включая следующие готовые к использованию функции C:
  • ReadFlashByte()
  • ReadFlashPage()
  • WriteFlashByte()
  • WriteFlashPage()
  • RecoverFlash()
  1. AVR105: энергоэффективное и долговечное хранилище параметров во флэш-памяти устройств tinyAVR и megaAVR
  2. AVR116: выравнивание износа на DataFlash
  3. Техническое описание ATmega328
  • Раздел 30: Поддержка загрузчика – Самопрограммирование чтения во время записи (BTLDR), стр. 328–344.
  • Как указал пользователь SDF в своём ответе, особое внимание следует уделить разделу 30.8: Самопрограммирование Flash, стр. 334–342.
  • См. также раздел 12.2: Внутрисистемная перепрограммируемая флэш-память программ, стр. 36
  • И Раздел 31.6: Размер страницы, стр. 349.

Обновление от февраля 2025 г.:

Смотрите также:

  1. От: https://blog.gistre.epita.fr/posts/besma.talbi-2024-10-10-navigating_the_complexity_of_emulating_diversive_microcontroller_architectures-pre-emulation/ :

    Инструкция Store Program Memory (SPM), необходимая для записи во флэш-память приложения, должна находиться в разделе Boot Program.

  2. [это выглядит самым полезным из всех] комментарий @Juraj:

    Загрузчик Optiboot, начиная с версии 8, поддерживает запись флеш-памяти. https://github.com/Optiboot/optiboot/tree/master/optiboot/examples/demo_flashwrite

,

Загрузчик Optiboot, начиная с версии 8, поддерживает запись флэш-памяти. https://github.com/Optiboot/optiboot/tree/master/optiboot/examples/demo_flashwrite, @Juraj

Спасибо, @Juraj, я добавил твой комментарий и ссылку в конец своего ответа. Теперь это самая полезная часть моего ответа., @Gabriel Staples

Она используется в моей библиотеке ArduionOTA для самостоятельного обновления Mega или других AVR с объёмом флеш-памяти не менее 64 КБ. Я создал эту библиотеку 6 лет назад., @Juraj