Доброго всем времени суток! Пишу bootloader (загрузчик) для m128 на AVR GCC. В данном варианте начальный старт обязательно происходит в части приложения и только потом по определнному сигналу - переход в область бутлоадера и все остальное. Так вот - столкнулся с трудностью принятия массива байтов при нахождении программы в области бутлоадера(насколько я понимаю здесь прием долже быть не по прерыванию). Не получается вызвать функцию приема из следующей функции (при размещении в области приложения все хорошо работало) :
__attribute__((section(".bootloader"))) unsigned char USART_Receive(void) { while( !(UCSR1A & _BV(RXC1)) ); return UDR1; }
__attribute__((section(".bootloader"))) void boot_program_page(void) { //стирание application сектора из flash памяти while (0x01cf00 > addr) { boot_page_erase(addr); // стирание страницы boot_spm_busy_wait(); // задержка на время стирания addr += SPM_PAGESIZE; } boot_rww_enable(); UBRR1L = 0x03; UBRR1H = 0x00; UCSR1A = 0x00; UCSR1B = (1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1)|(1<<TXCIE1); UCSR1C = (0<<UCSZ12)|(1<<UCSZ11)|(1<<UCSZ10)|(0<<USBS1)|(0<<UPM11)|(0<<UPM10); uint8_t buf1; while (1) { buf1 = USART_Receive(); UDR1 = buf1; }
Пробовал также принимать в цикле : while (1) { while( !(UCSR1A & _BV(RXC1)) ) {buf = UDR1; и отправляю для проверки:UDR1 = buf1;} }, но правильного результата так и не получил.
Подскажите, как можно организовать прием байтов в пределах 1-й функции и без прерываний. Спасибо!
|