Программирование и отладка микроконтроллеров ARM Cortex-M4 фирмы Atmel в среде операционной системы Linux

№ 2’2016
PDF версия
В статье описан процесс развертывания экосистемы разработки приложений для микроконтроллеров Atmel серии SAM4S в среде операционной системы Linux. Читатель познакомится также с оценочной платой SAM4S-EK и семейством ARM Cortex-M4 микроконтроллеров фирмы Atmel. Приведены рекомендации по работе с адаптером отладки SAM-ICE (он же J‑LINK) и программой OpenOCD.

Введение

Выбор операционной системы Linux в качестве среды для программирования микроконтроллеров ARM Cortex-M4 фирмы Atmel трудно назвать общепринятой практикой. Напротив, для разработки под свои микроконтроллеры Atmel свободно распространяет среду Atmel Studio 7, предназначенную исключительно для операционных систем Windows. Не секрет и тот факт, что для новичка разворачивание и настройка среды Atmel Studio 7 окажется куда проще, чем выбранный автором путь.

Автор предлагает использовать среду разработки Qt Creator в связке с инструментарием для кросс-компиляции GCC и с пакетом OpenOCD для отладки. В качестве операционной системы выбрана Linux Lubuntu 14.04 LTS (выполняющаяся на виртуальной машине, но это несущественно). Данный подход позволяет с легкостью переходить на другие ARM (и не только) микроконтроллеры, не меняя при этом привычный комплект инструментов. В частности, в [1] приводится пример разработки для микроконтроллеров STM32F4 фирмы STMicroelectronics с применением такого же комплекта инструментов.

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

Аппаратная платформа

Автор работает с оценочной платой SAM4S-EK от фирмы Atmel и отладочным адаптером SAM-ICE, любезно предоставленными компанией Rainbow Electronics (рис. 1).

Внешний вид платы SAM4S-EK с подключенным отладочным адаптером

Рис. 1. Внешний вид платы SAM4S-EK с подключенным отладочным адаптером

В основе оценочной платы лежит микроконтроллер SAM4S16C фирмы Atmel, ключевые особенности которого приведены ниже:

  • Ядро ARM Cortex-M4, максимальная тактовая частота 120 МГц.
  • Объемы памяти на кристалле: 1 Мбайт flash-памяти и 128 кбайт ОЗУ.
  • Среди периферийных устройств можно выделить:
    – USB-контроллер (работа только в режиме Device);
    – контроллер внешней NAND flash-памяти;
    – контроллер SD-карт памяти.
  • Контроллеры интерфейсов UART, I2C, SPI и др.
  • 100-выводный корпус.

К особенностям оценочной платы SAM4S-EK относится следующее:

  • Микросхема NAND flash-памяти Micron MT29F2G08ABAEA объемом 2 Гбит.
  • Цветной дисплейный модуль FTM280C34D разрешением 320×240 точек, с диагональю 2,8 дюйма и резистивной сенсорной панелью. Дисплей содержит встроенный контроллер Ilitek ILI9320, подключенный к микроконтроллеру по параллельному интерфейсу.
  • Контроллер резистивной сенсорной панели Texas Instruments ADS7843E.
  • Распаяны два DB9-разъема для двух портов RS-232 (один из них — с сигналами RTS, CTS), выведен также интерфейс RS-485.
  • Элементы сенсорного управления по технологии Atmel QTouch расположены прямо на печатной плате (5 сенсорных кнопок и слайдер).
  • Электретный микрофон и операционный усилитель TS922 для него.
  • Усилитель звуковой частоты для подключения наушников TPA022, а также 3,5-мм гнездо типа «джек».
  • Два коаксиальных BNC-разъема, которые подключены к встроенным АЦП и ЦАП-блокам микроконтроллера.
  • Держатель micro SD-карты памяти.
  • 63 вывода общего назначения (GPIO) выведены на IDC-разъемы с шагом 2,54 мм.

Более подробно как о плате SAM4S-EK, так и о микроконтроллере SAM4S16C можно узнать на сайте Atmel [12].

Комплект инструментов

Когда аппаратная (плата SAM4S-EK) и программная (операционная система Linux Lubuntu) платформы определены, можно построить систему аппаратных и программных инструментов для программирования и отладки целевого микроконтроллера (рис. 2)

Структурная схема процесса отладки микроконтроллера

