Bootloader для ATmega32

Arduino — бесспорно, одна из лучших платформ для новичков,  которые хотят приобщится к миру электроники и микроконтроллеров. В свое время, мне надоела разработка чисто виртуальных программ, результаты работы которых видны лишь на экране монитора, и я приобрел ее. Конечно радости были полные штаны. когда 13 светодиод моей arduino nano замигал по прошитой программе.) На ее основе я переделал китайский вертолет на bluetooth управление с помощью телефона на ОС Android.  Но со временем излишняя функциональность, в купе с ограниченностью среды разработки программ, начинали давить. Да и, по сути, что такое arduino!? Это всего лишь МК семейства AVR с обвязкой и bootloader’ом, позволяющем заливать прошивку с помощью  COM порта (или его USB, в данном случае, эмулятора).

Именно наличие прошитого загрузчика, является главным преимуществом в работе с этой платформой. Отпадает необходимость в специальный программаторах, простых — из пяти проводков, но не надежных, грозящих спалить и так, на сегодняшний момент, стремительно исчезающий LTP порт (у меня он только на компе девушки остался, единственный!:)). Или сложных и дорогостоящих, которые вряд ли нужны новичку.

В общем, мне bootloader, позволил бы прошивать МК вообще без «веревки» проводной связи с компом, через bluetooth sereal adapter, и эта фича казалась очень заманчивой. Тем более я приобрел Atmega32, с достаточным количеством flesh памяти, чтобы пожертвовать 512 или даже 1024байта на загрузчик.

Надо сказать, что ничего самому разрабатывать не придется, благо загрузчиков для AVR контроллеров довольно много. Нужно только выбрать соответствующий своим требованиям и настроить его под свои нужды.

Мне понравился следующий загрузчик  AVRPROG compatible bootloader for ATMEL ATmega Controllers О нем достаточно много информации на русском, да и в использовании он прост. Написан Си, что радует, и освобождает мозг от путешествия по лабиринтам assembler’а в процессе настройки, практически освобождает… Об этом загрузчике довольно хорошо и подробно написано в этой статье.

Я же остановлюсь на особенностях его использования с помощью Bluetooth эмулятора COM порта и ATmega32. Для настройки bootloader’а, нам потребуется AVR Studio. Качаем исходник с сайта проекта, либо из вышеприведенной статьи, открываем в студии, переходим к вкладке файла main.c, и приступаем к его изменению .

1 Выставляем частоту кварца, с которым будет работать наш МК (у меня 16МГц), выбираем или вписываем нужную, остальные коментим двумя слешами //:

#ifndef F_CPU
// #define F_CPU 7372800
//#define F_CPU (7372800/2)
#define F_CPU 16000000
#endif
#ifndef F_CPU
// #define F_CPU 7372800
//#define F_CPU (7372800/2)
#define F_CPU 16000000
#endif

2. Выбираем скорость UART. В моем случае она обусловлена скоростью, интерфейса BT модуля:

//#define BAUDRATE 9600
#define BAUDRATE 19200
//#define BAUDRATE 115200
//#define BAUDRATE 9600
#define BAUDRATE 19200
//#define BAUDRATE 115200

3. Тип устройства оставляем:

/* Тип устройства:
   Для AVRDude выбирать BOOT
   прошивается программаторами AVR109/AVR910 */
#define DEVTYPE     DEVTYPE_BOOT
// #define DEVTYPE     DEVTYPE_ISP
/* Тип устройства:
   Для AVRDude выбирать BOOT
   прошивается программаторами AVR109/AVR910 */
#define DEVTYPE     DEVTYPE_BOOT
// #define DEVTYPE     DEVTYPE_ISP

4. Способ входа в загрузчик тоже поддается изменению. Мне было удобнее, чтобы при подаче питания на контроллер стартовал загрузчик и ожидал 10сек (для соединения с BT-модулем). По завершению этого времени, управление передается основной программе. Этот способ запуска определяется следующим кодом:

//#define START_SIMPLE
#define START_WAIT
//#define START_POWERSAVE
//#define START_BOOTICE
//#define START_SIMPLE
#define START_WAIT
//#define START_POWERSAVE
//#define START_BOOTICE

Есть возможность выбора входа в загрузчик по нажатию кнопки, тогда нужно активировать строку #define START_SIMPLE и установить номер порта, на котором висит кнопка:

#define BLPORT      PORTD
#define BLDDR       DDRD
#define BLPIN       PIND
#define BLPNUM      PIND7
#define BLPORT		PORTD
#define BLDDR		DDRD
#define BLPIN		PIND
#define BLPNUM		PIND7

Еще автор приведенной статьи добавил полезную фичу — светодиод индикатор загрузчика. Когда МК находится в этом режиме — светодиод горит. Выбираем порт для него:

#define ENABLE_BOOT_LED
#define BIPORT      PORTD
#define BIDDR       DDRD
#define BIPIN       PIND
#define BIPNUM      PIND6
#define ENABLE_BOOT_LED
#define BIPORT		PORTD
#define BIDDR		DDRD
#define BIPIN		PIND
#define BIPNUM		PIND6

Далее сохраняем файл и переходим к вкладке makefile. Здесь нам нужно выбрать наш микроконтроллер и размер области загрузчика:

# MCU name
## MCU = atmega8
## MCU = atmega16
## MCU = atmega162
## MCU = atmega169
   MCU = atmega32
