разработка и программирование электронных устройств

Программирование AVR и ARM микроконтроллеров в Eclipse. Часть 1

Многие согласятся , что иметь одну среду разработки для программирования различных микроконтроллеров очень удобно, получаем один интерфейс ко всем проектам. Такого мнения придерживаются и разработчики IAR , которые создают свои IDE для различных микроконтроллеров с похожим интерфейсом пользователя.

В случае использования Eclipse CDT среда разработки будет единственная для всех проектов. Это обеспечивается использованием инструментальных средств на базе компилятора GCC под различные целевые платформы.

Небольшое отступление для тех, кто впервые слышит об Eclipse .

Интегрированная среда разработки Eclipse написана на языке программирования Java, для ее работы необходим интерпретатор языка JAVA( виртуальная машина ).

Eclipse является переносимой системой, поскольку интерпретаторы доступны для различных операционных систем. Расширение Elipse возможно благодаря разработке плагинов. Для разных языков программирования существуют свои плагины Eclipse. В плагине Eclipse CDT реализована поддержка разработки программ на языке С( C++, Assembler ).

Для установки Eclipse на персональный компьютер с операционной системой Windows необходимо:

  1. Загрузить виртуальную JAVA-машину с сайта Sun Microsystems по ссылке. Виртуальная машина называется jre, соответственно жмем на кнопку «Download JRE».
  2. Загрузить Eclipse IDE for C/C++ Developers по ссылке.
  3. Установить сначала виртуальную машину jre на компьютер, потом Eclipse. Установка Eclipse сводиться к распаковыванию из архива и копированию каталога Eclipse на жесткий диск.

Для программирования микроконтроллеров AVR и ARM необходимо установить соответствующие инструментальные средства. В качестве таковых для AVR используем пакет WinAVR, для ARM — Sourcery G++.

Чтобы использовать инструментарий под операционную систему Windows для программирования ARM необходимо:

  1. Загрузить IA32 Windows Installer по ссылке.
  2. Запустить программу установки, указать пути для инсталляции пакета программ.

Проверить наличие компилятора в системе после установки можно с помощью команды

arm-none-eabi-gcc – - version

Набрать которую нужно в окне командного интерпретатора( Пуск -> Выполнить… -> cmd ) .

Теперь приступим к установке WinAVR( если он еще не установлен в Вашей системе ). Для этого необходимо загрузить пакет программ WinAVR по ссылке.

После установки пакета WinAVR на Вашем компьютере также установиться текстовый редактор Program Notepad, в котором можна создавать проекты WinAVR.

При работе с Eclipse он нам не понадобиться.

Теперь, когда все установлено, можно приступать к созданию тестового проекта для разных микроконтроллеров.

После запуска Eclipse предложит выбрать рабочее пространство ( Workspace ). Под рабочим пространством в Eclipse понимается каталог, в котором будут храниться все проекты данного рабочего пространства. Каждый проект размещается в отдельном каталоге, который создается автоматически при создании проекта. При запуске Eclipse необходимо выбрать рабочее пространство, в результате чего откроются все проекты, которые находятся в его подкаталогах. Если сделать большую вложенность каталогов относительно рабочего пространства, то Eclipse может не обнаружить в них файлы проектов.

Создадим два разных каталога для проектов под AVR и ARM микроконтроллеров с такими же названиями. При выборе рабочего пространства для проектов под ARM выбираем путь к каталогу /ARM, точно так же поступим с каталогом /AVR.

Впрочем , каталоги можно и не создавать, а просто указать их названия при выборе рабочего пространства, в этом случае Eclipse создаст их автоматически.

Начнем с создания в Eclipse пробного проекта для AVR . Для этого закроем окно приглашения «Welcome» и выберем в главном меню File->New->C Project.

В окне «Project type» выбираем тип проекта «Makefile project», пустой проект «Empty project».В окне «Toolchain» выбираем «Other toolchain». В поле «Project name» указываем название нашего пробного проекта, в результате в каталоге рабочего пространства «С:\AVR» появиться подкаталог с названием проекта.

Жмем на кнопку «Finish».

Появиться новый пустой проект с введенным ранее названием. Он пока не содержит файлов с исходниками программы. Будем создавать их постепенно.

В главном меню выбираем «File->New->Source File». В появившемся окне вводим название С-шного файла, в котором будет находиться функция main.

Создадим таким же образом новый заголовочный файл avr_project.h . Для этого в главном меню выбираем «File->New->Header File» и вводим название заголовочного файла.

Интегрированная среда разработки Eclipse имеет множество различных настроек, доступных из графического интерфейса.

Мы почти не будем их использовать, поскольку нам необходимо создать универсальный инструмент. Для этого необходимо использовать Makefile.

Makefile представляет собой управляющий файл для утилиты make. В него можно добавить команды компиляции , компоновки проекта, загрузки бинарного файла в микроконтроллер и т.д.

