ГЛАВНАЯ

ОБ АВТОРЕ СТАТЬИ СКАЧАТЬ ФОРУМ F.A.Q. КОММЕРЦИЯ КОНТАКТЫ


Бутлоадер для Меги

Дмитрий Дмитренко
 

Кто хоть однажды самостоятельно писал программы для микроконтроллеров Atmel, практически всегда сталкивался с вопросами дальнейшей отладки программы на реальном устройстве. Конечно, у кого есть возможность приобрести специальные, фирменные наборы для программирования и отладки лишены этой проблемы. Но не все такую возможность имеют, вот и придумывают различные ухищрения. Некоторые специально не занимают никакой периферией выводы шины SPI-модуля в устройстве, некоторые просто постоянно переставляют микроконтроллер из разъема устройства в разъем программирования, а потом – обратно. Не мудрено, что жизнь микросхемы после таких «мучений» заметно укорачивается, особенно в физическом плане. Можно, конечно же, отладить и в Протеусе, но очень велика вероятность того, что в реальности устройство будет работать не так, как моделировалось в этой замечательной программе...
И какими средствами программируем контроллеры в любительских условиях? Такими же, любительскими, программами-программаторами... А они тоже, бывают, «глючат», вот и лежат потом вполне рабочие микроконтроллеры мертвым грузом, дожидаясь, когда «хозяин», наконец, «созреет» для того, чтобы собрать параллельный программатор.
До недавнего времени я тоже поступал примерно таким образом, пока, после того, как в очередной раз «глюконула» моя любимая программа PonyProg и не «умер» очередной (недешевый, нужно сказать) микроконтроллер, меня просто вынудило приступить к поискам выхода из данной ситуации.
Выход нашелся сразу: для отладки программы на готовом устройстве вполне подойдет обычный бутлоадер (bootloader – «загрузчик» по-англ.). Для его функционирования вполне подойдет обычный порт UART микроконтроллера, а для запуска достаточно перед подачей питания на микроконтроллер замкнуть специальный переключатель – джампер или переключатель. Полная документация по организации такого устройства доступна на официальном сайте Atmel [1]. Функции самопрограммирования включены практически во все модели семейства Mega. Исключение составляют только микроконтроллеры с объемом FLASH менее 8 кБ (например, ATmega48).
Еще один плюс устройства: программирование осуществляется фирменными средствами Atmel – программой AVR Studio. Это практически исключает какие-либо программные ошибки и неточности, к тому же еще и повышается скорость программирования-верифицирования (простой пример: одна и та же моя прошивка при программировании PonyProg «заливалась» за 1 минуту, с использованием AVR Studio – 8 секунд).
На сайте Atmel есть исходники описываемой версии загрузчика, есть эти файлы и в прилагаемых материалах к статье. Если кто-то захочет самостоятельно создать бутлоадер в зависимости от собственных предпочтений, то можно это сделать, соответственно подкорректировав программу. Изменить придется в основном файл defines.h, выставив свои данные скорости порта UART, данные памяти программ, объема памяти загрузчика и вывод запуска бутлоадера. Существенно облегчает работу прилагаемый файл preprocessor.xls, работающий в среде Microsoft Excel, автоматически устанавливающий необходимые значения файла defines.h в зависимости от типа микроконтроллера и требуемого объема памяти загрузчика. От себя могу добавить, что еще необходимо откорректировать файл Makefile, установив стартовый адрес загрузчика, который зависит от модели микроконтроллера, так что без чтения даташита не обойтись никак. Поэтому мной и были разработаны несколько вариантов прошивок для различных микроконтроллеров и частот тактового генератора.
Пройдемся, для начала, по файлу defines.h. Для прочих файлов на начальном этапе работы ничего менять не нужно, там всё выставлено для оптимальной работы загрузчика, хотя есть возможность варьировать как его размером, так и функциями, например, исключать некоторые из них. При этом возможно значительно уменьшить размер занимаемой загрузчиком памяти.
 

