Atmel AVR 8-bit: пишем бутлоадер
Эта страница больше не ведётся, скопирована в d:\information\разработка электроники\datasheets\Atmel\my\
Это пока ещё черновик, но всё равно уже публикую, вдруг кому-то пригодится.
Эта запись — конспект того, как делал я.
Задача: написать бутлоадер для 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).
На этом пока всё...