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

 
 
> Bootloader Atxmega
KIG
сообщение Feb 23 2012, 17:19
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 25-12-06
Пользователь №: 23 884



Добрый вечер!

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

Еще вопрос правильно ли я понял что область загрузчика начинается с адреса 0x30000. В даташите почему-то это не прописано..
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_Артём_
сообщение Feb 23 2012, 17:35
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(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 - там всё работает.
Go to the top of the page
 
+Quote Post
KIG
сообщение Feb 24 2012, 13:31
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 25-12-06
Пользователь №: 23 884



выкладываю текст программы:

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();
}
}


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

Сообщение отредактировал IgorKossak - Feb 24 2012, 18:34
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 22nd August 2025 - 18:06
Рейтинг@Mail.ru


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