Введение во встраиваемую электронику, часть 2 Печать
Добавил(а) microsin   

Продолжение перевода лекций SparkFun [1]. Здесь рассказывается о способах загрузки кода в микроконтроллер. Настоятельно рекомендуется иметь при себе мультиметр с прозвонкой, для проверки целостности цепей [3]. Если у Вас его нет, то советую купить, такой мультиметр стоит совсем недорого. Довольно качественный, многофункциональный мультиметр сейчас можно примерно за 800 рублей (~20 долларов). Предполагается, что Вы ознакомились с 1 частью лекции [2], и у вас уже есть стабилизированный источник питания 5V на ток порядка 0.2 .. 0.5A.

Предыдущая часть: Введение во встраиваемую электронику, часть 1 (общие вопросы, организация питания микроконтроллера).

Теперь нам предстоит подать питание на микроконтроллер. Для сборки схемы мы будем использовать всю ту же макетную плату breadboard. Если Вы дружите с паяльником, то можно собрать схему на плате типа stripboard [4]. Ножки микроконтроллера ATmega8 (это может быть также ATmega168 или ATmega328P в корпусе DIP28, все эти 3 типа микроконтроллеров имеют совпадающую по выводам цоколевку) нужно слегка подогнуть и установить в два ряда контактов посередине между шинами питания (см. пример на фото).

ResetSwitch

Шина 5V (+ питания) будет у нас подключен к ряду контактов breadboard, возле которых имеется маркерная красная линия. Подключите в одну из отверстий этой шины проводник, который другим концом подключите к выходу стабилизатора напряжения 5V. Это подаст питание +5V на все контакты красной шины. То же самое нужно сделать и для голубой шины, только эту шину нужно соединить с проводом GND блока питания. Затем вы можете соединить перемычками ножки VCC микроконтроллера (это выводы 7 и 20 корпуса DIP28) с любыми контактами красной шины 5V, и соединить ножки GND микроконтроллера (это выводы 8 и 22 корпуса DIP28) с любыми контактами синей шины GND.

Совсем забыл упомянуть о том, как нумеруются ножки микроконтроллера. Производители любых деталей, которые имеют полярные выводы (танталовые и электролитические конденсаторы, светодиоды LED, микросхемы IC и т. д.) всегда ставят на специальные метки (обычно на корпусе детали), которые показывают 1 вывод микросхемы или полярность детали. Для микросхем в пластмассовом корпусе DIP это часто маленькая выемка возле одного из торцов корпуса микросхемы. Синяя стрелка на картинке показывает эту выемку на корпусе микроконтроллера. Оранжевая стрелка показывает на вывод 1, синие цифры показывают, как осуществляется нумерация выводов микроконтроллера.

Pin1

Принцип нумерации понятен. Ножки отсчитываются от впадины в корпусе, ножка 1 находится в левом ряду от впадины. Нумерация ножек увеличивается по левому ряду ножек вниз (2, 3, .. 14), доходит до 14 ножки и переходит на правый ряд выводов микросхемы, на нижний вывод 15. Далее нумерация увеличивается вверх по правому ряду выводов микросхемы, дойдя до ножки 28, которая находится справа от маркирующей впадины. Нумерация выводов хорошо показана также в даташите ATmega328P.

ATmega168-pinout

Микроконтроллер ATmega328 должен быть установлен в breadboard, pin 7 (VCC) и pin 20 (AVCC) должны быть подключены к шине 5V, и pin 8 и 22 (GND) должны быть подключены к шине GND breadboard. Если Вы теперь включите питание, то микроконтроллер ATmega328 заработает, и попытается выполнить записанную в него программу. Но если микроконтроллер чистый (только что с магазина или завода), то никакой программы в его памяти нет, и выполнять ему нечего.