// device select: _ATMEGA8
#define _ATMEGA8
// boot size select: _Bxxxx (words), powers of two only
#define _B1024
#include <avr/io.h>
/* define pin for enter-self-prog-mode */
#define PROGPORT PORTC
#define PROGPIN PINC
#define PROG_NO PC0
/* baud rate register value calculation */
#define CPU_FREQ 7372800
#define BAUD_RATE 115200
#define BRREG_VALUE 8
/* definitions for UART control */
#define BAUD_RATE_LOW_REG UBRRL
#define UART_CONTROL_REG UCSRB
#define ENABLE_TRANSMITTER_BIT TXEN
#define ENABLE_RECEIVER_BIT RXEN
#define UART_STATUS_REG UCSRA
#define TRANSMIT_COMPLETE_BIT TXC
#define RECEIVE_COMPLETE_BIT RXC
#define UART_DATA_REG UDR
/* definitions for SPM control */
#define SPMCR_REG SPMCR
#define PAGESIZE 64
#define APP_END 7168
/* definitions for device recognition */
#define PARTCODE 0x77
#define SIGNATURE_BYTE_1 0x1E
#define SIGNATURE_BYTE_2 0x93
#define SIGNATURE_BYTE_3 0x07

Листинг 1

Немного распишем назначение строк этого файла.

Строка #define _ATMEGA8: объявляем марку микроконтроллера. Автоматически, как и все последующие строки, это проще всего сделать с помощью файла preprocessor.xls.

#define _B1024: объем области загрузчика. Обратите внимание, что объем указывается в словах, слово равно двум байтам, то есть, для того, чтобы узнать объем загрузчика, следует просто умножить это число на 2. Также этот параметр не должен противоречить значениям, заявленным в даташите контроллера. Если микроконтроллер поддерживает 1024 слова загрузчика, то выставлять 2048 не имеет смысла...

#define PROGPORT PORTC
#define PROGPIN PINC
#define PROG_NO PC0

Строки, определяющие, какой вывод используется для входа в режим загрузчика. Здесь также следует быть внимательнее, порт должен совпадать, и если у нас вывод PC0, то и остальные данные должны относиться к этому порту: PINC, PORTC. Ошибка здесь чревата неработоспособностью устройства.

#define CPU_FREQ 7372800
#define BAUD_RATE 115200
#define BRREG_VALUE 8

Установка параметров порта UART (BAUD_RATE в бодах, или кбит/с, BRREG_VALUE) и тактовой частоты микроконтроллера (CPU_FREQ, в Герцах). Параметр BRREG_VALUE рассчитывается по формуле:

BRREG_VALUE = (CPU_FREQ/( BAUD_RATE*16))-1

Рекомендуется выбирать такую тактовую частоту микроконтроллера, которая бы при расчетах давала бы целое число BRREG_VALUE, или имело малое отклонение (не более 2%). Иначе возможны перебои линии связи между контроллером и компьютером. Так же и битрейд должен выбираться из стандартного набора значений.

Определение регистров порта UART:
#define BAUD_RATE_LOW_REG UBRRL
#define UART_CONTROL_REG UCSRB
#define ENABLE_TRANSMITTER_BIT TXEN
#define ENABLE_RECEIVER_BIT RXEN
#define UART_STATUS_REG UCSRA
#define TRANSMIT_COMPLETE_BIT TXC
#define RECEIVE_COMPLETE_BIT RXC
#define UART_DATA_REG UDR

Не менее ответственная работа, требующая хорошего знания даташита. Например, у некоторых контроллеров присутствует 2 порта UART, и, например, для порта с номером 1 данные строки будут выглядеть так:

#define BAUD_RATE_LOW_REG UBRRL1
#define UART_CONTROL_REG UCSRB1
#define ENABLE_TRANSMITTER_BIT TXEN1
#define ENABLE_RECEIVER_BIT RXEN1
#define UART_STATUS_REG UCSRA1
#define TRANSMIT_COMPLETE_BIT TXC1
#define RECEIVE_COMPLETE_BIT RXC1
#define UART_DATA_REG UDR1


Строки, определяющие максимальные параметры загрузчика:
Регистр - #define SPMCR_REG SPMCR
Размер страницы памяти FLASH (в байтах) - #define PAGESIZE 64
Максимальный размер прикладной программы (в байтах) - #define APP_END 7168

