- Настройка рабочего окружения в Linux для программирования микроконтроллеров AVR
- Без чего не обойтись
- Интегрированная среда разработки
- Подключаем программатор
- Настройка Eclipse и первый проект
- STM32MP1 — ядра + Linux = идеальный микроконтроллер
- Идеальный контроллер
- Первое знакомство
- Память
- Организация рабочего места
- Engineering & Production mode
- Ядро М4. Загрузка и запуск программ
- Ядро М4. SW4STM32
- Ядро А7. Кросс-компилятор
- Ядро А7. Загрузка и запуск программ
- Обмен данными между ядрами
- Дальнейшие планы
Настройка рабочего окружения в Linux для программирования микроконтроллеров AVR
В этой статье мы рассмотрим шаги, которые нужно предпринять, чтобы получить рабочую среду для программирования микроконтроллеров архитектуры Atmel AVR на языке Си в Linux. Мы адресуем эту статью в большей степени новичкам в Linux, поэтому обратим внимание на некоторые моменты, которые продвинутым пользователям могут показаться элементарными.
Дистрибутивов Linux существует огромное количество, мы будем исходить из того, что вы используете Debian или один из дистрибутивов, основанных на Debian, например популярный дистрибутив Ubuntu. В дистрибутивах, основанных не на Debian, изменится только процедура установки программных пакетов. Мы будем использовать только свободное программное обеспечение, с открытым исходным кодом и, разумеется, полностью бесплатное.
Без чего не обойтись
Необходимый минимум программного обеспечения, которое нам понадобится:
gcc-avr — это та часть мощной GNU Complier Collection (GCC), которая будет осуществлять кросс-компиляцию для целевой архитектуры микроконтроллеров AVR. GCC используется для сборки самого Linux, он поддерживает стандарты языка Си ISO C90 (ANSI-C), ISO C99, а также собственные расширения языка Си. GCC поддерживает огромное количество архитектур процессоров. Код, скомпилированный с помощью GCC для одной из платформ, потребует минимальных правок (или не потребует правок вообще) при компиляции для другой целевой платформы.
binutils-avr — ассемблер, компоновщик и некоторые полезные утилиты.
avr-libc — стандартная библиотека Си для Atmel AVR.
avrdude — утилита для работы с программаторами.
Это необходимый минимум для создания приложений для AVR и прошивки микроконтроллеров. Для отладки пригодятся следующие пакеты:
gdb-avr — отладчик для AVR.
avarice — интерфейс между avr-gdb и AVR JTAG ICE.
simulavr — симулятор Atmel AVR.
Чтобы установить нужные программные пакеты, откроем терминал и выполним следующую команду:
sudo apt-get install gcc-avr binutils-avr avr-libc avrdude gdb-avr avarice simulavr
Подождем некоторое время, пока пакеты будут загружены из репозитория и установлены и посмотрим, что теперь есть хорошего в нашей системе:
ls /usr/bin | grep avr
Это список программ, которые мы получили. Удобство использования Linux заключается не только в том, что все необходимое мы загрузили и установили одной командой, но и в том, что у нас теперь есть исчерпывающа справка по использованию этих инструментов. Чтобы воспользоваться этой справкой, достаточно набрать в терминале
man
Пробегите глазами, например, man avr-gcc, man avr-objdump, man avrdude. Нажмите клавишу ‘h’, когда находитесь внутри команды man, чтобы получить список клавиш для перемещения по странице справки.
В принципе, того, что у нас есть сейчас, достаточно для того, чтобы заниматься разработкой для AVR, используя любой текстовый редактор. Тем, кто хорошо знает Linux и способен написать удобные псевдонимы команд или скрипты, чтобы не писать каждый раз изрядное количество опций к командам, возможно, больше ничего и не понадобится. Но большинству пользователей, думаю, хотелось бы использовать удобную графическую среду разработки, позволяющую писать код, компилировать, отлаживать и загружать его в микроконтроллер.
Интегрированная среда разработки
Мы установим мощную IDE Eclipse, которую сможем использовать не только для программирования микроконтроллеров, но и при желании, для написания программ практически на любом языке для host-платформы. Eclipse — это кросс-платформенный инструмент для построения интегрированных сред разработки, реализуемых в виде плагинов, написанный на Java. Вы можете использовать Eclipse не только на Linux, но и в других операционных системах. Единственный минус этого решения — требовательность к объему оперативной памяти в некоторых случаях. Если на вашей машине меньше 2 Gb оперативной памяти, то мы рекомендовали бы добавить планочку, на всякий случай.
Не будем бегать по сети в поисках Eclipse, посмотрим, что доступно в репозитории:
apt-cache search eclipse
Нам понадобится базовый пакет eclipse и инструменты разработчика на C/C++ eclipse-cdt. Устанавливаем, особо не рефлексируя:
sudo apt-get install eclipse eclipse-cdt
Запустим Eclipse и добавим плагин для удобной работы с AVR, который, помимо всего прочего, обеспечит нам возможность работать с различными моделями программаторов. При запуске Eclipse попросит указать директорию, где будут храниться исходники проектов, выбирайте любое имя на свое усмотрение (директория не должна существовать, Eclipse создаст ее самостоятельно). После того, как Eclipse запустился, пройдем по меню
Help -> Install new software. -> Add.
Нам предлагают ввести URL репозиторя, содержащего нужный нам плагин. Узнать URL можно, посетив сайт marketplace.eclipse.org. Забьем в строку поиска «AVR» и найдем AVR Eclipse Plugin, распространяемый под свободной лицензией. На странице плагина нужно догадаться кликнуть по зеленой стрелочке, чтобы получить URL репозитория: http://avr-eclipse.sourceforge.net/updatesite/.
Копируем этот URL в поле «Location» в оконе «Add repository» Eclipse, жмем «Ok». Eclipse подгрузит список доступного ПО из репозитория, отмечаем чекбокс напротив AVR Eclipse Plugin и жмем «Next». Последующие шаги мастера установки проходим, ни от чего не отказываясь. После установки плагина Eclipse захочет перезапуститься, в наших интересах ему это позволить. IDE готова к работе. Теперь разберемся с программатором.
Подключаем программатор
Для начала воткнем в машину тот программатор, который есть под рукой. Допустим, у нас оказался AVR-910. Для этого программатора понадобится драйвер Prolific, этот драйвер уже присутствует в стандартном ядре Linux и дополнительных телодвижений не потребуется. Если же под рукой оказался популярный программатор AVR910 by PROTTOSS, то возможно, придется его немного допилить.
После втыкания программатора в разъем USB, у нас появится новое устройство. В Linux устройства отображаются в файловую систему и мы можем читать, писать в них и изменять права доступа так же, как мы делаем это с обычными файлами. Устройств в каталоге /dev довольно много, поэтому, чтобы быстро обнаружить новое, воспользуемся стандартными консольными утилитами в терминале:
ls /dev > /tmp/dev1 # сохраним список устройств в /dev во временный файл /tmp/dev1
# присоединим программатор
ls /dev > /tmp/dev2 # сохраним список устройств в /dev во временный файл /tmp/dev2
comm -3 /tmp/dev1 /tmp/dev2 # найдем различия в списках устройств
Мы обнаружили, что в каталоге /dev появилось устройство ttyUSB0. Посмотрим, сможем ли мы с ним работать, хватит ли у нас прав:
ls -l /dev/ttyUSB0
crw-rw—- 1 root dialout 188, 0 окт. 22 14:49 /dev/ttyUSB0
Мы видим, что для устройства заданы разрешения на чтение и запись для пользователя root и группы dialout. Пользователи, не входящие в эту группу, работать с устройством не смогут. Проверим список групп, в которые мы входим:
groups
owlet adm cdrom sudo dip plugdev lpadmin sambashare vboxusers
Так как группы dialout мы не видим, то придется добавить себя в эту группу:
sudo usermod -a -G dialout `whoami` # команда whoami — в обратных кавычках
Теперь нужно выйти из системы и войти снова, чтобы вхождение в группу стало актуальным. Перезагружать систему не обязательно, просто завершим текущий пользовательский сеанс и войдем снова. Проверим принадлежность к группе:
groups
owlet adm dialout cdrom sudo dip plugdev lpadmin sambashare vboxusers
Все в порядке, запускаем Eclipse и.
Настройка Eclipse и первый проект
. попробуем создать проект:
File -> New -> C Project
Придумаем имя проекта и выберим тип — AVR Cross Target Application -> Empty Project. Жмем «Finish», и переходим к настройкам проекта — в панели Project Explorer жмем правой кнопкой мыши на нашем проекте и выбираем «Properties» в выпавшем меню. Чего тут только нет. Нас интересуют вкладки «AVR» и «C/C++ Build».
Сначала идем в AVR -> AVRDude -> Programmer -> Programmer Configuration -> New. . Придумываем имя нашему программатору (например, AVR-910). Теперь нужно выбрать тип программатора. В списке доступных типов мы не находим ничего, похожего на 910. Поэтому кликаем все подряд. Когда доберемся до «Atmel Low Cost Serial Programmer», то увидим в окошке справа:
id = «avr910»;
desc = «Atmel Low Cost Serial Programmer»;
type = avr910;
Это то, что нужно, оставляем этот выбор. Теперь выберем устройство, как мы помним, у нас это /dev/ttyUSB0. Записываем это в поле «Override default port». Это все, жмем «Ok». И устанавливаем только что созданный профиль в качестве значения в поле «Programmer configuration». Идем дальше.
AVR -> Target Hardware -> MCU Type. Если программатор подключен к макетной плате с микроконтроллером (или микроконтроллер воткнут в программатор), то пробуем нажать «Load from MCU». Если MCU Type прочитался и установился корректно, то скорее всего, тип программатьора на предыдущем шаге мы выбрали верно. Если это не так, то нужно еще раз проверить тип программатора, его работоспособность, наличие контакта на макетке. Устанавливаем MCU Clock Frequency в то значение, которое у нас имеется.
Можно еще походить по вкладкам AVR -> AVRDude -> . и обнаружить настройки чтения и записи Fuse и Lock-битов и некоторые другие опции, но пока нам это не нужно и мы идем дальше.
Вкладка C/C++ Build -> Settings -> AVR Compiler -> Miscellaneous -> Other flags — добавляем опцию -g для того, чтобы в ассемблерном листинге мы смогли видеть исходные строки на Си. Посмотрите другие разделы C/C++ Build -> Settings -> AVR Compiler — тут можно установить настройки оптимизации компилятора и другие полезные параметры.
Сохраняем изменения в параметрах проекта и добавим одно полезное сочетание клавиш в нашу IDE: Window -> Preferences -> General -> Keys ищем команду Upload Progect и назначаем сочетание клавиш (например, Ctrl+Alt+U). И там же мы видим, что на комаду Build All уже назначено сочетание Shift+Ctrl+B. Эти две комбинации мы будем вызывать для перекомпиляции исходников и прошивки микроконтроллера.
Теперь нам осталось создать файл main.c (жмем правой лапкой мышки на проекте, New -> File), написать тестовую программу скомпилировать ее и прошить железку. Можно посмотреть ассемблерный листинг получившегося кода, открыв файл .lss, который появится в директории «Debug» или «Release» в проекте (в зависимости от текущего профиля) после компиляции.
Если все прошло удачно, скорее сносите проприетарные операционные системы со своей машины и будьте свободны. О средствах отладки для AVR под Linux мы напишем в следующей статье.
Источник
STM32MP1 — ядра + Linux = идеальный микроконтроллер
По роду своей деятельности занимаюсь разработкой различных приборов: измерительных, управляющих, контролирующих и т.п. В подавляющем большинстве устройство делится на 2 части:
- Требующий больших ресурсов микроконтроллера и не требующий жесткого реального времени графический интерфейс пользователя (GUI).
- Потребляющая немного ресурсов и работающая в жестком реальном времени аппаратная часть прибора.
И как правило, переход на новую серию микроконтроллеров определялся улучшением GUI: больше цветов, выше разрешение, более сложные элементы дизайна. Одно время была мысль использовать в качестве графического интерфейса какую-нибудь плату Raspberry.
Но с появлением у STM новой линейки микроконтроллеров STM32MP1 мои терзания закончились и вот что пока получилось.
Идеальный контроллер
Идеальный контроллер для меня должен обладать следующими характеристиками:
- иметь приличные графические возможности, такие как простая поддержка различных графических форматов, поддержка векторных шрифтов
- большой объем памяти для графики
- поддержка USB клавиатуры и мышей
- поддержка Ethernet
- большое количество аппаратных таймеров
- генерация ШИМ
- большое количество GPIO
- 16 разрядный АЦП
Именно такие требования нужны для построения различных приборов с приличным графическим интерфейсом пользователя.
И поэтому я очень обрадовался увидев новый серию от STM: STM32MP1.
Первое знакомство
Для ознакомления с новым чипом была приобретена плата STM32MP157C-DK2. Вот такая (фото из инета):
Демоплата построена на кристалле STM32MP157CAC, который имеет в своем составе:
- 2 ядра А7, по 650 МГц
- 1 ядро М4, 208 МГц
Память
Самое первое отличие, которое бросается в глаза — это отсутствие флеш памяти на кристалле. Для ядра А7, которое по сути микропроцессор, это нормальная ситуация и код всегда выполняется из DRAM. Микроконтроллеры на основе М4, обычно имеют в своем составе флеш память, в которой хранится исполняемый код.
В этом кристалле у ядра М4 есть только оперативная память и код выполняется из нее (из даташита):
708 Kbytes of internal SRAM: 256 Kbytes of
AXI SYSRAM + 384 Kbytes of AHB SRAM +
64 Kbytes of AHB SRAM in Backup domain
and 4 Kbytes of SRAM in Backup domain
The STM32MP157C/F devices embed a controller for external SDRAM which support the
following devices:
- LPDDR2 or LPDDR3, 16- or 32-bit data, up to 1 Gbyte, up to 533 MHz clock.
- DDR3 or DDR3L, 16- or 32-bit data, up to 1 Gbyte, up to 533 MHz clock.
С одной стороны памяти у ядра M4 вроде бы меньше, чем у версии в флеш памятью, но с другой стороны RAM память работает на частоте ядра. Флеш память так не может, и там приходится использовать делитель частоты.
Организация рабочего места
Поскольку для работы с платой необходим Линукс, то пришлось установить дополнительный жесткий диск в свой комп и развернуть на нем Ubuntu 16.04. Эту ОС рекомендует STM.
Engineering & Production mode
Плата может стартовать в одном из двух режимов (определяется дип-свитчем). В режиме Engineering, ядро М4 работает обособленно. В Production mode ядро М4 работает под управлением ядра А7. Я не использовал режим Engineering, работал только в режиме Production. В этом режиме можно не заботиться о настройке тактирования ядер. Тактирование настраивается в процессе загрузки по максимальным величинам. Я проверил несколько регистров в отладчике, вывел часть частот на MCO и посмотрел осциллографом. A7 работает на частоте 650 МГц, М4 на частоте 208 МГц.
Ядро М4. Загрузка и запуск программ
Поскольку ядро М4 работает под управлением А7, значит под управлением OpenSTLinux. Для управления ядром М4 используется Linux remoteproc framework (RPROC). Этот фреймворк позволяет включать и отключать ядра, загружать и отлаживать программное обеспечение(ELF файлы).
Для загрузки программы в ядро M4 служит следующая команда:
echo -n > /sys/class/remoteproc/remoteproc0/firmware
Для старта программы:
echo start >/sys/class/remoteproc/remoteproc0/state
echo stop >/sys/class/remoteproc/remoteprocX/state
Ядро М4. SW4STM32
With System Workbench for Linux, Embedded Linux on the STM32MP1 family of MPUs from ST was never as simple to build and maintain, even for newcomers in the Linux world.
And, if you install System Workbench for Linux in System Workbench for STM32 you can seamlessly develop and debug asymmetric applications running partly on Linux, partly on the Cortex-M4.
То есть можно писать код как для ядра м4, так и для А7. Но это платная версия. А бесплатная, которая доступна для скачивания, позволяет писать и отлаживать код только для ядра М4.
IDE SW4STM32 была скачана, установлена и попробована. Все работает, процесс написания и компиляции не отличается от версии в Windows.
Отличается только загрузка кода и отладка, поскольку для записи софта используется Ethenet и соединение по SSH. Для отладки и остановки по точкам используется встроенный на плате ST LINK.
Ядро А7. Кросс-компилятор
Для компиляции программ на ПК STM предлагает кросс-компилятор. Процесс загрузки и запуска скрипта кросс-компилятора подробно описан в Вики STM32MP1, ссылка ниже. Все было сделано согласно инструкции, все работает как надо. 🙂
Запуск кросс-компилятора для экосистемы v1.1.0:
source SDK/environment-setup-cortexa7t2hf-neon-vfpv4-openstlinux_weston-linux-gnueabi
ну далее команда
make
и исходный код, в соответствии с makefile, скомпилируется в коды ARM 🙂
Ядро А7. Загрузка и запуск программ
Чтобы загрузить программу в демо плату используется команда:
scp gtk_hello_world root@192.168.1.18:/usr/local
Эта команда загружает файл gtk_hello_world в раздел /usr/local, который находится на плате с IP адресом: 192.168.1.18. Root — пароль, который стоит на плате по умолчанию.
Обмен данными между ядрами
Больше всего времени ушло на понимание работы механизма обмена данными между ядрами. В примерах, которые поставляются STM, есть несколько вариантов реализации подобного обмена. Можно работать напрямик с драйвером из OpenSTLinux или использовать механизм виртуальных UARTов. Я решил сделать обмен через виртуальные порты, как более простой.
Со стороны Линукс это выглядит так:
fd = open(«/dev/ttyRPMSG0», O_RDWR);
Потом пишем в него или читаем:
write(fd, «LED_Toggle\r\0», 10);
len = read( fd, buf, sizeof(buf));
Все достаточно просто, но есть маленький нюанс. Чтобы появилось устройство ttyRPMSG0, нужно чтобы ядро М4 обратилось к ядру А7 в таком виде:
это строки кода ядра М4:
Прием данных из виртуального порта ядром М4:
Запись данных в виртуальный порт:
Все работает, но есть небольшой нюанс, который пока не могу понять. Прием данных ядром А7, которые передает ядро М4, не начинается, если предварительно ядро А7 не запишет в порт какие-либо данные.
Весь этот механизм реализуется набором сторонних библиотек OpenAMP. Эта библиотека должна быть включена в проект ядра М4 и соответственно проинициализирована.
Дальнейшие планы
Установить и настроить Eclipse для написания и отладки кода для А7.
Написать нормальное графическое демо, типа осцилоскопа из АЦП М4.
И наконец, сделать свою плату контроллера на основе этого чипа. 🙂
Источник