Писать каждый раз Makefile с нуля вовсе не обязательно, можно использовать заготовку, редактируя ее для различных проектов.

Для того, чтобы создать Makefile кликаем левой клавишей мышки на названии проекта в окне «Project explorer», потом нажимаем правую клавишу для вызова меню. В появившемся контекстном меню выбираем «New->File». В поле «File Name» окна «New File» выбираем название файла «Makefile» и нажимаем клавишу «Finish».

В результате в окне проводника проекта ( Project explorer ) появиться еще один новый файл с названием Makefile.

Заполняем созданный  Makefile следующим содержимым :

.PHONY:    all clean program

CROSS_COMPILE=    avr-
PROJECT_NAME= avr_project
OBJECTS=        $(PROJECT_NAME).o led.o
MCU_TARGET= attiny2313
DEFS=

INC_PATCH=            C:/winavr-20100110/avr/include

CC=             $(CROSS_COMPILE)gcc

CFLAGS=                 -I. -I$(INC_PATCH) -mmcu=$(MCU_TARGET)

LD=                $(CROSS_COMPILE)gcc
LDFLAGS=        -Wl,-Map,$(PROJECT_NAME).map

OBJCOPY=        $(CROSS_COMPILE)objcopy
OBJDUMP=        $(CROSS_COMPILE)objdump

PROG=            $(PROG_PATH)\avreal32
PROG_PATH=        C:\avw125r5
PROG_PORT_NUM    = 1    #LPT port number
PROG_CLOCK        = 0 #clock extern XTAL1
PROG_FUSE_LIST    = CKSEL=4,SUT=2,CKDIV8=0
PROG_FLAGS    =    +$(MCU_TARGET) -p$(PROG_PORT_NUM)    -ap    -o$(PROG_CLOCK)
PROG_WRITE_FLASH    = -e    -v    -c    $(PROJECT_NAME).hex
PROG_WRITE_EEPROM    =    -d\*osccal=0 -d    $(PROJECT_NAME)_eep.hex    -w
PROG_WRITE_FUSE    =    -F$(PROG_FUSE_LIST) -w

program: $(PROJECT_NAME).hex    $(PROJECT_NAME)_eep.hex
$(PROG) $(PROG_FLAGS) $(PROG_WRITE_FLASH) $(PROG_WRITE_EEPROM)    $(PROG_WRITE_FUSE)

all:    $(PROJECT_NAME)

$(PROJECT_NAME): $(OBJECTS)
$(LD) -gdwarf-2 -O2 $(CFLAGS) $(LDFLAGS) -o $(PROJECT_NAME).elf $(OBJECTS)
$(OBJCOPY) -j .text -j .data  -O ihex $(PROJECT_NAME).elf $(PROJECT_NAME).hex
$(OBJCOPY) -j .eeprom –change-section-lma .eeprom=0  -O ihex $(PROJECT_NAME).elf $(PROJECT_NAME)_eep.hex
$(OBJDUMP) -D $(PROJECT_NAME).elf > $(PROJECT_NAME).lst

$(PROJECT_NAME).o: $(PROJECT_NAME).c
$(CC) -gdwarf-2 -O2 $(CFLAGS) -o $(PROJECT_NAME).o -c $(PROJECT_NAME).c

led.o: led.c
$(CC) -gdwarf-2 -O2 $(CFLAGS) -o led.o -c led.c

clean:
rm -f *.o *.hex *.elf *.map *.lst

Обратите внимание, что перед заданием правила необходимо ставить табуляцию( клавиша «Tab»), иначе после попытки собрать проект появиться сообщение об ошибке.

led.o: led.c
<TAB>$(CC) -gdwarf-2 -O2 $(CFLAGS) -o led.o -c led.c

Файлы led.h и led.c включены в проект( скачать ) для демонстрации добавления в Makefile новых  компилируемых файлов . Код проекта  выполняет мерцание светодиодом с частотой 0,5 Гц. Электрическая схема( скачать) очень проста и содержит микроконтроллер attiny2313, разъем PLD-10, светодиод с резистором 330 Ом.

Выполним настройку способа сборки проекта. Для этого заходим в меню «Project» и убираем галочку напротив пункта «Build Automatically». После этого в том же меню «Project» выбираем «Properties», в открывшемся окне выбираем «C/C++ Build ->Settings» и ставим галочку напротив «GNU Elf Parser».

Для сборки проекта в меню «Project» необходимо кликнуть на «Build all» или нажать комбинацию клавиш «Ctrl + B».

При этом Eclipse выполнит команду «make all», тем самым запустит цель «all» из нашего Makefile. Аналогично если кликнуть в меню «Project» на «Clean…», то выполниться цель «clean» из Makefile. В результате последнего действия будут удалены созданные при сборке проекта файлы.

С целями «all» и «clean» ситуация ясна, а вот что делать, если в нашем Makefile есть еще какие-то псевдо цели, которые необходимо выполнить из среды Eclipse?