## MCU = atmega324p
## MCU = atmega64
## MCU = atmega644
## MCU = atmega644p
## MCU = atmega128
## MCU = at90can128
# MCU name
## MCU = atmega8
## MCU = atmega16
## MCU = atmega162
## MCU = atmega169
   MCU = atmega32
## MCU = atmega324p
## MCU = atmega64
## MCU = atmega644
## MCU = atmega644p
## MCU = atmega128
## MCU = at90can128
## NO! BOOTSIZE=128
## NO! BOOTSIZE=256
## BOOTSIZE=512
   BOOTSIZE=1024
## BOOTSIZE=2048
## NO! BOOTSIZE=128
## NO! BOOTSIZE=256
## BOOTSIZE=512
   BOOTSIZE=1024
## BOOTSIZE=2048

Все.) Нажимаем F7, следим, чтобы не было ошибок и получаем .hex файл с прошивкой бутлоадера. Кстати, если есть желтые warning’и — это не критично.

После настройки bootloader’а как указано выше (в статье), необходимо прошить его в микроконтроллер (один раз, но программатор все же понадобиться). Я использовал простейший LTP программатор и PoniProg. Как правило, с заливкой прошивки проблем не возникает. Но на выставлении соответствующих фьюзов, остановимся подробнее. Для Atmega32, кварца 16МГц и загрузчика на 1024б в указанной программе fuse биты должны быть выставлены следующим образом:

После заливки boot’а в  подаче напряжения на МК горит светодиод, подключенный к соответствующему порту. Это значит, что выполняется программа загрузчика. Так как больше в МК ничего не зашито, то индикатор будет гореть постоянно. Проверим, готов ли bootloader к прошивке микроконтроллера. Я для этого подключаю к МК свой BT-модуль, эмулирующий COM порт, устанавливаю с ним соединение, и с помощью любой терминальной программы посылаем символ «S», не забывая установить нужную скорость работы. Если в ответ приходит «AVRBOOT» — все ок, радуемся!)

Теперь о том как прошивать МК с boot’ом. По идее, этот загрузчик должен без проблем работать с AVRProg. Однако мне, как я ни старался, так и не удалось подружить с ней мой девайс. Вылезала ошибка, что устройство не определено, хотя все терминалки, как одна, в ответ на «S» посылали мне магическое слово. Намучавшись в студии, я забил на это дело и закачал себе AVRDude, утилиту для прошивки МК в графической оболочке GUI, чему был несказанно рад.)

Алгоритм работы с прогой, при прошивке через bluetooth эмулятор COM порта, следующий:

  1.  Подаем питание на МК, с подключенным к нему BT-модулем;
  2. Соединяемся с модулем, выбрав в bluetooth окружении наш девайс. Для индикации соединения я предусмотрел светодиод, когда он горит — коннект есть. Описан мой модуль BTM-112 в статье про Bluetooth вертолет;
  3. Отрываем AVRDude и выбираем *.hex нашей прошивки;
  4. В командной строке прописываем следующую строку, заменяя номер COM порта, тип МК (у меня ATmega32, поэтому m32) и путь к файлу прошивке на свои: "Расположение avrdude.exe" -p m32 -c avr910 -P com4 -U flash:w:"Расположение .hex":a -U signature:r:con:r -F -v ; 
  5. В зависимости от способа входа в загрузчик МК, либо нажимаем соответствующую кнопку, либо жмем rezet, если загрузчик стартует сразу и находится в ожидании, загорается светодиод — индикатор загрузчика. Затем, нажимаем «Execute», при этом соединение по BT должно быть установлено.
  6. AVRDude также посылает в прот символ «S»? и получив ответ bootloeder’а начинает заливать в МК программую. А меня при этом горит светодиод — индикатор передачи данных по
    UART интерфейсу от модуля к МК.
  7. После завершения заливки программы, AVRDude освобождает порт, при этом у меня происходит раъединене BT-модуля и компа.
  8. Далее отжимаем кнопку загрузчика, или ждем некоторое время, пока он активен и после этого происходит передача управления основной программе МК. Первый раз я прошил классическое мигание светодиодом.), что и видно на картинке.

На первом рисунке горит индикатор bootloadera (обозначен желтым прямоугольником), соединение по BT установлено и МК готов к загрузке программы. На втором рисунке программа прошита, загрузчик завершил работу по времени, индикатор погас (в красном прямоугольнике), передано управление вновь прошитой проге, мигания светодиодом (желтый прямоугольник).

Довольно просто.) Благодаря прошитому загрузчику, я получил МК, имеющий основное преимущество Arduino — отсутствие необходимости специальных программаторов, и в тоже время, лишенный главных недостатков, таких как ограниченность среды разработки программ. Вы можете использовать любую, удобную для вас среду, AVR Studio, CodeVision, любой язак программирования Assembler, Си, Pascal , и многие другие. Получить полный доступ ко всем настройкам МК, оптимизируя его под конкретную задачу. Очень удобно, при разработке, когда нужно многократно тестить написанмую прогу и корректировать ее, а так же в процессе освоения МК, загружая все новые и новы прошивки.

Далее я сделаю несколько тестовых задач, которые позволят в будущем перейти к созданию универсального устройства, для управления вертолетами по BT-каналу.)

Запись опубликована в рубрике AVR. Добавьте в закладки постоянную ссылку.

         
Подписаться на новые статьи блога:

Один комментарий: Bootloader для ATmega32

  1. Уведомление: TSOP от BEAM’а к МК | Skab in Sky

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.