Для того, чтобы микроконтроллер начал выполнять какую-нибудь программу, нам сначала предстоит записать эту программу в память микроконтроллера. Но перед этим предстоит сделать еще кое-что. Нужно подключить в нашу схему кнопку сброса и коннектор для программирования ISP.

[Для чего нужен сигнал сброса микроконтроллера]

Я еще забыл про один сигнал, на который нужно подать уровень VCC, чтобы микроконтроллер мог начать выполнять команды программы. Это сигнал сброса RESET. Чтобы микроконтроллер запустил на выполнение свою программу, ножка сброса микроконтроллера должна быть подключена к VCC либо накоротко (что обычно никогда не делают), либо через резистор 10 кОм. Если Вы откроете даташит микроконтроллера ATmega328, и посмотрите на цоколевку корпуса DIP28, то увидите, что возле вывода 1 подписано (PCINT14/~RESET)PC6. Маркировка ~RESET означает, что этот вывод работает (по умолчанию) как внешний вход для сброса с активным уровнем 0 (знак тильды ~ означает инверсию, которая в даташитах иногда выделяется верхним подчеркиванием). Т. е. процедура сброса запустится, если подать на этот вывод лог. 0, а потом вернуть уровень в лог. 1 (уровень питания VCC).

ATmega168-pinout

Сброс (RESET) это специальный внешний сигнал, дающий аппаратуре микроконтроллера установить внутреннее состояние в исходное положение, после чего начинается выполняться программа (обычно с адреса программ 0). Сброс происходит автоматически после подачи питания на микроконтроллер, а также по умолчанию при подаче на вход сброса логического сигнала 0. Этот специальный вход микроконтроллера соответствует ножке 1 микроконтроллера ATmega328P в корпусе DIP28. Полезно подавать внешний сигнал сброса с помощью кнопки, для чего соберем необходимую схему из кнопки и нагрузочного резистора.

PushButton PushButton-sch

На рисунках показаны внешний вид кнопки, и её схемотехническое обозначение. Такую кнопку мы будем использовать для сброса микроконтроллера, и она будет работать точно так же, как работает кнопка сброса на системном блоке компьютера. Как видите, у кнопки 4 вывода (пятый вывод, который виден на фото, это просто экран, который соединяют с шиной GND для экранирования). Два соседние вывода у кнопки соединены попарно (ножка 1 и 2 соединены, и ножка 3 и 4 тоже соединены), так что в результате получается только 2 нормально разомкнутых контакта. При нажатии на кнопку получается щелчок, сопровождающийся замыканием этих контактов кнопки (ножки кнопки 1 и 2 замыкаются на ножки 3 и 4). Когда Вы отпускаете кнопку, то контакт кнопки снова размыкается.

Чтобы проверить кнопку (какие именно контакты у неё срабатывают на замыкание), воспользуйтесь тестером, включенным в режим прозвонки цепей [3]. Функция прозвонки очень полезна для поиска неисправностей и проверки электрических цепей. Обязательно изучите, как пользоваться режимом прозвонки, это очень важно для поиска и устранения неисправностей в будущем. Если в режиме прозвонки замкнуть щупы тестера друг с другом, то прозвучит звуковой сигнал, означающий наличие электрического соединения. Установите кнопку в плату breadboard, и прозвоните тестером её контакты. Когда установите щупы между контактами 1 и 2 (или между контактами 3 и 4), то услышите звуковой сигнал. Если подключите щупы между контактами 1 и 3, то сигнала быть не должно, пока кнопка остается не нажатой. Когда Вы нажимаете кнопку, то контакты внутри неё должны замыкаться, и при подключенных щупах к выводам 1 и 3 кнопки тестер при нажатии кнопки будет издавать звуковой сигнал.

Program-sch1

