реклама на сайте
подробности

 
 
> Формирование HEX-файла для EEPROM МК
koluna
сообщение Jul 29 2009, 14:06
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



Здравствуйте!

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

Благодарю заранее!


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
chief_olimp
сообщение Jul 29 2009, 14:14
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 249
Регистрация: 31-10-05
Из: Украина Нетешин
Пользователь №: 10 344



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

компилятор сам сделает файл с расширением .eep
Да! Забыл. Необходимо подключить библиотечку #include <avr/eeprom.h>

Сообщение отредактировал chief_olimp - Jul 29 2009, 14:35
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 29 2009, 14:36
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(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.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
koluna
сообщение Jul 29 2009, 16:37
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



<avr/eeprom.h>: EEPROM handling

Как я понял, эта директива помещает требуемую переменную в секцию ".eeprom" и, соответственно, в EEPROM память после применения avr-objcopy.
А если мне, скажем, надо инициализировать только два байта в середине EEPROM, то что делать?
Заводить массив объёмом EEPROM, руками его инициализировать и прописывать нужные байты?


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 29 2009, 16:53
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(n_bogoyavlensky @ Jul 29 2009, 19:37) *
А если мне, скажем, надо инициализировать только два байта в середине EEPROM, то что делать?
Ключевые слова здесь "в середине". А что делать с остальными байтами? Если вам они вообще не нужны - то вам надо поправить скрипт линкера и расположить секцию .eeprom в тех адресах, которые вас интересуют. Или при линковке указывать начальный адрес секции .eeprom ключем линкера --section-start


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
koluna
сообщение Jul 30 2009, 05:20
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



Цитата(Сергей Борщ @ 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, 05:22


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 30 2009, 10:01
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(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 и весь проект в архивированном виде сюда. Я только что скомпилил - файл есть, двойка в нем присутствует.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 13:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01744 секунд с 7
ELECTRONIX ©2004-2016