BootLoader Atmega128 Atmel Studio

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 3
Зарегистрирован: Пт дек 16, 2016 15:51:05

Сообщение Tbrcat »

Нужен BootLoader для Atmega128A для Atmel Studio

Написал в последней версии Atmel Studio 4-килобайтную программу на С++, которая умеет через USART вытягивать шифрованные 120 килобайт данных, CRC сходятся, на экранчике проценты прошивки выводятся, переключение между бутлоадером и программой через джампер придумано и т.д. Фьюзы BOOTSZ 4096 words, BOOTRST вкл.

Но возникли проблемы:
1. Как записать программу в последние 4 килобайта прошивки? "-Wl,--section-start=.boot=0xF000" не компилируется.
2. Как записать во флеш 256 байт (размер страницы памяти)?
В #include <avr/boot.h> есть пример функции boot_program_page (uint32_t page, uint8_t *buf)
Я в него запихиваю любой адрес, массив, функция исполняется, но данные никуда не записывает.
Аналоги из чужих исходников типа static inline uint16_t writeFlashPage(uint16_t waddr, pagebuf_t size)
тоже не работают. Может дело в том, что программа расположена в секции программы, а не бутлоадера?
3. Что ещё надо сделать, чтобы получился полноценный бутлоадер. Как фьюзами закрыться и т.д.

В инете вообще исходники бутлоадера в Atmel Studio не находятся. На форуме тоже ничего не нашёл.

Кратко говоря, надо исходник на C++ для Atmega128 в Atmel Studio 7, который прошьёт себя в секцию бутлоадера и запишет по 0 адресу: "Hello World".
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Родился
Сообщения: 3
Зарегистрирован: Пт дек 16, 2016 15:51:05

Сообщение Tbrcat »

Z_h_e писал(а):http://radiokot.ru/forum/viewtopic.php?p=2873909#p2873909
Добавил в alt -> Project -> Properties -> Toolchain -> AVR/GNU Linker -> Memory Settings ->FLASH segment
Запись: ".bootmem=0xF000".

В исходном коде пишу

Код: Выделить всё

void boot_program_page (uint32_t page, uint8_t *buf); __attribute__ ((section (".bootmem")))
либо

Код: Выделить всё

void boot_program_page (uint32_t page, uint8_t *buf){...} __attribute__ ((section (".bootmem")))
Открыл прошивку, действительно, часть программы сместилась к адресу :10E00000, но большая часть всё ещё в начале. Надо после каждой функции этот атрибут писать?
Вложения
bootsection2.png
(27.02 КБ) 392 скачивания
Родился
Сообщения: 3
Зарегистрирован: Пт дек 16, 2016 15:51:05

Сообщение Tbrcat »

Совет был неправильный, как и сотни других советов, которые я перелопатил в инете.

Дельных советов в инете нет, поэтому напишу, как сделать Бутлоадер в Atmel Studio 7 на C++ для Atmega128.

1. Добавляем в alt -> Project -> Properties -> Toolchain -> AVR/GNU Linker -> Memory Settings ->FLASH segment
Запись: ".text=0xF000". Теперь вся программа располагается с адреса 0x1E000. Совет использовать "__attribute__ ((section" на десятках форумов - подстава и пустая трата времени, он нужен, чтобы бутлоадер и основную программу писать в одном проекте.

2. Ставим фьюзы в alt -> Tools -> Device Programming -> Fuses
BOOTSZ $F000 для загрузчика размером 8 килобайт.
BOOTRST on, чтобы загрузка при включении начиналась с адреса 0xF000 words (0x1E000 bytes).

3. Добавляем

Код: Выделить всё

uint8_t temp=MCUCR;
MCUCR|=(1<<IVCE);
MCUCR=temp|(1<<IVSEL);
в самом начале программы. Тогда прерывания будут работать в бутлоадере. Другие модификации этого кода без temp не работают.

4. Оптимизация -Os по умолчанию.

5. PSTR, memcmp_P и прочие _P не работают по умолчанию и их нет смысла использовать, так как оперативки полно.

6. Переход в основную прошивку можно делать любой из команд:

Код: Выделить всё

void* mainprog= (void *) 0;
goto *mainprog;

((void (*)())0x0000)();

asm("jmp 0x0000");
Если переходить сразу после прошивки, то придётся откручивать MCUCR обратно.

7. Пример функции записи страницы в память есть в файле avr/boot.h, который всё равно придётся подключать.

8. На всякий случай к прошивке можно добавить пару сотен байт нулей или хотя бы до конца страницы памяти.

Если бы я сразу встретил этот пост, то сэкономил бы часов 50 своего времени и много нервов на перерывание даташитов и испытания неработающих советов.
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Аватара пользователя
Сообщения: 580
Зарегистрирован: Сб дек 27, 2008 12:01:35
Откуда: Россия, Екатеринбург

Сообщение Alex_EXE »

Tbrcat
Спасибо за комментарий, очень помог.
Контактная информация:
Реклама
Ответить

Вернуться в «AVR»