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

 
 
 
Reply to this topicStart new topic
> Прием данных по USART при нахождении программы в области бутлоадера.
IVN2013
сообщение Jan 27 2014, 20:36
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 12-08-13
Пользователь №: 77 889



Доброго всем времени суток! Пишу 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-й функции и без прерываний. Спасибо!
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jan 27 2014, 21:07
Сообщение #2


Гуру
******

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



Цитата(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-программой принимаются? Можно только гадать - проекта нет. Да ещё и бут стартует не сразу после сброса - вариантов многовато...
Go to the top of the page
 
+Quote Post
IVN2013
сообщение Feb 3 2014, 20:01
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 12-08-13
Пользователь №: 77 889



Спасибо за ответ! Буду разбираться.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 14th July 2025 - 12:50
Рейтинг@Mail.ru


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