На этой схеме показано, как следует подключить кнопку, чтобы она выдавала сигнал сброса на микроконтроллер. У кнопки контакты 1 и 2 соединены вместе и подключены к GND, а контакты 3 и 4 подключены к резистору R2 10 кОм и входу сброса микроконтроллера. Сигнал сброса на схеме получил имя RST. Проверьте, как работает кнопка сброса, включив питание. Переключите мультиметр в режим измерения напряжения до 20V, и измерьте уровень напряжения на выводе 1 микроконтроллера относительно шины GND. При отпущенной кнопке S2 уровень напряжение должен быть около 5V, а когда замыкаете кнопку уровень должен падать до 0V.

Из схемы понятно, почему так происходит. Резистор 10K R2 называется "подтягивающим к верху" (pullup). В нормальном режиме через него на вывод 1 ~RESET подается высокий логический уровень от шины питания VCC, при этом ATmega328 нормально работает и выполняет записанные в неё команды программы. Когда Вы нажимаете кнопку сброса (S2), вывод сброса микроконтроллера через контакты кнопки напрямую соединяется с землей GND. Поскольку сопротивление контактов кнопки на несколько порядков меньше сопротивления резистора R2, то напряжение на выводе сброса микроконтроллера становится близким к нулю, что соответствует сигналу лог. 0 - как раз активный уровень для сброса. При этом ATmega328 переходит в неактивное состояние и сбрасывается в исходное состояние. Как только Вы отпустите кнопку, сигнал сброса перейдет в неактивное состояние лог. 1, микроконтроллер выйдет из состояния сброса и начнет с нулевого адреса выполнять программу. На фото показана собранная на breadboard схема, оснащенная кнопкой сброса.

ResetSwitch

[Коннектор программирования ISP]

Каждый производитель микроконтроллеров использует разные методы для заливки кода в память FLASH микроконтроллера. Несколько прошлых лет все чаще встречается интерфейс программирования, который называется ISP, сокращение от "in system programming" (внутрисхемное программирование). ISP позволяет программировать IC микроконтроллера без отсоединения его от схемы, в которой он работает. Это весьма непросто! Раньше процедура программирования была более сложной. Компания Atmel разработала довольно простой и ясный метод программирования, который требует для интерфейса ISP 6 проводов (подробнее про цоколевки ISP см. [5]). Из-за такого несложного подключения аппаратные программаторы, которые нужны для соединения интерфейса ISP с компьютером, стоят недорого и и широко распространены [6]. На фото показан стандартный коннектор программатора с цоколевкой ISP10.

[Красный провод на ленточном кабеле помогает найти контакт 1 на разъеме программирования ISP]

Помните, как мы нашли вывод 1 микросхемы по выемке на корпусе? Коннекторы также нуждаются в метке, чтобы найти на нем нужные выводы и не воткнуть его случайно наоборот. К сожалению, принципы нумерации контактов на микросхеме микроконтроллера и на разъеме ISP отличаются. На рисунке, где показан коннектор ISP, красный провод на кабеле подсказывает, с какой стороны находится вывод 1. На микросхеме выводы нумеруются последовательно друг за другом на одной стороне. На двухрядном коннекторе ISP все по-другому - на одной стороне коннектора контакты имеют нечетные номера (1, 3, 5, 7, 9), а на другой стороне четные [5].

ISP-connector connISP10PIN

Типичная последовательность программирования микроконтроллера примерно следующая.

1. Есть бесплатный компилятор с языка C, который называется AVR-GCC. Пользователь пишет свой код на языке C, и затем с помощью AVR-GCC компилирует этот код, в результате чего получается бинарный файл прошивки в формате Intel HEX (файл с расширением *.HEX). Компилятор AVR-GCC может быть установлен на всех популярных операционных системах. AVR-GCC также называют тулчейном (toolchain). Под Windows его можно очень просто установить в пакете инструментария WinAVR, либо можно загрузить и установить бесплатную среду разработки Atmel Studio, вместе с ней установится также и тулчейн.

2. Пользователь прошивает этот HEX-файл в микроконтроллер AVR через ножки интерфейса ISP (с помощью внешнего программатора [6]).