Рис. 2. Структурная схема процесса отладки микроконтроллера

По интерфейсу JTAG микроконтроллер подключен к отладочному адаптеру SAM-ICE, который в свою очередь подсоединен к рабочей станции по интерфейсу USB. Питание отладочного адаптера подается также по интерфейсу USB, а питание платы разработчика вместе с микроконтроллером должно осуществляться отдельно (на рис. 2 не показано).

На рабочей станции должна выполняться некая программа, взаимодействующая с адаптером отладки SAM-ICE с одной стороны и отладчиком GDB, входящим в инструментарий GCC, — с другой. На эту роль идеально подходит свободно распространяемая программа OpenOCD [46], которая помимо отладки может использоваться для загрузки прошивки во flash-память микроконтроллера и для внутрисхемного тестирования.

Программа OpenOCD поддерживает как адаптер отладки SAM-ICE (в действительности это аналог популярного J-LINK), так и оценочную плату SAM4S-EK (соответственно и микроконтроллеры Atmel SAM4). Кроме этого, OpenOCD доступна в виде исходных кодов и может быть собрана для операционной системы Linux.

Интегрированная среда разработки Qt Creator (рис. 2) получает отладочную информацию через отладчик GDB и предоставляет ее в удобном для разработчика виде (точки останова, значения переменных, пошаговое выполнение программы и др.).

Программа OpenOCD работает в режиме сервера и допускает подключение других клиентов-программ, например telnet-клиента (рис. 2). Это может быть удобно для серийного программирования микроконтроллеров на производстве.

Установка OpenOCD

Установить OpenOCD можно наименее трудоемким способом — из репозиториев Ubuntu, для чего следует выполнить команду:

sudo apt-get install openocd

Однако в этом случае будет установлена устаревшая версия 0.7.0 (проверить версию установленной программы OpenOCD можно, выполнив команду openocd—version).

Для получения актуальной версии (на момент написания статьи — 0.9.0) необходимо собрать OpenOCD из исходных кодов. Для этого надо выполнить следующие действия:

  1. Загрузить исходные коды OpenOCD с сайта [2], выполнив команду:
    cd ~
    wget http://downloads.sourceforge.net/project/openocd/openocd/0.9.0/openocd-0.9.0.tar.bz2.

    В результате в домашнем каталоге должен появиться файл-архив openocd-0.9.0.tar.bz2.

  2. Далее следует разархивировать OpenOCD, выполнив команду:
    tar xvf openocd-0.9.0.tar.bz2

    В результате в домашнем каталоге должен появиться каталог с исходным кодом openocd-0.9.0.

  3. Проверить, установлена ли библиотека libusb-dev, которая необходима для взаимодействия рабочей станции и адаптера SAM-ICE по USB-интерфейсу. Чтобы проверить наличие библиотеки libusb-dev, следует выполнить команду:
    sudo dpkg —get-selections | grep libusb

    Если библиотека установлена, то вывод должен быть примерно такой:

    libusb-0.1-4:i386 install
    libusb-1.0-0:i386 install
    libusb-1.0-0-dbg:i386 install
    libusb-1.0-0-dev:i386 install
    libusb-1.0-doc install
    libusbmuxd2 install

    Если библиотека не установлена, то сделать это можно, выполнив команду:

    sudo apt-get install libusb-dev
  4. Для сборки OpenOCD также потребуются следующие пакеты:

    – make;
    – libtool;
    – pkg-config версии 0.23 и выше;
    – autoconf версии 2.64 и выше;
    – automake версии 1.9 и выше;
    – texinfo.

    Проверить их наличие можно тем же способом, что и библиотеки libusb-dev, как описано выше.

  5. Теперь можно собрать пакет OpenOCD с поддержкой адаптера SAM-ICE, для чего следует последовательно выполнить следующие команды:
    cd ~/openocd-0.9.0
    ./configure —enable-jlink
    make
    sudo make install

Ключ —enable-jlink предписывает включить поддержку адаптера J-LINK. Дело в том, что адаптер SAM-ICE представляет собой модифицированный J-LINK BASE от фирмы Segger, так что он может взаимодействовать только с микроконтроллерами фирмы Atmel. Однако программный интерфейс для работы с J-LINK полностью совместим с адаптером SAM-ICE.

Подключение адаптера SAM-ICE

