Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Формирование HEX-файла для EEPROM МК
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
koluna
Здравствуйте!

Как можно сформировать HEX-файл для записи в EEPROM МК стандартными средствами WinAVR?
Или какими-либо другими средствами.

Благодарю заранее!
chief_olimp
данные EEPROM в листинге определяем приблизително таким образом
Код
unsigned int  EEMEM mount_counterE = 600;

компилятор сам сделает файл с расширением .eep
Да! Забыл. Необходимо подключить библиотечку #include <avr/eeprom.h>
Сергей Борщ
Цитата(chief_olimp @ Jul 29 2009, 17:14) *
компилятор сам сделает файл с расширением .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
<avr/eeprom.h>: EEPROM handling

Как я понял, эта директива помещает требуемую переменную в секцию ".eeprom" и, соответственно, в EEPROM память после применения avr-objcopy.
А если мне, скажем, надо инициализировать только два байта в середине EEPROM, то что делать?
Заводить массив объёмом EEPROM, руками его инициализировать и прописывать нужные байты?
Сергей Борщ
Цитата(n_bogoyavlensky @ Jul 29 2009, 19:37) *
А если мне, скажем, надо инициализировать только два байта в середине EEPROM, то что делать?
Ключевые слова здесь "в середине". А что делать с остальными байтами? Если вам они вообще не нужны - то вам надо поправить скрипт линкера и расположить секцию .eeprom в тех адресах, которые вас интересуют. Или при линковке указывать начальный адрес секции .eeprom ключем линкера --section-start
koluna
Цитата(Сергей Борщ @ Jul 29 2009, 17:36) *
Код
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".
Для чего этот параметр я не разобрался.
Добавил - всё равно не работает sad.gif

Вот что у меня было до изменения:
Цитата
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
Сергей Борщ
Цитата(n_bogoyavlensky @ Jul 30 2009, 08:20) *
Добавил - всё равно не работает sad.gif
Давайте так: Копируйте проект в отдельную папку, вырезйте все, оставьте только что-нибудь вроде
Код
#include  <avr/eeprom.h>

int i;
int EEMEM i_ee = 2;

void main()
{
   i = i_ee;
}
пробуйте. Если файл будет пустой - делайте make clean и весь проект в архивированном виде сюда. Я только что скомпилил - файл есть, двойка в нем присутствует.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.