Доброго всем времени суток! Пишу 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-й функции и без прерываний. Спасибо!