Далее следует подсоединить адаптер SAM-ICE к рабочей станции и проверить список подключенных по USB устройств командой:

Lsusb

Если адаптер SAM-ICE подключен, то вывод команды должен содержать следующую строку:

Bus 002 Device 003: ID 1366:0101 SEGGER J-Link ARM

где 1366 — VID-номер (код производителя USB-устройства), 0101 — PID-номер (код изделия). Эти номера потребуются в дальнейшем для настройки менеджера устройств udev.

Для того чтобы обеспечить взаимодействие сервера отладки OpenOCD с адаптером SAM-ICE по интерфейсу USB, необходимо создать файл-правило для менеджера устройств udev, например так:

sudo nano /etc/udev/rules.d/45-jlink.rules

В окне редактора Nano ввести следующий текст:

SUBSYSTEMS==”usb”, ATTRS{idVendor}==”1366”,
ATTRS{idProduct}==”0101”,
MODE:=”0666”,
SYMLINK+=”jlink_%n”

где поля idVendor и idProduct соответствуют полученным ранее номерам VID и PID.

Далее следует перезагрузить рабочую станцию.

Если же сконфигурировать udev, как описано в [3], то запуск сервера отладки OpenOCD будет возможен только с правами суперпользователя, что в дальнейшем создаст проблемы с отладкой из среды Qt Creator.

Совместная работа адаптера SAM-ICE и сервера отладки OpenOCD

В каталоге проекта (автор использовал каталог ~/sam/) необходимо создать файл конфигурации openocd.cfg со следующим содержимым:

telnet_port 4444
gdb_port 3333
source [find interface/jlink.cfg]
source [find board/atmel_sam4s_ek.cfg]
gdb_flash_program enable

Файл openocd.cfg содержит предписания для сервера OpenOCD, а именно:

  • разрешить подключение к серверу по протоколу telnet через порт 4444;
  • установить порт 3333 для подключения отладчика GDB;
  • соединяться с адаптером J-LINK (SAM-ICE);
  • целевая платформа — оценочная плата Atmel SAM4S_EK;
  • разрешить программирование flash-памяти.

Теперь, когда нужное программное обеспечение установлено, а отладчик подключен к рабочей станции и целевому микроконтроллеру, можно проверить работоспособность системы. Для этого следует, находясь в каталоге проекта (~/sam/), запустить сервер OpenOCD командой

Openocd

Если все сделано правильно, в терминал будет выведено:

Open On-Chip Debugger 0.9.0 (2015-12-29-14:45)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport “jtag”. To override
use ‘transport select <transport>’.
adapter speed: 500 kHz
adapter_nsrst_delay: 100
jtag_ntrst_delay: 100
cortex_m reset_config sysresetreq
Info : J-Link ARM V8 compiled Nov 25 2013 19:20:08
Info : J-Link caps 0xb9ff7bbf
Info : J-Link hw version 80000
Info : J-Link hw type J-Link
Info : J-Link max mem block 9296
Info : J-Link configuration
Info : USB-Address: 0x0
Info : Kickstart power on JTAG-pin 19: 0xffffffff
Info : Vref = 3.313 TCK = 1 TDI = 0 TDO = 0 TMS = 0 SRST = 1 TRST = 1
Info : J-Link JTAG Interface ready
Info : clock speed 500 kHz
Info : JTAG tap: sam4.cpu tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4)
Info : sam4.cpu: hardware has 6 breakpoints, 4 watchpoints

При этом приглашение командной строки выведено не будет, что свидетельствует об успешном запуске сервера и установленном соединении с целевым микроконтроллером через отладочный адаптер SAM-ICE.

Теперь можно подключиться к серверу отладки по протоколу telnet, для чего надо открыть второй терминал и выполнить команду:

telnet localhost 4444

где 4444 — номер порта, заданный ранее в конфигурационном файле openocd.cfg. В результате будет установлено соединение с сервером отладки и появится приглашение для ввода команд:

Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
Open On-Chip Debugger
>

Когда соединение с сервером установлено, можно выполнить любую из команд OpenOCD (полный список — в [7]), например просмотреть содержимое регистров ядра микроконтроллера. Для этого следует остановить выполнение программы в микроконтроллере командой halt:

> halt
target state: halted
target halted due to debug-request, current mode: Thread
xPSR: 0x81000000 pc: 0x004003e6 msp: 0x20003488