3. Пользователь подачей сигнала сброс на микроконтроллер (или выключением и включением питания) запускает записанный код на выполнение, и проверяет его работу.

Что такое компилятор C (AVR-GCC)? Это специальная программа, которая принимает входной файл программы на языке C (это простой текстовый файл с расширением *.C) и преобразовывает его в машинные коды микроконтроллера, записанные в выходной файл стандартного формата Intel HEX (текстовый файл с расширением *.HEX). Кроме языка C программировать можно и на других популярных языках, но мы используем C потому он для нас проще, и он намного мощнее языка BASIC.

Это текстовый файл, который содержит различные шестнадцатеричные текстовые символы (отсюда и произошло название формата, HEX означает шестнадцатеричный, hexadecimal). Шестнадцатеричные коды представляют машинные инструкции, которые понимает микроконтроллер, и может их выполнять друг за другом, как некую программу. Этот HEX-файл прошивается в память FLASH микроконтроллера с помощью программатора ISP [6]. Больше информации о формате Intel HEX можете прочитать по ссылке [7] (хотя это вовсе необязательно делать).

Прежде чем Вы сойдете с ума от кучи свалившейся на Вас новой информации, просто загрузите и установите на Ваш компьютер пакет WinAVR, Вы его легко можете найти в сети (WinAVR предназначен для пользователей Windows, пользователи Linux, FreeBSD или MacOS должны скачать и установить себе тулчейн AVR-GCC или соответствующую сборку Eclipse). С помощью пакета WinAVR (или тулчейна AVR-GCC) Вы в будущем сможете создавать программы для AVR.

Установка WinAVR под Windows очень проста - следуйте указаниям мастера инсталляции, и оставьте все параметры по умолчанию. Кроме компилятора GCC пакет WinAVR содержит и некоторые другие инструменты, включая avrdude и Programmer Notepad. Программа avrdude является простой оболочкой командной строки для работы с программаторами многих типов. С помощью avrdude Вы можете заставить Ваш ISP программатор [6] (подключенный через последовательный или параллельный порт, или через USB) залить HEX-файл в память микроконтроллера Atmel AVR (т. е. как в нашем примере ATmega8, ATmega168 или ATmega328).

Помните, в части 1 руководства (см. ссылку [2]) была дана программа "Hello World!" для микроконтроллера, мигающая светодиодом? Она позволяет проверить, корректно ли работает микроконтроллер, и успешно ли Вы записали в память микроконтроллера программу. С любой платой разработки и с любым микроконтроллером, с которыми Вы начали работать первое, что нужно попробовать сделать - помигать подключенным светодиодом. Это и есть общеизвестный 'Hello World' для встраиваемых систем (embedded systems). Чтобы Вам было проще, мы подготовили готовую прошивку blink_1MHz.hex [8] для мигания светодиодом, которую Вы можете прошить в память микроконтроллера с помощью программатора ISP.

Предположим, что Вы скачали файл blink_1MHz.hex [8], и у Вас есть программатор Olimex типа AVR-PG1 (или AVR-PG2, или любой другой ISP-программатор). Теперь нужно подключить программатор ISP к микроконтроллеру ATmega328. Самый простой способ - подключиться к микроконтроллеру 9-ю проводами, которые будут идти от коннектора ISP программатора в плату breadboard, на которой установлен микроконтроллер. Ниже приведена схема соединений и фотография готового соединения микроконтроллера с коннектором ISP программатора.

Program-sch2

ISP-wired

Рядом с выводами питания 7 и 8 микроконтроллера установлен фильтрующий конденсатор 0.1 мкФ, снижающий помехи по питанию. ATmega328 наверняка будет хорошо программироваться и работать даже без этого конденсатора, но все-таки лучше его поставить.

