koluna 0 29 июля, 2009 Опубликовано 29 июля, 2009 · Жалоба Здравствуйте! Как можно сформировать HEX-файл для записи в EEPROM МК стандартными средствами WinAVR? Или какими-либо другими средствами. Благодарю заранее! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
chief_olimp 0 29 июля, 2009 Опубликовано 29 июля, 2009 (изменено) · Жалоба данные EEPROM в листинге определяем приблизително таким образом unsigned int EEMEM mount_counterE = 600; компилятор сам сделает файл с расширением .eep Да! Забыл. Необходимо подключить библиотечку #include <avr/eeprom.h> Изменено 29 июля, 2009 пользователем chief_olimp Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 123 29 июля, 2009 Опубликовано 29 июля, 2009 · Жалоба компилятор сам сделает файл с расширением .eepКомпилятор сам делает только объектные файлы с расширением .o. Линкер их собирает в файлы с расширением (обычно) .elf. А вот уже из .elf утилита avr-objcopy умеет данные для eeprom скопировать в отдельный файл (обычно в формате Intel-HEX). Запускается утилита командой avr-objcopy -O ihex -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings <файл.elf> <файл.eep> Другое дело, что плугин студии сам дописывает эту команду в makefile. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
koluna 0 29 июля, 2009 Опубликовано 29 июля, 2009 · Жалоба <avr/eeprom.h>: EEPROM handling Как я понял, эта директива помещает требуемую переменную в секцию ".eeprom" и, соответственно, в EEPROM память после применения avr-objcopy. А если мне, скажем, надо инициализировать только два байта в середине EEPROM, то что делать? Заводить массив объёмом EEPROM, руками его инициализировать и прописывать нужные байты? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 123 29 июля, 2009 Опубликовано 29 июля, 2009 · Жалоба А если мне, скажем, надо инициализировать только два байта в середине EEPROM, то что делать?Ключевые слова здесь "в середине". А что делать с остальными байтами? Если вам они вообще не нужны - то вам надо поправить скрипт линкера и расположить секцию .eeprom в тех адресах, которые вас интересуют. Или при линковке указывать начальный адрес секции .eeprom ключем линкера --section-start Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
koluna 0 30 июля, 2009 Опубликовано 30 июля, 2009 (изменено) · Жалоба avr-objcopy -O ihex -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings <файл.elf> <файл.eep> Самое интересное, что эта строчка у меня была, но формировался пустой файл HEX (13 байт). Но эта строчка отличалась от Вашей отсутствием --set-section-flags=.eeprom="alloc,load". Для чего этот параметр я не разобрался. Добавил - всё равно не работает :( Вот что у меня было до изменения: avr-size --mcu=atmega168 --format=avr $(TARGET_OUTPUT_FILE) avr-objcopy -O ihex -R .eeprom -R .eesafe $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_FILE).hex avr-objcopy --no-change-warnings -j .eeprom --change-section-lma .eeprom=0 -O ihex $(TARGET_OUTPUT_FILE) $(TARGET_OUTPUT_FILE).eep.hex Изменено 30 июля, 2009 пользователем n_bogoyavlensky Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 123 30 июля, 2009 Опубликовано 30 июля, 2009 · Жалоба Добавил - всё равно не работает :(Давайте так: Копируйте проект в отдельную папку, вырезйте все, оставьте только что-нибудь вроде #include <avr/eeprom.h> int i; int EEMEM i_ee = 2; void main() { i = i_ee; } пробуйте. Если файл будет пустой - делайте make clean и весь проект в архивированном виде сюда. Я только что скомпилил - файл есть, двойка в нем присутствует. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться