Начальный загрузчик для микроконтроллеров AVR® фирмы Atmel с поддержкой программ AVRDUDE и AVRProg Как было обещано при редизайне предыдущей статьи в 2013 году, публикуем расширенный вариант начального загрузчика с поддержкой популярных программ AVRDUDE и AVRProg. Первый вариант для AVRProg увидел свет примерно в 2007 году как часть другого проекта и, после достаточно длительной и сильной рихтовки, стал пригоден для публикации. Загрузчик написан на ассемблере по мотивам предыдущей статьи, материалов программатора «Loader», app. note AVR910 (базовый набор команд и его декодирование) и AVR109 (блочные команды). 1. Описание Поддерживаются все 8-битные микроконтроллеры серии ATmega (по крайней мере ATmega8, ATmega88, ATmega162, ATmega32 и ATmega1284), без проблем должны работать также серии AT90USB и AT90CAN. Обеспечивается программирование (за исключением области загрузчика, даже при сброшенных битах защиты) и чтение FLASH- и EEPROM-памяти, чтение служебной информации МК (биты конфигурации и защиты, идентификаторы). Программирование FLASH-памяти производится постранично. Поддерживаются режимы блочной пересылки данных между ПК и загрузчиком, что резко снижает накладные расходы (вместо передачи двух служебных байт на один информационный передается 5 служебных байт на страницу памяти программ). Имеется метка "hot_start" для вызова загрузчика из прикладного ПО. Предусмотрена возможность перемещения векторов прерываний в область загрузчика и обратно. Можно использовать 32-битный счётчик реального времени в ОЗУ и программу его обслуживания в области загрузчика, продолжающую счёт как во время работы прикладного ПО, так и при загрузке нового (использовано в исходном проекте на ATmega162). Передача управления загрузчику производится при подаче питания на МК битами конфигурации BootRST и BootSZ[1:0]. После запуска загрузчик ожидает установку заданного уровня на заданном выводе (по умолчанию низкого уровня на выводе RxD, см. типовую схему в BOOTLOAD.ASM). Если заданный уровень отсутствует, управление передаётся прикладному ПО по адресу 0. Обмен данными осуществляется через УСАПП (USART или USART0, если у МК есть более одного). Программа AVRProg имеет графический интерфейс, поэтому работу с ней комментировать не будем совсем. Программа AVRDUDE консольная, но работу с ней мы также не будем комментировать подробно, а приведём только примеры командной строки для записи и чтения FLASH-памяти: AVRDUDE -p atmega8 -P com3 -c avr109 -b 38400 -F -u -U flash:w:write_data.hex AVRDUDE -p atmega8 -P com3 -c avr109 -b 38400 -F -u -U flash:r:read_data.hex Первый параметр "-p atmega8" указывает тип МК. Второй "-P com3" порт для связи ПК с загрузчиком (в данном случае это конвертер на FT232, установленный как последовательный порт №3). Третий "-c avr109" указывает AVRDUDE, что используется программатор, поддерживающий набор команд AVR109 (включая блочную пересылку данных). Четвёртый "-b 38400" задаёт скорость обмена данными (38400 Бод, выбирается в файле BOOTLOAD.ASM). Пятый и шестой "-F -u" несколько ускоряют работу за счёт отказа от проверок безопасности работы (идентификаторов МК и состояния битов конфигурации, соответственно). Последний параметр "-U" указывает, с какой памятью и какое действие производится (flash память команд, w запись или r чтение), а также какой файл данных при этом используется (write_data.hex или read_data.hex). 2. Исходные коды и комментарии Проект состоит из 5-ти файлов: | » скачать все файлы одним архивом | BOOTLOAD.ASM: содержит определения имён, выделение регистров и памяти, неспецифичные подпрограммы и настроечные константы (листинг) | | BOOTLOAD.INC: содержит приём, разбор и выполнение команд ПК и специфичные подпрограммы для доступа к памяти МК (листинг) | | COM.INC: обслуживает асинхронный интерфейс (листинг) | | AT90ISP.TXT: содержит коды МК для работы с AVRProg (листинг) | | MACROS.INC: содержит макросы из app. note AVR001 для работы с регистрами ввода-вывода (хотя, возможно, где-то в тексте есть и стандартные команды ассемблера). (листинг) | Все места, требующие внимания пользователя (настроечные константы с выбором типа МК, частоты обмена с ПК, вариантов ассемблирования и т. п.) прокомментированы в исходных текстах или выдают необходимые предупреждения при ассемблировании. Дополнительно поясним только выбор кода программируемого МК (в терминах AVRProg). К сожалению, в AVRProg был заложен изначально порочный принцип привязки поддерживаемых МК к прошивке программатора (см. строку 560 в BOOTLOAD.INC). Поскольку развитие этого ПО прекращено, то приходится выбирать для новых МК коды подходящих старых из файла AT90ISP.TXT. Главное правило выбора равенство размеров страницы памяти программ. Желательно совпадение размеров памяти. 3. Экстремальные возможности Одна из «предсерийных» модификаций была cжата до 340 байт выкидыванием большинства команд (только запись и чтение FLASH и EEPROM) и работала совместно с AVRProg в «лабораторно-настольных» условиях на ATtiny44, тактировавшемся от встроенного RC-генератора (откалиброванного на 7.3728 МГц при комнатной температуре, см. AVR053). Основной проблемой в данном случае мне представлялось обеспечение «неубиваемости» загрузчика при отсутствии выделенной области памяти. Способ достижения описан мною тут. Synopsis: AVR bootloader inspired by AVR910 and AVR109 for use with AVRDUDE or AVRprog. Wrote in assembler. For further information see english comments in source code. Автор: Станислав Лещинский aka «Точка Опоры» ООО «МФК Точка Опоры», Москва, www.fulcrum.ru 21.02.2015 |