Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с Bootloader
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
stapleman
Написал в WINAVR bootloader для меги8. По усарту принимаю данные и пишу их в flash (это как должно быть).
А в реальность flash не меняется как я не пытался ее изменить.
Подскажите, пожалуйста, что я забыл сделать.

// flash заполняю так
void BootFlashPage(uint32_t page, uint8_t *buf){
boot_page_erase(page); // стирание страницы
boot_spm_busy_wait(); // ждать окончание стирания

for(uint8_t i = 0; i < BootPageSize; i += 2){
uint16_t Data =0;// *buf++; // формирование слова данных
Data |=0;// (*buf++) << 8; // формирование слова данных
boot_page_fill(page + i, Data); // записать в буфер bootloader-а
}

boot_page_write(page); // запись страницы во FLASH
boot_spm_busy_wait(); // ждать окончания записи
}

после этого пишу
boot_rww_enable();

считываю flash программатором и своими глазами вижу, что состояние памяти не изменилось
SysRq
Например, неправильно разместить загрузчик во flash (фьюзы BOOTSZ*, адрес начала секции загрузчика в datasheet'ах указан в словах, а не байтах), и забыть фьюз BOOTRST...

Код выкладывайте целиком.
stapleman
Цитата(SysRq @ Nov 9 2008, 14:18) *
адрес начала секции загрузчика в datasheet'ах указан в словах, а не байтах


Спасибо!
Зашивал bootloader не по тому адресу.
Исправил и заработало!
stapleman
В общем, вопрос указан в теме. Как корректно перейти в секциию загрузки из основной программы (для winavr). Я пробовал 2 варианта:
1. void (*jump_to_boot)(void) = 0x1c00;
jump_to_boot();
2. ( *( void( ** )()) 0x1c00 )();
В первом случае компилятор пишет warning, и в обоих случаях в секцию загрузчика не переходит.
SysRq
Низковато что-то метите.. опять word'ами считаете? smile.gif

А зачем вызов загрузчика из основной софтины? Обычно делают как раз наоборот, т.к. application вообще не должно знать про bootldr.
stapleman
Цитата(SysRq @ Nov 10 2008, 18:54) *
Низковато что-то метите.. опять word'ами считаете? smile.gif

А зачем вызов загрузчика из основной софтины? Обычно делают как раз наоборот, т.к. application вообще не должно знать про bootldr.


ну во-первых: на сей раз считаю байтами (0xe00*2=0x1c00, размер загрузчика 512 байт)

во-вторых: это нужно потому, модуль требующий прошивки новой программы связан с основным только шиной rs485, и резетить его нет возможности, а программу зашить надо - так как быть иначе?

и наконец в-третьих: вы не ответили на мой "основной" вопрос
Сергей Борщ
Код
extern void Loader();
        case CMD_UPDATE_FIRMWARE:
            if(packet_size == 0)    // if no parameters passed
            {
                cli();                
                Loader();
            }
            break;

LDFLAGS += -Wl,--defsym,Loader=0x1С00
stapleman
Цитата(Сергей Борщ @ Nov 10 2008, 19:54) *
LDFLAGS += -Wl,--defsym,Loader=0x1С00


Что-то не заработало sad.gif.
В файле .lst Loader расположен в области UNDEFINED SYMBOLS.
Сергей Борщ
Цитата(stapleman @ Nov 10 2008, 20:28) *
В файле .lst Loader расположен в области UNDEFINED SYMBOLS.
А куда указывает call в точке вызова Loader?

Выкусывайте все лишнее, выкладывайте проект из void main() { Loader(); } с листингами, будем смотреть.
stapleman
Спасибо, Сергей.
Заработало.
Как обычно виновата моя чертова невнимательность.
В общем ошибка заключалась в следующем: передатчик 485 включается и выключается портом меги. В программе загрузчика я "естественно" забыл инициализировать этот порт и "благодаря" помехам передатчик был открыт. Программа загружалась в меги и начинала выполняться. В ней я порт инициализировал и передатчик закрывался (я что ему зря работать). А при переходе в загрузчик он там не открывался, ответные команды не шли и я думал, что в загрузчик вообще программа не заходит.

В итоге все три способа (включая Ваш) попадания в загрузчик я опробовал, все работают.
GRJ
Цитата(stapleman @ Nov 11 2008, 00:09) *
В итоге все три способа (включая Ваш) попадания в загрузчик я опробовал, все работают.

А не могли бы исходник выложить? А то я тоже с bootloader'ом для меги8 мучаюсь.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.