Обсуждаем контроллеры компании Atmel.
Ответить

BootLoader Atmega128 Atmel Studio

Пт дек 16, 2016 16:11:31

Нужен 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".

Re: BootLoader Atmega128 Atmel Studio

Пт дек 16, 2016 16:51:30

viewtopic.php?p=2873909#p2873909

Re: BootLoader Atmega128 Atmel Studio

Пт дек 16, 2016 17:39:48

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 KiB) Скачиваний: 366

Re: BootLoader Atmega128 Atmel Studio

Сб дек 17, 2016 09:44:21

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

Дельных советов в инете нет, поэтому напишу, как сделать Бутлоадер в 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 своего времени и много нервов на перерывание даташитов и испытания неработающих советов.

Re: BootLoader Atmega128 Atmel Studio

Вт авг 22, 2017 03:29:25

Tbrcat
Спасибо за комментарий, очень помог.
Ответить