Например TDA7294

РадиоКот > Статьи

Программирование AVR под Linux

Автор: ANALOG, pletnevroma@mail.ru
Опубликовано 07.08.2013.
Создано при помощи КотоРед.

Предисловие:

Наверное каждый кто пишет программы под AVR микроконтроллеры и имеет на компе Linux задумывался о том чтобы писать именно на нем. И часто это оказывается не так просто. Проблема тут в отсутствии единого подхода. Каждый выкручивается как может. В отличии от Windows, где поставил AVRstudio и все готово. (конечно и под винду есть другие варианты, но статья не об этом). Лично для меня этот вопрос был одной из главных трудностей при переходе на Linux. И даже когда я уже по большей части сидел только на нем, все равно частенько приходилось загружать Windows чтоб запустить родную студию :) Поэтому я решил написать статейку на эту тему. Надеюсь она снимет некоторые вопросы у желающих писать программки для AVR под линуксом. Статья ориентирована скорее на начинающих, поэтому все будет подробно разжевано, а все консольные команды с пояснениями. Используется дистрибутив Linux Ubuntu, но все прокатит и на любом другом.

Что нам для этого понадобится:

geany - прокачанный текстовый редактор с кучей вкусностей о которых ниже, в нем мы будем писать исходные коды.
avra или gcc-avr - компилятор для AVR, он превратит наш исходный код в прошивку для контроллера.
avrdude - крутой прошивальщик который поддерживает кучу разных программаторов и контроллеров, с его помощью будем заливать прошивку в контроллер.
Устанавливаем все это добро. Открываем терминал и вводим:

    sudo apt-get install geany
    sudo apt-get install avra
    sudo apt-get install gcc-avr
    sudo apt-get install avrdude

Возможно, некоторых программ не будет в стандартных репозиториях - тогда репозитории с ними нужно подключить, отредактировав файл /etc/apt/sources.list (после этого не забываем sudo apt-get update) или собрать из исходников. Короче, если что-то из этого на ваш дистрибутив не поставится - погуглите.

Теперь нам понадобится папка с аппноутами для каждого микроконтроллера. Можно взять из недр AVRstudio у кого она есть, но там в дефайнах используется символ '#' на который ругается avra, так что во вложениях к статье есть архив с "хорошими" дефайнами. В эту же папку я кладу свои файлики с макросами которые я использую. Когда все это есть можно уже в принципе приступать к написанию кода. У меня в домашней директории есть папка Projects, а в ней папка AVR, в которой у меня лежит папка APPNOTES а так же все проекты (каждый в отдельной папке).
Таким образом путь, скажем, к дефайну для ATmega8 ~/Projects/AVR/APPNOTES/m8def.inc
А к исходному коду проекта Example ~/Projects/AVR/Example/Example.asm
Все дальнейшее в статье будет изложено исходя из такой структуры, хотя от этого мало что зависит и не составит труда адаптировать все это дело к другой системе.
Пишу я все на ассемблере, но опять же, не составит труда проделать то же самое на С, просто надо использовать gcc-avr вместо avra.

Итак, приступим:

1. Создаем в Geany файл Example.asm с исходным кодом

2. Компилируем его с помощью avra:
    avra --includepath ~/Projects/AVR/APPNOTES Example.asm
Опция --includepath указывает путь к папке, из которой будут браться все инклуды по умолчанию.
Т.е. в коде подключение файла с дефайнами будет выглядеть как .include "tn2313def.inc"
Примечательно, что в справке к avra эта опция значится как --includedir, но если так и ввести, то сама же avra начинает на это ругаться :) так что пишем именно --includepath
Если в коде будут встречены ошибки, avra напишет нам об этом в консольку, с указанием номеров строк с ошибками. Если компиляция прошла успешно, то мы получим файлик Example.hex который нам и назо залить в контроллер.

3. прошиваем контроллер через avrdude
    sudo avrdude -p t2313 -c usbasp -U flash:w:Example.hex
Опции:
 -p указывем тип контроллера
 -c - используемый программатор
 -U указывает файл, с которым будет работать прошивальщик
Модификаторы flash:w: определяют каким образом будет использоваться указанный файл. В данном случае - запись во флеш.

Все, в принципе тут можно и остановиться, но ведь это неудобно до жути - каждый раз руками лапами вбивать всю эту лабуду в консоль. Да еще и в голове держать синтаксис команд, а она-то не резиновая. Вот тут то и настало время "вкусностей" Geany, из-за которых мы именно его и выбрали. Geany задуман как редактор именно для программистов, поэтому в нем есть три абстрактных действия с файлами: компиляция, сборка и запуск. При этом пользователь может сам определить какие команды должны выполняться в этих действиях.
Таким образом, мы получаем возможность повесить запуск avra на действие "компиляция" (или gcc-avr если вы пишете на С) а на "запуск" - avrdude. Еще останется свободным "сборка".
Запускаем наш редактор, открываем файл с исходником и жмем Сборка - Установить комманды сборки.
Видим вот такое окошко:

В поля "Скомпилировать" и "Выполнить" (на скрине подсвечено оранжевеньким) вводим соответственно команды для компиляции и прошивки в кристалл программы.
Все замечательно, но как указать имя файла если мы заранее его не знаем? Тут на помощь приходят 4 шаблона, которые Geany подставляет в команды в процессе их выполнения:
 %f - имя текущего файла (в данном случае это Example.asm)
 %e - имя текущего файла без расширения (Example)
 %d - путь к папке, в которой лежит текущий файл (~/Projects/AVR/Example/)
 %p - путь к текущему проекту (я так и не разобрался что это значит, но не важно :))
