Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прием данных по USART при нахождении программы в области бутлоадера.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
IVN2013
Доброго всем времени суток! Пишу 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-й функции и без прерываний. Спасибо!
_Артём_
Цитата(IVN2013 @ Jan 27 2014, 22:36) *
В данном варианте начальный старт обязательно происходит в части приложения и только потом по определнному сигналу - переход в область бутлоадера и все остальное.
Что мешает сбросить МК по определённому сигналу и перейти на бут с помощью соответствующим образом настроенных фуз? Сброс нужен чтобы привести МК в определённое состояние - в загрузчике трудно предусмотреть все варианты сброса периферии (мало ли как application её настроит). Ну да ладно - обсуждали уже...Дело ваше...

Цитата(IVN2013 @ Jan 27 2014, 22:36) *
Так вот - столкнулся с трудностью принятия массива байтов при нахождении программы в области бутлоадера(насколько я понимаю здесь прием долже быть не по прерыванию).
Неправильно понимаете - по прерыванию тоже можно принимать (если хочется). Нужно бит IVSEL в MCUCR настроить на таблицу в бутлоадере (к тому же выкинуть её из бута ещё постараться надо - всё равно место займёт).

Цитата(IVN2013 @ Jan 27 2014, 22:36) *
Не получается вызвать функцию приема из следующей функции (при размещении в области приложения все хорошо работало) :
Код
_[b]_attribute__((section(".bootloader"))) unsigned char USART_Receive(void)
[/b]

[b]{    
    while( !(UCSR1A & _BV(RXC1)) );
    return UDR1;
}[/b]

__attribute__((section(".bootloader"))) void boot_program_page(void)
      
{
    //стирание application сектора из flash памяти
    while (0x01cf00 > addr)
     {
         boot_page_erase(addr);        // стирание страницы
         boot_spm_busy_wait();        // задержка на время стирания
         addr += SPM_PAGESIZE;
     }
А зачем вам функции в загрузчике? Почему бы их на inline-функции не переделать? Ну это так, к слову.

Цитата(IVN2013 @ Jan 27 2014, 22:36) *
Код
            UCSR1B = (1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1)|(1<<TXCIE1);
            UCSR1C = (0<<UCSZ12)|(1<<UCSZ11)|(1<<UCSZ10)|(0<<USBS1)|(0<<UPM11)|(0<<UPM10);

(1<<RXCIE1)|(1<<TXCIE1); - прерывания по приёму зачем разрешены? А глобальные прерывания запрещены? Или нет? Может у вас байты application-программой принимаются? Можно только гадать - проекта нет. Да ещё и бут стартует не сразу после сброса - вариантов многовато...
IVN2013
Спасибо за ответ! Буду разбираться.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.