Затем просмотреть непосредственно содержимое регистров командой reg:

> reg
===== arm v7m registers
(0) r0 (/32): 0x00000013
(1) r1 (/32): 0x00000800
(2) r2 (/32): 0x004023D8
(3) r3 (/32): 0x00000000
(4) r4 (/32): 0x81CBF6AB
(5) r5 (/32): 0x788E2033
(6) r6 (/32): 0x5C2195CC
(7) r7 (/32): 0x20003488


Завершить работу сервера OpenOCD можно командой shutdown, при этом автоматически закроется и telnet-соединение:

> shutdown
shutdown command invoked
Connection closed by foreign host.
andy@andy-vm:~$

Связку «адаптер SAM-ICE — программа OpenOCD» можно использовать для серийного производства для загрузки готовой прошивки во flash-память микроконтроллера. Например, чтобы очистить всю flash-память микроконтроллера Atmel SAM4S16C, необходимо выполнить команду:

openocd -f interface/jlink.cfg -f board/atmel_sam4s_ek.cfg -c init -c
halt -c “flash erase_address 0x00400000 0x100000” -c reset -c shutdown

где 0x00400000 — адрес начала flash-памяти в адресном пространстве, 0x100000 — размер flash-памяти в шестнадцатеричной системе счисления, для микроконтроллера SAM4S16C составляет 1 Мбайт = 2^20 байт = 0x100000(16) байт. Адрес начала flash-памяти и ее размер получен из документации на данный микроконтроллер [12].

В случае успешного стирания вывод программы OpenOCD должен содержать строку:

erased address 0x00400000 (length 1048576) in 4.685278s (218.557 KiB/s)

Для непосредственно записи прошивки во flash-память надо выполнить команду:

openocd -f interface/jlink.cfg -f board/atmel_sam4s_ek.cfg -c init -c
halt -c “flash write_image erase sam.hex” -c reset -c shutdown

где sam.hex — имя файла с прошивкой в формате Intel HEX. OpenOCD принимает также другие форматы файлов с прошивкой, например binary и ELF.

В случае успешной загрузки прошивки во flash-память вывод должен содержать строки:

Info : sam4 does not auto-erase while programming (Erasing relevant sectors)
Info : sam4 First: 0x00000000 Last: 0x00000000
Info : Erasing sector: 0x00000000
wrote 8192 bytes from file sam.hex in 2.979438s (2.685 KiB/s)

То есть в данном случае очищаются лишь те сектора flash-памяти, в которые будет размещена прошивка.

Создание комплекта в Qt Creator

Теперь, когда связка «адаптер отладки -сервер отладки» настроена и готова к работе, можно приступать к настройке интегрированной среды разработки, в нашем случае — Qt Creator.

При этом предполагается, что на рабочую станцию уже установлен инструментарий GCC для сборки микроконтроллеров ARM, а также установлена и настроена сама среда Qt Creator, процесс установки и настройки которых подробно описан в [1].

Прежде всего, необходимо добавить сервер отладки, для этого в Qt Creator следует вызвать настройки (пункт главного меню «Инструменты -> Параметры…»), выбрать вкладку BareMetal («Голое устройство»), нажать «Добавить» и выбрать пункт OpenOC. Появится окно, где можно указать параметры запуска сервера (рис. 3). Следует отметить, что поддержка OpenOCD добавляется в среду Qt Creator при включении модуля BareMetal, как это сделать — описано в [1].

Добавление сервера отладки OpenOCD в Qt Creator

Рис. 3. Добавление сервера отладки OpenOCD в Qt Creator

Имя сервера отладки можно задать OpenOCD + SAM-ICE (рис. 3). «Режим запуска» следует установить в «Запуск в режиме TCP/IP». Так как сервер OpenOCD будет выполняться на рабочей станции, то поле «Хост» должно содержать имя компьютера localhost и порт 3333, указанный ранее в конфигурационном файле openocd.cfg.

В поле «Исполняемый файл» следует вписать имя исполняемого файла openocd (или полный путь к нему, если необходимо). Поле «Файл конфигурации» должно содержать путь к файлу конфигурации OpenOCD, созданному ранее, в данном случае это ~sam/openocd.cfg. Поля «Команды инициализации» и «Команды сброса» по умолчанию имеют в своем составе команды управления сервером, менять их содержимое не требуется.

