Можно ли использовать дополнительную флэш-память AVR в качестве энергонезависимого хранилища флэш-памяти типа EEPROM?
В микроконтроллерах STM32 можно использовать технологию, которую ST называет IAP, или программированием в приложении, для записи во флэш-память из работающего приложения. У них даже есть хорошее примечание к приложению (например: AN2594), где описывается действительно гениальный способ использования двух страниц флэш-памяти для эмуляции EEPROM с использованием «выравнивания износа» для снижения износа флэш-памяти во время циклов стирания.
Я годами задавался вопросом: может ли AVR сделать то же самое? Например, микроконтроллер ATmega328 в Arduino Uno, Nano и т. д. — Можно ли написать код для сохранения данных из вашего приложения во Flash-память, тем самым увеличив объём энергонезависимого хранилища, например, для сбора данных?
Если да, не могли бы вы подсказать мне какие-нибудь ресурсы или примеры, включая примеры кода, справочные руководства, спецификации и т. д., которые могут помочь мне реализовать это? Я немного поискал в спецификациях и пока ничего не нашёл, но, возможно, я просто недостаточно усердно ищу или недостаточно хорошо знаю, что ищу.
@Gabriel Staples, 👍3
1 ответ
Лучший ответ:
Ответ: «да, вы можете использовать дополнительную флэш-память AVR как энергонезависимое хранилище флэш-памяти типа EEPROM, очень похожее на микроконтроллер STM32».
Когда-нибудь я напишу библиотеку для Arduino, чтобы упростить задачу для новичков. Пока же я буду просто публиковать ссылки на ценные материалы с полными ответами, которые мне ещё предстоит изучить самостоятельно.
Документация по реализации чтения/записи флэш-памяти:
- Компания Atmel (теперь принадлежащая Microchip) часто называет это «самопрограммированием».
Чтобы найти эти ресурсы, я перешёл на главную страницу справки по ATmega328, нажал ссылку «Документация», а затем выполнил поиск на веб-странице по слову «flash».
Вот что я нашел (в порядке важности — сначала самые важные ссылки):
- AVR106: функции C для чтения и записи во флэш-память на устройствах tinyAVR и megaAVR
- «Описание: В этом примечании к применению представлены функции C для доступа к флэш-памяти с использованием самопрограммируемой программной памяти, что позволяет перепрограммировать флэш-память во время выполнения программы».
- Введение: Устройства Atmel® AVR® имеют функцию самопрограммируемой памяти программ. Эта функция позволяет устройству AVR перепрограммировать флэш-память во время выполнения программы. Такая функция полезна для приложений, которым необходимо самостоятельно обновлять прошивку или сохранять параметры во флэш-памяти. В этом руководстве по применению подробно описаны функции C для доступа к флэш-памяти.
- Данное примечание к применению содержит исходный код, включая следующие готовые к использованию функции C:
ReadFlashByte()ReadFlashPage()WriteFlashByte()WriteFlashPage()RecoverFlash()
- AVR105: энергоэффективное и долговечное хранилище параметров во флэш-памяти устройств tinyAVR и megaAVR
- AVR116: выравнивание износа на DataFlash
- Техническое описание ATmega328
- Раздел 30: Поддержка загрузчика – Самопрограммирование чтения во время записи (BTLDR), стр. 328–344.
- Как указал пользователь SDF в своём ответе, особое внимание следует уделить разделу 30.8: Самопрограммирование Flash, стр. 334–342.
- См. также раздел 12.2: Внутрисистемная перепрограммируемая флэш-память программ, стр. 36
- И Раздел 31.6: Размер страницы, стр. 349.
Обновление от февраля 2025 г.:
Смотрите также:
От: 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.
[это выглядит самым полезным из всех] комментарий @Juraj:
Загрузчик Optiboot, начиная с версии 8, поддерживает запись флеш-памяти. https://github.com/Optiboot/optiboot/tree/master/optiboot/examples/demo_flashwrite
- Arduino EEPROM сохраняет старые данные после прошивки новой программой
- EEPROM.get возвращает неверные данные
- Как постоянно считывать/записывать переменные на Arduino Due (без EEPROM/shield)?
- Файловая система внешней флэш-памяти
- ESP32: лучший способ встраивания сертификатов
- Как работает стирание EEPROM?
- Как установить начальное значение eeprom при перепрошивке ESP32
- Как функция/метод может определить, является ли передаваемый массив const PROGMEM (flash) или нет (RAM)?
Загрузчик Optiboot, начиная с версии 8, поддерживает запись флэш-памяти. https://github.com/Optiboot/optiboot/tree/master/optiboot/examples/demo_flashwrite, @Juraj
Спасибо, @Juraj, я добавил твой комментарий и ссылку в конец своего ответа. Теперь это самая полезная часть моего ответа., @Gabriel Staples
Она используется в моей библиотеке ArduionOTA для самостоятельного обновления Mega или других AVR с объёмом флеш-памяти не менее 64 КБ. Я создал эту библиотеку 6 лет назад., @Juraj