Примечание: программатор AVR ISP по шине GND подключен всеми 4 проводами. Это сделано для надежности, чтобы не ошибиться и обеспечить надежный контакт по шине земли. Если Вы хорошо знаете цоколевку разъема ISP, то шину земли GND можно подключить и одним проводом. Тогда соединение с программатором ISP сократиться до 6 проводов. Кроме того, Ваш программатор может штатно комплектоваться коннектором ISP6, который подключается 6 проводами (цоколевка ISP6, как и цоколевка ISP10, также широко распространена, см. [5]).

Дополнительно нужно подключить светодиод LED для контроля работы программы. Его можно подключить на любой вывод GPIO микроконтроллера. PC0 (ножка 23 корпуса DIP28) выглядит хорошим кандидатом для подключения светодиода.

Program-sch3

Примечание: номинал резистора R3 не важен, он может быть любым в диапазоне 150 Ом .. 1 кОм. Просто помните, что его обязательно нужно поставить для ограничения тока через светодиод (подробнее см. [2]). Также не имеет значения, к какому порту GPIO будет подключен светодиод, потому что программа blink_1MHz.hex [8] управляет сразу всеми портами GPIO.

[Программирование микроконтроллера]

Схема готова, можно приступить к программированию. После установки WinAVR на рабочем столе (или в меню ПУСК) должны появиться несколько новых ярлыков, один из которых служит для запуска редактора Programmers Notepad.