Далее можно добавить новое устройство, для которого будет производиться сборка и отладка, — микроконтроллер семейства Atmel SAM4S. Для этого в настройках Qt Creator следует выбрать вкладку «Устройства» и нажать «Добавить…». После чего ввести имя устройства, например Atmel SAM, и выбрать настроенный ранее сервер отладки OpenOCD + SAM-ICE.

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

Добавление комплекта для микроконтроллеров Atmel SAM4S в Qt Creator

Рис. 4. Добавление комплекта для микроконтроллеров Atmel SAM4S в Qt Creator

Компилятор GCC и отладчик GDB заданы из состава инструментария GCC для микроконтроллеров ARM так, как описано в [1].

Создание, запуск и отладка примитивной программы на Atmel SAM4S микроконтроллере

Теперь, когда на рабочую станцию установлено и настроено программное обеспечение для разработки под микроконтроллеры Atmel SAM4S, можно убедиться в работоспособности системы, создав простейшую программу, которая будет зажигать и гасить светодиод на плате SAM4S-EK.

Для сборки работоспособной программы для микроконтроллера помимо инструментария GCC необходимы следующие компоненты:

  1. Библиотека CMSIS (Cortex Microcontroller Software Interface Standard) — описывает единый интерфейс взаимодействия с ядром микроконтроллеров ARM Cortex-M, общая для микроконтроллеров ARM Cortex-M различных производителей.
  2. Библиотека для взаимодействия с периферией данного семейства микроконтроллеров — своя для каждого производителя, будь то Atmel, STMicroelectronics, NXP и др.
  3. Скрипт линковщика (linker script) — файл с указаниями о размещении программы во flash-памяти микроконтроллера, а также о размещении в ОЗУ служебных областей (секций): стек, куча и др. Для различных микроконтроллеров с разными объемами памяти используются соответственно различные скрипты линковщика.
  4. Файл syscalls.c — содержит системные функции, необходимые для работы стандартной библиотеки языка C (реализация newlib). Обычно эти функции являются частью операционной системы, для которой предназначена программа. Однако в случае же микроконтроллера, который чаще всего работает без операционной системы, в сборку должен быть включен файл syscalls.c, содержащий в большинстве своем пустые системные функции [10]. Справедливости ради следует отметить, что существует множество операционных систем, разработанных специально для микроконтроллеров.
  5. Код начальной инициализации (startup code) — отвечает за заполнение таблицы векторов прерываний соответствующими обработчиками, в том числе и обработчиком прерывания по сбросу микроконтроллера (reset handler). Также содержит реализацию обработчика прерывания по сбросу, который обнуляет необходимые секции памяти, инициализирует стандартную библиотеку C и передает управление в точку входа программы — в функцию main().

Библиотека Atmel Software Framework

Для создания программ для своих микроконтроллеров фирма Atmel свободно распространяет библиотеку Atmel Software Framework (сокращенно ASF) для языков C/C++, которая содержит все пять компонентов из приведенного выше списка, необходимых для сборки программы.

Библиотека ASF предоставляет высокоуровневый интерфейс, единый для микроконтроллеров различных семейств и архитектур: megaAVR, AVR XMEGA, AVR UC3 и SAM. Библиотека ASF предоставляет примеры работы с различными периферийными блоками микроконтроллеров, а также с внешними устройствами, расположенными на различных оценочных платах.

Такое разнообразие поддерживаемых микроконтроллеров отрицательно сказалось на легкости в освоении библиотеки ASF. Она оказалась очень сложной, запутанной и большой по размеру (архив ~400 Мбайт, содержащий более 70 000 файлов).

Даже несмотря на то, что библиотеку ASF можно загрузить отдельно [8] и она рассчитана на использование в том числе и компилятора GCC, автор не сумел вручную выделить из библиотеки требуемые файлы для создания простейшей программы для микроконтроллера Atmel SAM4S16C.

Автор предлагает такой путь:

  1. Чтобы получить минимальный компилируемый проект, использовать интегрированную среду разработки Atmel Studio IDE, предназначенную для операционных систем Windows и основанную на среде Microsoft Visual Studio 2013.
  2. В дальнейшем вручную добавлять необходимые компоненты в полученный проект, копируя их из отдельно загруженной библиотеки ASF.

Читатели могут не повторять эти рутинные действия и загрузить проект, готовый для сборки в среде Linux, по адресу [11].

