Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Bootloader Atxmega
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
KIG
Добрый вечер!

Пытаюсь освоить бутлоадер для Atxmega192A3. Прошить МК хочу через UART. Пишу программу загрузчика в AVR Studio 5. Использую прерывание по приему символа в UART. Когда устанавливаю PMIC.CTRL|=IVSEL и отсылаю символ в МК из терминальной программы, МК перезагружается. На следующий символ зависает. Если бит IVSEL не устанавливать, тогда все работает. Подскажите, пожалуйста, почему так происходит? И почему нельзя оставить вектора прерываний в начале FLASH памяти, зачем их надо перемещать в бут область?? Заранее спасибо.

Еще вопрос правильно ли я понял что область загрузчика начинается с адреса 0x30000. В даташите почему-то это не прописано..
_Артём_
Цитата(KIG @ Feb 23 2012, 19:19) *
МК перезагружается. На следующий символ зависает. Если бит IVSEL не устанавливать, тогда все работает. Подскажите, пожалуйста, почему так происходит?

Вы бы текст программы привели: причин может быть много.


Цитата(KIG @ Feb 23 2012, 19:19) *
Если бит IVSEL не устанавливать, тогда все работает. Подскажите, пожалуйста, почему так происходит?

Что работает? Если IVSEL=0, по обработчики прерываний находятся по адресу начиная от 0x0, а они должны быть расположены в области boot.

Цитата(KIG @ Feb 23 2012, 19:19) *
И почему нельзя оставить вектора прерываний в начале FLASH памяти, зачем их надо перемещать в бут область??

Потому что bootloader - отдельная программа со своей обработкой прерываний.

Цитата(KIG @ Feb 23 2012, 19:19) *
Еще вопрос правильно ли я понял что область загрузчика начинается с адреса 0x30000. В даташите почему-то это не прописано..

Да, правильно.
Прописано: ATxmega64_128_192_256A3 Preliminary.pdf 7. 7 Flash and EEPROM Page Size

P.S. Возьмите пример с сайта Atmel - там всё работает.
KIG
выкладываю текст программы:

CODE

#define BOOTLOADER_SECTION __attribute__ ((section (".bootloader")))

BOOTLOADER_SECTION ISR(USARTC0_RXC_vect) //GSM
{
char symbo;
short i0;

WDR();
putchar_ch('1');
symbo=USDR.DATA;
putchar_ch(symbo);
}

BOOTLOADER_SECTION void Vect_config(unsigned char Act)//Перенос таблицы векторов прерываний в область загрузчика
{
asm ("wdr");

if (Act==on) asm ("Ldi r16, 0x40|(1<<1)|(1<<2)|1");
//PMIC_IVSEL_bm|HILVLEN|MEDLVLEN|LOLVLEN - устанавливаем бит IVSEL и разрешаем все уровни прерываний
else asm ("clr r16");

asm ("Lds r17, 0x00A2 ");//PMIC.CTRL
asm ("or r17, r16");//temp = PMIC.CTRL | PMIC_IVSEL_bm;// Move Interrupt vector table to Boot Section.
asm ("Ldi r18, 0xD8");//CCP_IOREG_gc;
asm ("Out 0x34, r18");//CCP = CCP_IOREG_gc;
asm ("Sts 0x00A2, r17");//PMIC.CTRL=temp
}


BOOTLOADER_SECTION int main(void)
{
WDR();
CLI();
clock_8_start();
Vect_config(on);
//PMIC.CTRL=7;
UART_INIT();
SEI();
putchar_st(" Start \n\r");
while(1)
{
WDR();
}
}


Подскажите, пжлста, почему не работают прерывания в области загрузчика..
_Артём_
Цитата(KIG @ Feb 24 2012, 15:31) *
выкладываю текст программы:

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

У вас GCC. У меня с ним пока совсем плохо: текста программы мало, весь проект нужен.

Цитата(KIG @ Feb 24 2012, 15:31) *
Подскажите, пжлста, почему не работают прерывания в области загрузчика..

Могу предположить что у вас прерывания находятся не в области загрузчика: смотрите скрипт линкера(или что там ещё есть). Или можно посмотреть в AVRStudio(или в bin-файле) какие области памяти программ заполнены не FF: если а вас по адресам начиная с 0x00 что-то есть, то слинковалось неправильно.

P.S. Вы GSM обновлять программу собираетесь? А если в процессе обновления связь прервётся что тогда делать? ИМХО, не лучший вариант.
KIG
Цитата(_Артём_ @ Feb 24 2012, 20:47) *
У вас GCC. У меня с ним пока совсем плохо: текста программы мало, весь проект нужен.


Могу предположить что у вас прерывания находятся не в области загрузчика: смотрите скрипт линкера(или что там ещё есть). Или можно посмотреть в AVRStudio(или в bin-файле) какие области памяти программ заполнены не FF: если а вас по адресам начиная с 0x00 что-то есть, то слинковалось неправильно.

P.S. Вы GSM обновлять программу собираетесь? А если в процессе обновления связь прервётся что тогда делать? ИМХО, не лучший вариант.


Прошивку буду обновлять через GSM. Сначала полученную через GSM прошивку залью в резервную область, а потом после проверки контрольной суммы залью в рабочую область.

Действительно по адресам 0х0000 в hex файле что-то есть.. Выходит в AVR Studio надо где-то указать, чтоб линкер переносил таблицу векторов в бутобласть?? А зачем тогда устанавливать бит IVSEL?? Если я правильно понимаю, то бит IVSEL переносит аппаратно таблицу векторов прерываний.. или я не прав??
_Артём_
Цитата(KIG @ Feb 25 2012, 08:56) *
Прошивку буду обновлять через GSM.

А по какому каналу?GPRS?CSD?SMS?
В принципе 8к позволяют так делать.


Цитата(KIG @ Feb 25 2012, 08:56) *
Действительно по адресам 0х0000 в hex файле что-то есть.. Выходит в AVR Studio надо где-то указать, чтоб линкер переносил таблицу векторов в бутобласть??

Да, нужно что-то указать.

Цитата(KIG @ Feb 25 2012, 08:56) *
А зачем тогда устанавливать бит IVSEL?? Если я правильно понимаю, то бит IVSEL переносит аппаратно таблицу векторов прерываний.. или я не прав??

Да, верно - переносит, то есть действие нужное.
Но установка бит IVSEL - это команда для процесора, а не для линкера.
Нужно с makefile разбираться.

Попробуйте найти рабочий пример написания bootloader-а под AVRGCC (могут быть на сайте атмела, www.avrfreaks.net, или в комплекте с AVRStudio5 или просто гугл - bootloader avrgcc). Например: пример.

P.S. Отпишитесь как закончите: интересно какой GSM-фунционал можно впихнуть в 8к на AVRGCC.

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.