svstn (20.08.2013 16:57, просмотров: 1632)
Имеется уже рабочая написанная прошивка для ATmega640. Хотелось бы, чтобы ее можно было прошить в память контроллера дистанционно по UARTу. Перенастроил память, выделив область для bootloader-a. Написал в IAR простейшую программу, принимающую байты прошивки по UART и записывающую их с нулевого адреса и до момента, пока они не закончатся. И везде все прекрасно работает кроме самой 1-ой страницы, где записаны вектора прерываний. Там записывается всякая белиберда. Изменил код на такой:
for(int i=0; i < 256; i+=2)
{
_FILL_TEMP_WORD(0x0000+i, 0xFFFF);
}
_PAGE_WRITE(0x0000);
_WAIT_FOR_SPM();
_ENABLE_RWW_SECTION();
Ожидалось, что вся страница заполнится байтами 0xFF.
Результат - 0xFFFF начинают записываться только с адреса 0x00E4, а с нулевого адреса и до него пишется 0x9518, т.е. команда возвращения из прерывания RETI. Покурил даташит, предположил, что контроллер не позволяет изменять свои вектора, если они определены в секции Application, а программа стартует с секции Bootloader. Перенес таблицу векторов:
/* Enable change of Interrupt Vectors */
MCUCR = (1<<IVCE);
/* Move interrupts to Boot Flash section */
MCUCR = (1<<IVSEL);
Никакой реакции, все осталось как и было. Помогите пожалуйста, я уже не знаю что и предположить(((