Ну, и напоследок, параметры собственно микроконтроллера:
#define PARTCODE 0x77 : код для инициализации загрузчика программой AVR Prog. Очень «засекреченная» информация, нигде в даташитах не присутствует, хотя в preprocessor.xls есть, но не для всех микроконтроллеров. Вероятно, потому что программа AVRProg не поддерживает последние модели контроллеров, но ниже есть описание, как обойти данную неприятность.
#define SIGNATURE_BYTE_1 0x1E
#define SIGNATURE_BYTE_2 0x93
#define SIGNATURE_BYTE_3 0x07:
сигнатурные байты микроконтроллера. Информация приводится из даташитов, у каждого микроконтроллера свои сигнатурные байты.

Теперь по файлу makefile. В нем ничего особенно менять не придется, просто нужно изменить строку, контролирующую старт программы, а именно:

BASEADDR = 0x7800

Стартовый адрес устанавливается в байтах, в отличии от некоторых других параметров, измеряющихся словами, и не в десятичном, а шестнадцатеричном формате представления чисел. Данный параметр берется из даташита, раздел «Boot Loader Parameters», таблица «Boot Size Configuration», графа «Boot Reset Address (Start Boot Loader Section)». Стартовый адрес зависит от общего объема загрузчика, и указан в словах, поэтому для перевода его в байты необходимо число, приведенное в данной таблице умножать на 2.
Это тот минимум, который нужно знать при написании программы для собственного загрузчика. Остальное приобретается с опытом.
Как же работает загрузчик? При подаче питания и замкнутом на минус джампере или переключателе, подающим отрицательный уровень сигнала на соответствующий вывод, микроконтроллер сразу переходит в специальную область своей FLASH-памяти – область загрузчика. После этого, во многих случаях, джампер уже не нужен, его можно и разомкнуть, программа же производит постоянный опрос порта UART на предмет поступления управляющих сигналов.
Конечно, можно было бы «отметиться» каким-нибудь бутлоадером с поддержкой USB или чего-нибудь «покрепче», но я остановился на самом простом (и, надеюсь, надежном) варианте с использованием COM-порта компьютера.
Но для начала, всё-таки, придется использовать то, от чего мы пытаемся отказаться: загрузчик тоже нужно как-то «зашить» в микроконтроллер. Но, справедливости ради скажи, что это будет единственный повод для беспокойства за жизнь микросхемы.
С помощью загрузчика можно изменять содержимое памяти, однако нельзя переустановить основные фьюзы, поэтому при программировании бутлоадера сразу же выставляют и требуемые фьюзы. Также, для обеспечения работы загрузчика, необходимо запрограммировать перемычки BOOTSZ0, BOOTSZ1 в соответствии с заданным объемом загрузчика, и BOOTRST для того, чтобы при запуске программа контроллера начиналась не с нулевого адреса, а с заданного адреса загрузчика. Помним, также, что установленный фьюз имеет значение «0», а не установленный – «1».
Что можно программировать при помощи данных бутлоадеров? FLASH и EEPROM-память, а также LOCK-биты для запрета или разрешения чтения. Кроме этого, есть возможность считывания всех фьюзов.
Теперь перейдем к схеме. Она очень проста, и, если ранее отмечалось простота схемы для программирования микроконтроллеров под названием «5 проводков», то эта – еще проще! Хотя, возможно, понадобятся преобразователи уровней RS232 или USB в UART. Но, если устройство предназначено в дальнейшем для совместной работы с персональным компьютером, то эта проблема отпадает сама собой. Кстати, в [2] можно найти подобные схемы преобразователей.

Схема подключения при использовании бутлоадера для AVR
Рисунок 1.

Необходимо помнить, что выводы RXD, TXD и PC0 (или иной вывод для управления) для различных микроконтроллеров отличаются. Номера выводов приведены в табл. 1. И еще один нюанс: вывод PC0 используется загрузчиком как вход, и, если основной программой этот вывод используется как вход, то до выхода из режима программирования для предотвращения выхода из строя данного вывода микроконтроллера, необходимо джампер отключить. Если это исключено, то подключить джампер не напрямую к «массе», а через резистор примерно 1 кОм.