Среда Atmel Studio IDE

Среда Atmel Studio IDE поставляется бесплатно, загрузить ее можно с официального сайта [9]. Во время установки на компьютере или виртуальной машине под управлением Windows следует выбрать архитектуру ARM и указать необходимость установить библиотеку ASF (рис. 5).

Особенности установки Atmel Studio IDE

Рис. 5. Особенности установки Atmel Studio IDE

После установки следует запустить Atmel Studio IDE и создать новый проект, выбрав пункт меню File->New->Project… Затем выбрать тип проекта GCC C ASF Board Project, как показано на рис. 6.

Выбор типа проекта в Atmel Studio IDE

Рис. 6. Выбор типа проекта в Atmel Studio IDE

Далее откроется окно выбора аппаратной платформы, для которой будет собран проект (рис. 7).

Выбор микроконтроллера

Рис. 7. Выбор микроконтроллера

Можно ввести название микроконтроллера, но в данном случае проще задать название оценочной платы. Для этого следует выбрать пункт Select by Board и выбрать название SAM4S-EK (рис. 7). В списке ниже следует отметить появившийся пункт с наименованием микроконтроллера ATSAM4S16C и нажать OK.

После того как проект будет создан, файлы исходного кода будут размещены в указанном ранее (рис. 6) каталоге (в случае автора c:Usersandrey_kDocumentsAtmel Studio7.0GccBoardProject1GccBoardProject1src).

Каталог src теперь можно перенести в операционную систему Linux в каталог проекта, например в каталог ~/sam/. Его структура представлена на рис. 8.

Структура простейшего проекта

Рис. 8. Структура простейшего проекта

Внимание следует обратить на расположение:

  • Скрипт линковщика — это файл ~/sam/src/ASF/sam/utils/linker_scripts/sam4s/sam4s16/gcc/flash.ld.
  • Код начальной инициализации и таблица векторов прерываний находятся в файле ~/sam/src/ASF/sam/utils/cmsis/sam4s/source/templates/gcc/startup_sam4s.c.
  • Файл syscalls.c находится в каталоге ~/sam/src/ASF/sam/utils/syscalls/gcc.

Добавление модуля из библиотеки ASF

На данный момент в проекте отсутствует компонент delay.h, необходимый для получения задержек на точно заданное время (это понадобится для мигания светодиодом). Далее показано, как по мере роста проекта добавлять нужные компоненты из библиотеки ASF, — на примере компонента delay.h. Чтобы его добавить, надо скопировать из отдельно загруженного архива библиотеки ASF [8] файл common/services/delay/delay.h и каталог со всеми файлами common/services/delay/sam/ в каталог проекта ~/sam/src/ASF/common/services/delay.

Кроме этого, следует включить компонент delay.h в сборку, добавив в конце файла ~/sam/src/asf.h строку:

#include <delay.h>

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

Код простейшей программы

Листинг файла main.c приведен ниже:

#include <asf.h>
int main (void) {
board_init();
sysclk_init();
while (1) {
LED_On(LED1_GPIO);
delay_ms(500);
LED_Off(LED1_GPIO);
delay_ms(500);
}
return 0;
}

Функция board_init() инициализирует порты ввода/вывода (GPIO) микроконтроллера в соответствии с подключенными к ним внешними электронными компонентами, в том числе настраивает порты ввода/вывода как выходы для включения/выключения расположенных на плате светодиодов. Функция board_init() находится в файле src/ASF/sam/borads/sam4s_ek/init.c.

Предоставлена возможность выбирать, какие порты будут проинициализированы, а какие нет, — с помощью макроопределений в файле src/config/conf_borad.h.

Функция sysclk_init() отвечает за инициализацию блока тактирования микроконтроллера. После сброса включается встроенный RC-генератор на 4 МГц [12]. Функция sysclk_init() активирует генератор, работающий от внешнего кварцевого резонатора на 12 МГц, а также настраивает блок фазовой автоподстройки частоты PLL, чтобы частота тактирования ядра микроконтроллера составляла 120 МГц.

Изменить настройки тактирования можно, меняя значения макроопределений в файле src/config/conf_clock.h.