Так что команда для компиляции будет выглядеть так:

    avra --includepath ~/Projects/AVR/APPNOTES %f

А для прошивки:

    sudo avrdude -p t2313 -c usbasp -U flash:w:%e.hex

Теперь для того чтобы программа скомпилировалась достаточно нажать F8 (или кнопочку с треугольником и кружочком в самом верху), а чтобы прошилась в контроллер - F5 (или кнопочку с шестеренками).

Так гораздо удобнее, но все еще не идеально - avrdude требует запуска через sudo, поэтому нужно каждый раз вводить пароль при прошивке. Для устранения этой досадной несправедливости откроем терминал и введем:

   sudo chmod +s /usr/bin/avrdude

Этим мы открываем права на запуск avrdude. Теперь можно запускать avrdude без sudo:

    avrdude -p t2313 -c usbasp -U flash:w:%e.hex

Но и теперь процесс не полностью автоматизирован - если мы вдруг решили написать прогу для другого контроллера, то по прежнему нужно лезть в настройки и менять опцию -p у avrdude. Как заставить Geany самому распознавать контроллер? А например по строчке .include "m8def.inc" которая есть в каждой программе.
Для этого давайте напишем небольшой скрипт, который будет это делать. Вернее я его уже написал, а вам предлагается только почитать комментарии к нему, или даже просто скопипастить :) Вот он:

    WARNING!!! В статье не отображаются бекслэши, поэтому они заменены обычными слешами красного цвета: /

    PART=`grep -m 1 "/.include /".*def/.inc/"" %f | grep -o "/(tn/|m/)[0-9]/+" | sed "s/tn/t/g"` && echo "target device: $PART" && avrdude -p $PART -c usbasp -U flash:w:"%e.hex" && exit

(В конце статьи есть файлик filetypes.asm, в котором все это есть. Можно вместо переписывания скриптов просто закинуть его куда надо (~/.config/geany/filedefs/filetypes.asm))

Всю эту здоровенную строку нужно вбить в поле "Выполнить"
Пояснения:
Сначала мы создаем строковую переменную PART, в которую заносим результат выполнения скрипта, определяющего тип контроллера (о самом скрипте чуть ниже)
Затем выводим в консоль название распознанного контроллера (просто так, для справки), потом запускаем avrdude, подставляя в него нужную опцию, ну и в конце я добавил exit чтоб окно терминала само закрывалось после удачной прошивки.
У связки && есть одна приятная особенность: следующая команда выполняется только в случае успешного завершения предыдущей. Таким образом, если при прошивке что-то пошло не так терминал не закроется и мы сможем почитать об ошибках.
Теперь подробнее о скрипте:
первый grep находит в файле с исходником строчку вида .include "[тут что угодно]def.inc", опция -m 1 указывает что не стоит продолжать поиск, если хотя бы одна строка найдена.
Второй получает то что нашел первый и его задача из всей строки высосать именно название контроллера. Делается это с помощью шаблона, задающего вид имени контроллера и опции -o которая говорит ему чтоб выводил только тот кусок что нашел, а не всю строку. Я использую только меги и тиньки, поэтому у меня только tn и m, но вы можете адаптировать скрипт и для других серий. Например для xmega будет (tn|m|x) а для AT90S (tn|m|x|[0-9]) (у AT90S название только из цифр) ну и так далее.
Последняя команда sed заменяет tn на t. Дело в том, что в аппноутах от Атмела тинька 2313 например зовется как tn2313, а avrdude ее понимает как t2313. Вот и приходится изворачиваться.

Ну вот, теперь все совсем уж замечательно и в конечном виде команды компиляции и прошивки выглядят так:

    avra --includepath ~/Projects/AVR/APPNOTES %f

    PART='grep -m 1 "/.include /".*def/.inc/"" %f | grep -o "/(tn/|m/)[0-9]/+" | sed "s/tn/t/g"' && echo "target device: $PART" && avrdude -p $PART -c usbasp -U flash:w:"%e.hex" && exit

Осталась последняя маленькая деталь, которую стоит обсудить - фьюзы.
В принципе, avrdude позволяет их устанавливать, но для этого нужно укурившись даташитом пересчитать их в шестнадцатеричную систему и потом подсунуть в avrdude. Учитывая высокую вероятность ошибки и крайнюю трагичность ее последсятвий такой вариант сразу отметается. Мы же будем для этого юзать графическую оболочку к avrdude - avr 8 burn'o'mat. Качаем deb-пакет с их сайта, устанавливаем. У меня он просто так ставиться не захотел, пришлось подредактировать кое-что. Во вложениях к статье - исправленный deb-пакет. Если возникнут с этим проблемы - пишите в форум, разберемся.

При первом запуске ее нужно настроить. Переходим во вкладку Settings - AVRDUDE
Видим вот такое окно:

Сюда нужно ввести путь к avrdude, к файлу с ее настройками, тип вашего программатора и порт к которому он подключен. В общем, ставим все как на скрине.
Все, после этого выбираем нужный контроллер, жмем Fuses и правим их как надо.

Перед исправлением фьюзов сначала обязательно их считывайте с кристалла! Да и вообще, поаккуратней с ними :)

Можно даже запуск avr8-burn-o-mat повесить на оставшееся свободным действие "Сборка". Тогда вообще все просто замечательно выходит: F8 - скомпилировать, F5 - прошить, F9 - поправить фьюзы.

Ну вот и все, теперь вы сможете с легкостью писать AVR программки из-под вашего любимого линукса.
Удачи вам и правильных фьюзов :)


Файлы:
Архив с аппноутами для avra
deb-пакет с графической оболочкой для avrdude
~/.config/geany/filedefs/filetypes.asm


Все вопросы в Форум.


ID: 1594