Теперь о программировании. После выполнения всех подключений (в том числе замыкания джампера) и подачи питания на устройство, запускаем программу AVR Studio, если она, конечно, установлена (скачать последнюю версию всегда можно здесь [1]).
После запуска в меню Tools выбрать опцию AVR Prog… Если соединение прошло успешно, то появится форма программатора (рис. 2). Если программа выдала сообщение: «No supported board found. AVRProg Version 1.40», то следует проверить правильность подключения или подачи питания на микроконтроллер.

Работа с программой AVR Prog от AVR Studio
Рисунок 2.

На рис. 3 приведено описание всех элементов управления главной формы программатора. Для начала следует выбрать файл прошивки для программирования-считывания, затем нажать кнопку программирования. Через несколько секунд программирование будет завершено, о чем оповестит надпись над индикатором процессов.

Работа с программой AVR Prog от AVR Studio
Рисунок 3.

После того, как программирование завершено, нажимается кнопка Exit, и микроконтроллер переводится в рабочий режим после сброса (если джампер к этому времени будет разомкнут, при замкнутом устройство опять перейдет в режим программирования).
Вкладка Advanced (рис. 4) предназначена для выбора программирования/чтения фьюзов LockBits, полного стирания кристалла (то есть памяти FLASH (кроме загрузчика) и EEPROM) и чтения сигнатуры микроконтроллера.

Работа с программой AVR Prog от AVR Studio
Рисунок 4.

Фьюзы LockBits предназначены для защиты содержимого FLASH и EEPROM памяти микроконтроллера от записи и/или чтения. Основное описание данных фьюзов – табл. 2. Если защита установлена, то считать данные в последствии будет невозможно, их можно будет только удалить посредством полного стирания памяти микроконтроллера. Включение защиты выполняется в самую последнюю очередь, после проведения основных манипуляций с программированием.

Отдельно хотелось бы остановиться на программировании микроконтроллеров ATmega88, ATmega168. Дело в том, что данные модели почему-то не поддерживаются программой AVRProg. Но и здесь есть выход: организация памяти у ATmega168 идентична с ATmega16, поэтому при запуске программы в окошке «Программируемый микроконтроллер» следует принудительно установить «ATmega16». Конечно, программа будет «ругаться» сообщениями типа «Flushing!», но их просто игнорируют. Таким образом, FLASH и EEPROM пишутся без проблем, по вкладке «Advanced» могут возникнуть вопросы, но, так как загрузчик используется для записи памяти в любительских условиях, надобность в ней отпадает, хотя осторожность соблюдать не помешает.
В заключении хотелось бы сказать, что описанный загрузчик здорово помогает не только при испытаниях макета или отладки на реальном устройстве, но и в процессе работы готового устройства. Например, когда необходимо срочно изменить прошивку прибора в связи с изменением заданных параметров или данных. Конечно, описанный пример реализации загрузчика является простейшим, при внимательном прочтении Аппноутов на сайте Atmel можно узнать, что его можно реализовать не только с помощью управляющего сигнала на каком-нибудь выводе, но и программным путем. Например, можно запустить загрузчик подачей специальной команды на тот же порт UART в процессе работы основной программы...

Ссылки

1. Официальный сайт Atmel
2. Сайт автора
3. Решение вопросов – форум

 

Что еще почитать

Сигнализация GSM с применением ключей iButton. Версия 2
Бутлоадер для Меги
Проект UART-осциллограф MyOscill
Tester C328. Тестер JPEG-камер.

Лампа освещения салона автомобиля
JPEG-фотокамера. Введение
Автомобильный цифровой тахометр с автоматическим выбором предела измерения
Сигнализация GSM с применением  ключей iButton
Прибор сигнализации GSM на основе модуля SIM900

SIM900A в SIM900
Температурный «фиксатор»
Устройство управления доступом
Охранная GSM-сигнализация для дома, дачи, гаража

Особенности применения комбинированных измерителей влажности-температуры

Комментарии
 
Нам интересно Ваше мнение


 
 

Поддержка работы сайта::
Z585211219986 (USD)
E693987287372 (EUR)
R427344352799 (RUR)
U793913124801 (UAH)
B217286195816 (BYR)

©®DDN Research CL, Ukraine
Все права на материалы под маркой DDN Research (автор - Дмитренко Д.Н.) защищены. Копирование материалов без согласования с Администрацией сайта запрещена. При копировании ссылка на сайт обязательна.

 


Copyright - 2013 - DDN Research