Atmel AVR 8-bit: пишем бутлоадер

Это пока ещё черновик, но всё равно уже публикую, вдруг кому-то пригодится.

Эта запись — конспект того, как делал я.

Задача: написать бутлоадер для ATmega16, занимающий 512 слов. Микроконтроллер соединяется с компьютером через USART, есть возможность выполнить сброс, сигнал break при нормальной работе не используется, миллисекундная задержка при включении неважна.

Решение: при включении питания управление передаётся на бутлоадер (BOOTRST = 0). После выполнения всяких инициализаций (портов) он читает ножку Rx. Если там отсутствует break более определённого времени, управление передаётся основной программе (jmp 0). Если присутствует, ждём снятия и переходим к циклу общения с компьютером по USART...

Соответственно, извне это выглядит следующим образом: если хотим шить, нужно подать на USART break и перезагрузить прибор (включить питание или замкнуть ножку /RESET на землю). Если же break не подавать, то всё влияние бутлоадера проявляется лишь в том, что после сброса требуется дополнительное время (для человека пренебрежимо малое) на запуск устройства. И, ясное дело, в том, что основная прошивка должна быть короче, чем вся флешка.

Реализованы следующие команды:

  • Пинг
  • Запись страницы из адресного пространства основной программы (сам бутлоадер перезаписать нельзя — защита от дурака)
  • Чтение любой страницы
  • Сброс (передача управления основной программе — jmp 0)

Кроме того, по выделенному адресу расположена 64-байтная строка — версия бутлоадера. Компьютер может достать её с помощью команды чтения страницы.

Настройки Atmel Studio 7.0:
Проект C exe.
Toolchain
Optimization = None
Memory settings (в словах):
.text=начало секции бутлоадера (в соответствии с фьюз-битами)
.version=в конце секции бутлоадера, чтобы вместилась соответствующая строка
Device ...

Для ATmega32(A):
.text=0x3e00
.version=0x3fe0

Для ATmega16(A):
.text=0x1e00
.version=0x1fe0

В обоих случаях весь бутлоадер занимает 512 слов, а версия — 64 байта.

В целом проект написан на Си, но именно функции, связанные с чтением/записью страниц, — на ассемблере.

Для компьютера было написано 2 разных прошивальщика: на Java 6 (консольная программа) и на LabWindows/CVI 2013 (GUI).

На этом пока всё...

Поделиться
Отправить
7 июня  
Ваш комментарий
адрес не будет опубликован

ХТМЛ не работает

Ctrl + Enter
Популярное