Управление конфигурациями через EEPROM путем записи в шестнадцатеричный файл

attiny eeprom avrdude ide programmer

Я искал загрузчики I2C для сопроцессора ATTINY на плате, которую разрабатывал, и столкнулся с небольшой загвоздкой. Мне нужно определить, на какой плате работает код основного процессора, поскольку есть ряд периферийных устройств только для записи, которые я не могу проверить на наличие или конфигурацию (светодиоды серии WS2812 и экран SSD1306, среди некоторых других) , и я собирался управлять этим с помощью большого двоичного объекта конфигурации, хранящегося в ATTINY.

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

Таким образом, решением, по-видимому, является EEPROM, поскольку его можно настроить так, чтобы он сохранялся при попытках программирования (есть даже настройка предохранителя, чтобы сохранить его, хотя в другом случае, как AVR узнает, было ли оно запрограммировано [в эпоху загрузчики] я не уверен).

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

Однако меня это раздражает, особенно потому, что если что-то пойдет не так, это может испортить EEPROM.

Кто-нибудь знает, как использовать программатор ICSP для установки EEPROM, в идеале, как часть загрузки прошивки?

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

Некоторые мысли, которые у меня были:

  1. Каким-то образом измените/добавьте шестнадцатеричный файл, чтобы включить данные, которые передаются в EEPROM, а затем запишите его.
  2. Добавить скрипт в PlatformIO, который позволит мне редактировать/компилировать/загружать/что угодно в EEPROM (я не говорю на Python, поэтому мне нужна помощь)
  3. Использовать существующую функцию PlatformIO/процесс сборки/цепочку инструментов AVR для настройки конфигурации EEPROM (должен подозревать, что она есть, но Google, похоже, не указал ее)
  4. Как-то сделать это с AVRDude

, 👍0


1 ответ


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

2

AVRDUDE может программировать EEPROM. Я обычно делаю это во время записи прошивки — оператор может выбрать, какой блок конфигурации должен войти в плату во время выполнения цикла программирования. В некоторых случаях информация EEPROM даже генерируется программно во время цикла, чтобы содержать динамическую информацию, такую как серийный номер устройства и дату ввода в эксплуатацию.

Вот пример командной строки, которая запрограммирует файл filename.hex в EEPROM...

avrdude -c stk500v2 -P COM6 -p atmega328p -U eeprom:w:filename.hex:i

Команда записи AVRDUDE (U) имеет множество вариантов, чтобы делать почти все, что вы хотите...

-U memtype:op:filename[:format]
Perform a memory operation. Multiple ‘-U’ options can be specified in order to operate on multiple memories on the same command-line invocation. The memtype field specifies the memory type to operate on. Use the ‘-v’ option on the command line or the part command from terminal mode to display all the memory types supported by a particular device. Typically, a device’s memory configuration at least contains the memory types flash and eeprom. All memory types currently known are:
(...)
MEMTYPE:
eeprom
The EEPROM of the device.
(...)

OP:
w
read the specified file and write it to the specified device memory

(...)

FILENAME:
The filename field indicates the name of the file to read or write. The format field is optional and contains the format of the file to read or write. Possible values are:

i
Intel Hex

s
Motorola S-record

r
raw binary; little-endian byte order, in the case of the flash ROM data

e
ELF (Executable and Linkable Format), the final output file from the linker; currently only accepted as an input file

m
immediate mode; actual byte values specified on the command line, separated by commas or spaces in place of the filename field of the ‘-U’ option. This is useful for programming fuse bytes without having to create a single-byte file or enter terminal mode. If the number specified begins with 0x, it is treated as a hex value. If the number otherwise begins with a leading zero (0) it is treated as octal. Otherwise, the value is treated as decimal.

a
auto detect; valid for input only, and only if the input is not provided at stdin.

d
decimal; this and the following formats are only valid on output. They generate one line of output for the respective memory section, forming a comma-separated list of the values. This can be particularly useful for subsequent processing, like for fuse bit settings.

h
hexadecimal; each value will get the string 0x prepended.

o
octal; each value will get a 0 prepended unless it is less than 8 in which case it gets no prefix.

b
binary; each value will get the string 0b prepended.

The default is to use auto detection for input files, and raw binary format for output files.

Note that if filename contains a colon, the format field is no longer optional since the filename part following the colon would otherwise be misinterpreted as format.

As an abbreviation, the form -U filename is equivalent to specifying -U flash:w:filename:a. This will only work if filename does not have a colon in it.

Любой из этих типов файлов можно использовать в зависимости от того, какие данные вы записываете в EEPROM и как они генерируются.

Подробнее здесь... https://www.pololu.com/docs/0J67/5.8

,

Не могли бы вы уточнить, как мне создать шестнадцатеричный файл, который будет помещаться в EEPROM (если на то пошло, поддерживает ли он другие типы файлов и как это работает) или как я могу сгенерировать файл на лету, как указано? Добавление даты сборки или чего-то подобного, вероятно, было бы хорошей идеей..., @RDragonrydr

AVRDUDE поддерживает Intel Hex, Motorola S-Record и необработанные двоичные файлы. Насколько мне известно, Arduino использует [Intel Hex](https://en.wikipedia.org/wiki/Intel_HEX)., @Gerben

Ответ @RDragonrydr обновлен выдержкой из документации AVRDUDE, показывающей все виды использования данных., @bigjosh