Далее в бесконечном цикле последовательно вызываются функции включения и выключения светодиодов оценочной платы: LED_On() и LED_Off(). В качестве аргумента передается макроопределение LED1_GPIO, что соответствует зеленому светодиоду, подключенному к порту PA20. Функции LED_On(), LED_Off() и макроопределение LED1_GPIO определены в исходных файлах в каталоге src/ASF/sam/borads/sam4s_ek/, который содержит помимо прочего описание подключения светодиодов к выводам микроконтроллера.

Вызов функции delay_ms(500), входящей в добавленный ранее модуль delay.h, приводит к задержке выполнения на 0,5 с. Задержка реализована пустыми циклами микроконтроллера, причем нет необходимости заботиться об учете частоты тактирования микроконтроллера — текущая частота учитывается внутри библиотеки ASF после вызова функции sysclk_init().

Сборка с помощью системы автоматизации QBS

Для того чтобы получить исполняемый файл прошивки, нужно провести компиляцию довольно большого количества файлов. Фирма Atmel предлагает пользоваться файлами makefile, которые представляют собой инструкции для компилятора GCC.

Автор же предлагает воспользоваться встроенной в Qt Creator средой автоматизации сборки QBS [1]. Для этого придется создать QBS-файл проекта, содержащий сведения об исходных файлах, подлежащих компиляции.

Одним из преимуществ QBS является то, что нет необходимости вручную вносить название каждого файла с исходным кодом в QBS-файл — достаточно указать каталоги размещения файлов, остальное система сделает сама.

Текст QBS-файла приведен ниже:

import qbs

import qbs.FileInfo
import qbs.ModUtils
Project {
CppApplication {
type: [“application”, “ucfw” ]
Depends { name: “cpp” }
consoleApplication: true
cpp.positionIndependentCode: false
cpp.executableSuffix: “.elf”
cpp.includePaths: [
“src”,
“src/ASF/common/boards”,
“src/ASF/common/services/clock”,
“src/ASF/common/services/clock/sam4s”,
“src/ASF/common/services/gpio”,
“src/ASF/common/services/gpio/sam_gpio”,
“src/ASF/common/services/ioport”,
“src/ASF/common/services/ioport/sam”,
“src/ASF/common/services/delay”,
“src/ASF/common/services/delay/sam”,
“src/ASF/common/utils”,
“src/ASF/common/utils/interrupt”,
“src/ASF/sam/boards”,
“src/ASF/sam/boards/sam4s_ek”,
“src/ASF/sam/drivers/pio”,
“src/ASF/sam/drivers/pmc”,
“src/ASF/sam/utils”,
“src/ASF/sam/utils/cmsis/sam4s/include”,
“src/ASF/sam/utils/cmsis/sam4s/include/component”,
“src/ASF/sam/utils/cmsis/sam4s/include/instance”,
“src/ASF/sam/utils/cmsis/sam4s/include/pio”,
“src/ASF/sam/utils/header_files”,
“src/ASF/sam/utils/preprocessor”,
“src/ASF/thirdparty/CMSIS/Include”,
“src/config”
]
cpp.defines: [
“__SAM4SA16C__”,
“BOARD = SAM4S_EK”
]
cpp.commonCompilerFlags: [
“-mcpu=cortex-m4”,
“-mthumb”,
“-mfloat-abi=soft”
]
cpp.linkerFlags: [
“-mcpu=cortex-m4”,
“-mthumb”,
“-mfloat-abi=soft”,
“-Xlinker”,
“—gc-sections”
]
// Оптимизация — только не для отладки.
Properties {
condition: qbs.buildVariant === “debug”
cpp.debugInformation: true
cpp.optimization: “none”
}
Properties {
condition: qbs.buildVariant === “release”
cpp.debugInformation: false
cpp.optimization: “small”
}
// Добавляет макроопределение DEBUG, если сборка “Отладка”.
Properties {
condition: cpp.debugInformation
cpp.defines: outer.concat(“DEBUG”)
}
// Использовать скрипт линковщика
cpp.linkerScripts: [
“src/ASF/sam/utils/linker_scripts/sam4s/sam4s16/gcc/flash.ld”
]
// Группируем файлы с исходным кодом в группу “sources”
Group {
name: “sources”
prefix: “./src/**/”
files: [
“*.c”,
“*.cpp”,
“*.h”,
“*.s”
]
cpp.cxxFlags: [ “-std=c++11” ]
cpp.cFlags: [ “-std=gnu99” ]
cpp.warningLevel: “all”
}
// Группируем скрипты линковщика в группу “ldscripts”
Group {
name: “ldscripts”
prefix: “./src/**/”
files: “*.ld”
}
// В группу “others” попадет файл конфигурации OpenOCD
Group {
name: “others”
prefix: “./**/”
files: [
“*.cfg”
]
}
// Автоматически после успешной сборки:
// 1. Получение размера прошивки с помощью утилиты size из состава инструментария GCC
// 2. Создание копии прошивки в популярном формате Intel HEX
// 3. “Прошивка” в микроконтроллер с помощью программы OpenOCD
Rule {
id: flashing
// Отключить правило для сборки “Отладка”
condition: qbs.buildVariant === “release”
inputs: [“application”]
Artifact {
fileTags: [“ucfw”] // !!!Обязательно должен совпадать с полем type итема CppApplication!!!
filePath: input.baseDir + “/” + input.baseName + “.hex”
}
prepare: {
// Вывести размер
var sizePath = “arm-none-eabi-size”;
var argsSize = [input.filePath];
var cmdSize = new Command(sizePath, argsSize);
cmdSize.description = “Size of sections:”;
cmdSize.highlight = “linker”;
// Создать копию в формате Intel HEX
var objCopyPath = “arm-none-eabi-objcopy”;
var argsConv = [“-O”, “ihex”, input.filePath, output.filePath];
var cmdConv = new Command(objCopyPath, argsConv);
cmdConv.description = “converting to HEX: “ + FileInfo.
fileName(input.filePath);
cmdConv.highlight = “linker”;
// Непосредственно прошивка
var flashUtilityPath = “openocd”;
var cmd1 = ‘flash write_image erase’ + ‘ ‘ + input.filePath;
var argsFlash = [
“-f”, “interface/jlink.cfg”,
“-f”, “board/atmel_sam4s_ek.cfg”,
“-c”, “init”,
“-c”, “halt”,
“-c”, cmd1,
“-c”, “reset”,
“-c”, “shutdown”];
var cmdFlash = new Command(flashUtilityPath, argsFlash);
cmdFlash.description = “flashig to uC: “ + FileInfo.
fileName(output.filePath);
cmdFlash.highlight = “linker”;
// Выполнить последовательно все 3 действия
return [cmdSize, cmdConv, cmdFlash];
}
}
}
}