Programmers Notepad - это программа для редактирования исходного кода программы, текстовый редактор с удобной подсветкой синтаксиса. Когда создадите свою программу на компьютере (напишете её в текстовом редакторе наподобие Programmers Notepad, в результате чего получится файл исходного кода программы на языке C, файл с расширением *.C), Вы передадите эту программу компилятору для компиляции. Для этого достаточно в редакторе Programmers Notepad нажать соответствующую кнопку, которая запустит компиляцию Вашего C-файла. Компилятор создаст HEX-файл (если с Вашим кодом C все в порядке, и он не содержит ошибок). Чем тут помогает подсветка кода? При написании кода подсвечивает разные части программы (ключевые слова for( ), #define и другие, комментарии, числа) разными цветами. Это значительно повышает наглядность программы, упростит её понимание и в конечном счете повысит эффективность программирования.

Вы также можете для составления текста программы на языке C использовать любой текстовый редактор. Будет работать даже обычный Блокнот (Notepad), но он слишком элементарен, и поэтому не очень удобен. Со времен работы с PIC-ами я помню редактор JFE - можно использовать и его. И JFE, и Programmers Notepad оба имеют опцию 'tools' (для настройки запуска внешнего компилятора), но ИМХО редактор JFE использовать удобнее, потому что по двойному клику по имени функции он позволяет перескочить на её определение функции (наподобие фичи Go to definition of..., которой оснащаются все продвинутые IDE типа IAR), что ускоряет навигацию по коду программы. Возможно, что такое уже встроили в другой хороший редактор Notepad2. Поскольку редактор Programmers Notepad v2 (его еще называют коротко PN2) Вы получаете вместе с инсталляцией WinAVR, то вполне можно использовать и его!

Компилятор AVR-GCC является очень мощным и очень сложным, для новичков бывает непросто начать работу с ним. Я привык просто передавать файл *.c компилятору для PIC (CC5x), и в результате получать HEX-файл. Никакой тебе суеты, никакой путаницы. Но поверьте мне, освоение возможностей AVR-GCC и головная боль при его запуске окупится многократно. AVR-GCC по-настоящему отличный компилятор, и к тому же он бесплатный. В архиве [8] вместе с готовой прошивкой и файлом исходного кода blink_1MHz.c предоставлен командный файл Makefile, все это вместе поможет Вам быстрее разобраться. Хотя Makefile используют в основном под Linux, но благодаря пакету WinAVR и утилите make для Windows все прекрасно компилируется и под Windows. Все что нужно сделать для успешной компиляции - просто в каталоге с файлами из архива [8] (распакуйте их в любую временную папку) выполнить команду make. Утилита make сама найдет файл Makefile в текущем каталоге (обратите внимание, у файла Makefile нет обычного расширения файла!) найдет в нем все необходимые команды, которые вызовут компилятор AVR-GCC и скомпилируют Ваш файл *.c. В результате получится файл прошивки с расширением *.HEX (в нашем случае это файл blink_1MHz.hex).

Итак, для начала успешной компиляции нам нужен установленный WinAVR, файл исходного кода и файл Makefile. После установки WinAVR и распаковки архива [8] все это у Вас будет в наличии.

Program-file-list

Откройте в редакторе Programmers Notepad файл исходного кода blink_1MHz.c, и выберите Tools -> Make All. Это будет то же самое, что и ввод команды 'make all' в командной строке той директории, где лежит файл исходного кода blink_1MHz.c и файл команд Makefile. Например, если ввести команду

C:\Code\Blink>make all

то это должно скомпилировать Ваш код. Проще немного делать это из редактора Programmers Notepad, потому что не нужно переключать внимание из редактора на командную строку и обратно.

Как только Вы успешно скомпилировали код и получили HEX-файл (в нашем примере blink_1MHz.hex), этот файл нужно прошить в память AVR. Нужно подключить программатор, и после этого подать питание на собранную систему на Вашем микроконтроллере. Недорогие программаторы AVR требуют подачи питания на программируемое устройство (у нас это плата breadboard с установленным микроконтроллером ATmega328P) - так работают программаторы от Olimex AVR-PG1 или PG2. Включите питание и проследите, что светодиод индикации питания зажегся. В примерах запуска программирования, которые будут показаны дальше будет использоваться программатор AVR-PG2, подключаемый к параллельному порту LPT компьютера. Если у Вас другой тип программатора, то это потребует изменения опций AVRDUDE_PROGRAMMER и AVRDUDE_PORT файла Makefile.

Теперь разберем на примерах, как настроить работу с программатором через файл Makefile. Нужные настройки находятся в секции управления программированием. Если у Вас программатор Olimex AVR-PG1 (он подключается к последовательному порту COMx компьютера), то отредактируйте файл Makefile следующим образом (символ # в начале строки означает комментарий, так можно временно отключать команды в файле Makefile):

#AVRDUDE_PROGRAMMER = stk200
AVRDUDE_PROGRAMMER = ponyser
# com1 = последовательный порт компьютера.
# Для параллельного порта используйте lpt1.
#AVRDUDE_PORT = lpt1
AVRDUDE_PORT = COM1

Если Вы используете Olimex AVR-PG2 (программатор, подключаемый к параллельному порту компьютера) то отредактируйте Makefile примерно так:

AVRDUDE_PROGRAMMER = stk200
#AVRDUDE_PROGRAMMER = ponyser
AVRDUDE_PORT = lpt1
#AVRDUDE_PORT = COM1

Конечно же номера портов зависят от каждого конкретного компьютера (могут быть порты COM2, COM3 и т. д.). Предположим, что Вы нигде не ошиблись, сохранили Makefile и вернулись обратно в редактор Programmers Notepad. С подключенным программатором и включенным питанием выберите в меню Tools -> Program. Это действие запустит на выполнение команду 'make program' (то же самое произойдет, если вручную в командной строке ввести и выполнить команду make program). Если все в порядке, что через секунду файл blink_1MHz.hex будет загружен в память ATmega328, и светодиод LED начнет мигать.

[Разбор решения типичных проблем]

Если Вы все еще не в состоянии запрограммировать свой AVR - это как раз то, с чем сталкиваются 99% начинающих эмбеддеров. Просто проведите диагностику, проанализируйте сообщения об ошибках, прогуглите. Здесь приведены часто встречающиеся проблемы и способы их решения.

1. Запуск программирования AVRDUDE приводит к ошибке can't open device "giveio". Это происходит из-за того, что в Windows XP запрещено управлять устройствами компьютера напрямую, это нужно делать через специальный драйвер. Нужно установить драйвер giveio.sys. Для установки этого драйвера зайдите в папку WinAVR\bin и запустите файл install_giveio.bat (удалить драйвер из системы можно, запустив файл remove_giveio.bat). В Windows 98 никаких специальных настроек не требуется.

2. Неправильно подключенный коннектор ISP чаще всего приводит к проблемам прошивки. Часто также коннектор ISP бывает воткнут наоборот. Проверьте все соединения, они должны быть как на фотографии выше.

3. Возможно, что имеется проблема с питанием. Проверьте мультиметром прямо на ножках микроконтроллера VCC, AVCC наличие напряжения 5V относительно ножек GND и AGND. Все ножки должны быть правильно подключены к соответствующим шинам питания, и на них должно быть нужное напряжение 5V. Иногда питание 5V должно поступать на сигнал VCC коннектора ISP программатора.

4. Проверьте, правильно ли Вы выбрали порт com и lpt в Makefile. Действительные номера портов можно узнать в Диспетчере Устройств Windows.

Многое нужно проверить... это сложно, я знаю. Но когда все заработает как надо, и LED наконец замигает - Вы испытаете фантастические ощущения. Поздравляю! Вы на правильном пути, и как только получите работающую вещь на микроконтроллере, уже трудно остановиться. Вас ждут увлекательные эксперименты: навигация GPS, регистрация данных, передача и прием данных по радио, разводка печатных плат для своих конструкций - всего не перечислить.

[Bootloader - загрузчик кода программы]

Да, такой метод есть, называется USB bootloader (загрузчик кода через интерфейс USB). Загрузчик кода - это просто еще одна программа, которая записана в память микроконтроллера вместе с основной программой. Обычно загрузчик расположен в старших адресах памяти FLASH, в специальной секции памяти Boot Loader Section, или Boot Flash Section. Программа пользователя Application Flash Section начинается с адреса 0, и может занимать все ячейки до начала Boot Flash Section. Например, для микроконтроллера ATmega328P секция загрузчика может начитаться с байтового адреса 0x7000, 0x7800, 7C00 или 7E00 (начальный адрес Boot Loader Section определяется значениями фьюзов микроконтроллера). На рисунке показано адресное пространство микроконтроллера ATmega328P в случае, когда Boot Loader Section начинается с адреса 0x7000.

ATmega328-FLASH-memory-map

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

Для того, чтобы пользоваться загрузчиком, совсем не нужно знать все тонкости его устройства. Достаточно скачать программу-утилиту, которая передает загрузчику HEX-файл, установить драйвер устройства USB (если загрузчик работает через USB), и можно пользоваться. При этом не нужно думать о покупке программатора, загрузчик позволяет перезаписывать программу пользователя практически неограниченное количество раз.

Обычно загрузчик записывает в память микроконтроллера производитель макетной платы (например, платы AVR-USB-MEGA16, AVR-USB162, AVR-USB162MU, AVR-USB32U4, metaboard, AT91SAM7X и Arduino имеют на борту встроенный загрузчик), или даже сам производитель микроконтроллера (компания Atmel на заводе встраивает USB-загрузчик в микроконтроллеры серий AVR USB). Поэтому если у Вас есть плата с загрузчиком, то о прошивке памяти микроконтроллера можно не беспокоиться - загрузите и установите на компьютере софт, предложенный производителем платы, и этого вполне достаточно для программирования микроконтроллера.

Разновидностей загрузчиков довольно много, поэтому остановлюсь только на самых популярных загрузчиках для микроконтроллеров AVR.

Загрузчик USBasp или usbasploader. Этот загрузчик используется вместе с макетными платами AVR-USB-MEGA16 и metaboard. Загрузчик USBasp эмулирует популярный программатор USBasp, и для прошивки используется тот же самый софт, который работает с одноименным программатором - на платформе Windows это Khazama или AVRDUDE, а на Linux, FreeBSD это AVRDUDE. Достоинства загрузчика USBasp - он бесплатен, распространяется с открытыми исходными кодами, использует для перепрошивки интерфейс USB, можно использовать с любыми микроконтроллерами AVR, имеющими аппаратную поддержку секции загрузчика. Подробное руководство со скриншотами, как пользоваться загрузчиком и программой Khazama, см. в описании платы AVR-USB-MEGA16. Подробнее про работу загрузчика USBasp см. [9].

Загрузчик BootloadHID. Также позволяет загружать программу через USB. В работе аналогичен usbasploader, однако занимает меньше памяти программ микроконтроллера, и может быть поэтому с успехом встроен в младшие модели AVR. Также распространяется с открытыми исходными кодами, и может использоваться с любыми микроконтроллерами AVR, имеющими аппаратную поддержку секции загрузчика. Недостаток состоит только в том, что для загрузки кода нужно использовать специальную утилиту. Подробнее см. [10].

Загрузчик DFU Flip. Также позволяет загружать программу через USB. Фирменный загрузчик компании Atmel, который она записывает на заводе во все свои микроконтроллеры AVR с аппаратной поддержкой USB (так называемые микроконтроллеры серии AVR USB). Утилиту Flip (GUI-утилита для передачи HEX-файла в микроконтроллер) и драйвер USB можно бесплатно скачать с сайта Atmel. Также есть и консольная утилита Flip, которую удобно встраивать в меню Tools для прошивки под управлением различных IDE типа Atmel Studio. Пользоваться утилитой Flip очень просто и удобно. Недостаток только в том, что исходный код загрузчика закрыт. Однако благодаря тому, что протокол DFU Flip открыт, имеется загрузчик DFU Flip с открытым исходным кодом (его можно найти в проектах библиотеки LUFA). Загрузчик DFU Flip используется в платах AVR-USB162, AVR-USB162MU, AVR-USB32U4, userial. Подробнее про протокол DFU Flip см. [11].

Загрузчик Arduino. В отличие от всех вышеперечисленных загрузчиков, этот загрузчик использует для передачи кода последовательный интерфейс UART микроконтроллера. Таким образом, для подключения микроконтроллера к компьютеру и закачки HEX-файла требуется специальный переходник USB <-> RS232 TTL. Обычно готовые переходники USB <-> RS232 TTL, которые можно купить на ebay, dealextreme или aliexpress делают на чипе FT232R компании FTDI или на чипе CP2102 компании Silicon Labs. На платах Arduino такой преобразователь USB <-> RS232 TTL уже имеется на борту, поэтому покупать отдельно переходник USB <-> RS232 TTL не нужно. Исходный код загрузчика Arduino и его протокол также опубликованы. Загрузка кода происходит в среде Arduino IDE (если не ошибаюсь, то с помощью скриптов, вызывающих AVRDUDE с нужными опциями командной строки).

Следующая часть: Введение во встраиваемую электронику, часть 3 (подключение внешнего кварцевого резонатора к микроконтроллеру).

[Ссылки]

1. Beginning Embedded Electronics site:sparkfun.com.
2. Введение во встраиваемую электронику, часть 1 (общие вопросы, источник питания 5V).
3. Руководство: как пользоваться мультиметром.
4. Макетная плата stripboard.
5. Цоколевки коннекторов ISP.
6. Программаторы для AVR.
7. Intel HEX: описание формата файла.
8. blink_1MHz.zip - готовая тестовая прошивка (blink_1MHz.hex), мигающая светодиодом, и исходный код для неё (blink_1MHz.c).
9. AVR-USB-MEGA16: USB bootloader USBasp для микроконтроллера ATmega32.
10. AVR-USB-MEGA16: USB bootloader BootloadHID для микроконтроллера ATmega16.
11. AVR4023: протокол FLIP USB DFU.