Например, в нашем Makefile есть цель «Program», предназначенная для запуска внешней утилиты-программатора avreal ( скачать ) и прошивки микроконтроллера.

Для того, чтобы добавить новую цель в Eclipse выберите в контекстном меню проекта пункт «Make Targets» и далее «Build…».

В открывшемся окне «Make targets» необходимо нажать на кнопку «Add» и добавить цель «Program».

Теперь, когда Вам необходимо запрограммировать микроконтроллер, можно сделать это прямо из Eclipse, выбрав в контекстном меню проекта «Make Targets – > Build…», потом выделить необходимую цель ( «Program » ) и нажать на кнопку «Build».

Результаты работы программатора можно наблюдать на вкладке «Console» внизу экрана Eclipse.

Я использовал для программирования микроконтроллера самую простую схему программатора, совместимую с avreal. Это обычный кабель , подключаемый к LPT-порту компьютера. Распайка кабеля тут, адаптер называется «FBPRG».

Также для работы адаптера необходимо установить  драйвера доступа к порту .

На этом знакомство с программированием AVR микроконтроллеров в Eclipse заканчиваем и приступаем к изучению программирования в Eclipse микроконтроллеров ARM . Различия заключаются в основном в структуре проекта для AVR и ARM. Принцип работы в Eclipse такой же.

Программирование микроконтроллеров ARM в Eclipse

Попробую изобразить процесс разработки программ в Eclipse для ARM микроконтроллеров с помощью GNU Tool chain на следующей схеме

Из схемы видно, что исходные файлы на языках С и Assembler компилируются с помощью arm-none-eabi-gcc. Компилятор arm-none-eabi-gcc может осуществлять вызов ассемблера arm-none-eabi-as, компоновщика arm-none-eabi-ld, поэтому в нашем Makefile вместо них будет указан arm-none-eabi-gcc.

В результате компиляции получается один или несколько объектных файлов. Далее компоновщик arm-none-eabi-ld выполняет компоновку объектных модулей в памяти микроконтроллера. Для микроконтроллеров с архитектурой ARM код программы может находиться в разных областях памяти( FLASH, SRAM ).

На размещение кода и данных внутри микроконтроллера можно влиять путем создания файла сценария компоновки. Сценарий компоновки передает линкеру адрес и размер доступных в микроконтроллере объемов памяти, предписывает компоновщику размещение секций программы по конкретным адресам .

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

После компоновки создается один файл исполняемого образа программы в формате elf .

Этот файл содержит всю необходимую для выполнения программ информацию, но его нельзя непосредственно загрузить в микроконтроллер.

Для этого необходимо выполнить преобразование утилитой arm-none-eabi-objcopy в один из доступных для прошивки форматов ( bin , intel hex, motorola S-records и т.д. ).

Из полученного после компоновки elf- файла можно получить листинг кода программы на языке ассемблера с помощью утилиты arm-none-eabi-objdump.

Makefile на нашей схеме изображен отдельно , в нем находиться предписание для утилиты make для сборки всего проекта.

Таким образом , для эффективного программирования ARM с помощью GNU tool chain в Eclipse( равно как и в командной строке ) кроме навыков программирования на языках С и/или Assembler, необходимо также уметь составлять ( редактировать ) Makefile и скрипт компоновки, что не так сложно, как может показаться на первый взгляд.

Долго не мог определиться с аппаратной платформой для демонстрации примеров работы в Eclipse,  поскольку собрать простое устройство на ARM микроконтроллере «на коленке» сложнее из-за  корпусов , применяемых в ARM. Но решение пришло само-собой . Случайно наткнулся в магазине радиодеталей на платку TQFP24-144-05. На эту плату может быть запаяна микросхема в корпусе LQFP с шагом выводом 0,5 мм и количеством выводов от 24 до 144.

Более подробно о макетной плате для изучения ARM микроконтроллеров читайте в моей статье «Самодельная макетная плата для  микроконтроллера STM32F103RBT6″.

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

Продолжение следует…

6 Comments to Программирование AVR и ARM микроконтроллеров в Eclipse. Часть 1

  1. Volldemar's Gravatar Volldemar
    7 июля 2010 at 11:07 | Permalink

    На сколько критично использование именно — Sourcery G++? что содержит
    этот пакет? у меня установлен yagarto. У меня сейчас работает связка SAM-ICE+JLINKGDBServer+Eclipse, хочу перейти на FTDI_JTAG+OpenOCD+Eclipse, так как SAM-ICE работает только с АРМами фирмы Atmel.

  2. Volldemar's Gravatar Volldemar
    15 июля 2010 at 10:58 | Permalink

    Скачал OpenOCD с: http://www.freddiechopin.info/index.php/en/download/category/4-openocd
    думаю лучше со свеженькой версией работать.

  3. kontroller's Gravatar kontroller
    19 ноября 2010 at 20:57 | Permalink

    Не могу скачать led.h и led.c

Leave a Reply

You must be logged in to post a comment.