В случае успешной release сборки QBS-файл содержит предписания выполнить следующие действия:

  • Вывести в консоль сборки размер прошивки.
  • Конвертировать файл прошивки из формата ELF в формат Intel HEX.
  • Загрузить файл в целевой микроконтроллер через адаптер SAM-ICE, используя программу OpenOCD.

Заключение

В результате вышеприведенных действий создана экосистема для разработки под микроконтроллеры Atmel SAM4S, полностью состоящая из свободно распространяемых программ. Экосистему несложно модифицировать для использования другого ARM-микроконтроллера фирмы Atmel.

Загрузить готовый проект можно по адресу [11]. Для его использования понадобится операционная система Ubuntu или производная от нее (Lubuntu, Kubuntu, Xubuntu) с установленными пакетами:

  • инструментарий GCC для ARM-микроконтроллеров [1];
  • среда разработки Qt Creator [1];
  • программа OpenOCD (установка описана выше).

Литература

  1. Курниц А. Разработка для микроконтроллеров STM32 в среде операционной системы Linux // Компоненты и технологии. 2015. № 10.
  2. www.sourceforge.net/projects/openocd
  3. www.we.easyelectronics.ru/CADSoft/ubuntu-eclipse-code-sourcery-openocd-j-link-arm-ili-bystryy-start-dlya-somnevayuschihsya.html
  4. www.microsin.net/programming/arm/openocd-manual-part1.html
  5. www.microsin.net/programming/ARM/openocd-manual-part2.html
  6. www.microsin.net/programming/ARM/openocd-manual-part3.html
  7. www.openocd.org/doc/html/General-Commands.html
  8. http://asf.atmel.com/docs/latest/download.html
  9. www.atmel.com/tools/ATMELSTUDIO.aspx
  10. www.sourceware.org/newlib/libc.html#Syscalls
  11. www.kit-e.ru/files/sam.zip
  12. www.atmel.com/images/atmel-11100-32-bit%20cortex-m4-microcontroller-sam4s_datasheet.pdf

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

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