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

    Представляем электронную версию статьи из номера №2 за 2016 год журнала Компоненты и технологии. Автор Курниц Андрей.

    В статье описан процесс развертывания экосистемы разработки приложений для микроконтроллеров 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 фирмы ST microelectronics с применением такого же комплекта инструментов.
    Несколько слов об используемой терминологии. Аппаратное устройство, которое подключается к целевому микроконтроллеру и к рабочей станции, далее называется отладочным адаптером. Отладчиком же будет называться компьютерная программа, служащая для пошагового выполнения программы, просмотра значений ячеек памяти и т.д.

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



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

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

    Среди особенностей оценочной платы SAM4S-EK можно выделить следующие:
    1. Микросхема NAND flash-памяти Micron MT29F2G08ABAEA объемом 2 Гбит
    2. Цветной дисплейный модуль FTM280C34D разрешением 320x240 точек, с диагональю 2,8 дюйма и с резистивной сенсорной панелью. Дисплей содержит встроенный контроллер Ilitek ILI9320, подключенный к микроконтроллеру по параллельному интерфейсу.
    3. Контроллер резистивной сенсорной панели Texas Instruments ADS7843E
    4. Распаяны два DB9 разъема для двух портов RS-232 (один из них — с сигналами RTS, CTS), выведен также интерфейс RS-485
    5. Элементы сенсорного управления по технологии Atmel QTouch, расположены прямо на печатной плате (сенсорные кнопки 5 шт. и слайдер)
    6. Электретный микрофон и операционный усилитель TS922 для него
    7. Усилитель звуковой частоты для подключения наушников TPA022, а также 3,5мм гнездо типа «джек».
    8. Два коаксиальных BNC разъема, которые подключены к встроенным АЦП и ЦАП блокам микроконтроллера.
    9. Держатель micro-SD карты памяти
    10. 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 [4-6], которая помимо отладки может использоваться для загрузки прошивки во 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 будет возможен только с правами суперпользователя, что в дальнейшем создаст проблемы с отладкой из среды QtCreator.

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

    Рис. 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.

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

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

    Продолжение статьи будет оформлено в виде отдельной публикации, чтобы не раздувать объем.

    Литература


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

    Комментарии 15

      0
      Толстолапые какие)))
        0
        Связка Qt Creator + GCC + OpenOCD прекрасно работает под Windows. И не нужно использовать никакие виртуальные машины
          0
          Автор упомянул автоматизацию прошивки в продакшене. Это явно лучше делать на Linux. Работать в Linux во многих аспектах в разы комфортнее.
          0
          Интересно, как повлияет на поставки ARM чипов от Atmel недавняя новость о продаже Atmel Microchip?
          Мы много чего на них делаем, вопрос острый.
            +1
            никак. армы — растущий бизнес у Атмела. Никто его не будить рубить. Да и у Майкрочипа нет армов, а в современных реалиях это серьезный недостаток.
              +1
              у микрочипа MIPS есть
              0
              Эх, прощайте AVRки, извечный конкурент 8-битных ПИКов…
                +1
                а вот это точно нет — AVR огромный бизнес. Зачем убивать легкие деньги. Производи чипы и грузи их, всё что требуется от Майкрочипа.
                  0
                  Такое встречается довольно часто, когда на рынке есть несколько конкурирующих продуктов, но на самом деле они принадлежат одному концерну. Яркий пример VW AG, продает автомобили под брендами VW, Audi, Porsche, SEAT и т.д. Или например электроинструменты AEG, Ryobi и Milwaukee, как бы конкуренты, но все принадлежат одной Techtronic Industries.
                    +1
                    ну тут несколько иначе: бренд Атмел умрет, как, например, стало с Dallas. Но их продукты останутся.
                0
                Подскажите, связка jlink+openOCD может работать по интерфейсу SWD? или только классический JTAG?
                  0

                  Для nrf51 точно работает, т.к. там без вариантов. Например:


                  source [find interface/jlink.cfg]
                  transport select hla_swd
                  set WORKAREASIZE 0x4000
                  source [find target/nrf51.cfg]
                  +2
                  Советую автору не пользоваться «make install» так как потом могут возникнуть проблемы с удалением этой программы. Лучше создавать свой пакет используя:
                  ./configure
                  make
                  sudo checkinstall
                  
                  а потом уже устанавливать его.

                  А также что бы не вводить каждый раз длинную команду при программировании или старинии памяти — можно воспользоваться утилитой make. Ниже я привожу фрагмент из makefile для STM32F4.
                  фрагмент из makefile для STM32F4
                  FLASHER = openocd
                  
                  OPENOCD_PARAMS = -c "source [find interface/stlink-v2.cfg]"
                  OPENOCD_PARAMS += -c "transport select hla_swd"
                  OPENOCD_PARAMS += -c "source [find target/stm32f4x.cfg]"
                  
                  OPENOCD_PARAMS_LOAD = $(OPENOCD_PARAMS)
                  OPENOCD_PARAMS_LOAD += -c "program $(ELF)"
                  OPENOCD_PARAMS_LOAD += -c "verify_image $(ELF)"
                  OPENOCD_PARAMS_LOAD += -c "reset run"
                  OPENOCD_PARAMS_LOAD += -c "exit"
                  
                  OPENOCD_PARAMS_RESET = $(OPENOCD_PARAMS)
                  OPENOCD_PARAMS_RESET += -c "reset run"
                  OPENOCD_PARAMS_RESET += -c "shutdown"
                  OPENOCD_PARAMS_RESET += -c "exit"
                  
                  OPENOCD_PARAMS_DEBUG = $(OPENOCD_PARAMS)
                  OPENOCD_PARAMS_DEBUG += -c "gdb_port 3333"
                  OPENOCD_PARAMS_DEBUG += -c "debug_level 2"
                  OPENOCD_PARAMS_DEBUG += -c "set WORKAREASIZE 0x2000"
                  OPENOCD_PARAMS_DEBUG += -c "reset_config srst_only"
                  
                  .PHONY: program reset debug
                  
                  
                  program:
                  	@echo - programming with $(FLASHER)...
                  ifeq ($(FLASHER),openocd)
                  	$(FLASHER) $(OPENOCD_PARAMS_LOAD)
                  endif
                  
                  reset:
                  	@echo - resetting device...
                  ifeq ($(FLASHER),openocd)
                  	$(FLASHER) $(OPENOCD_PARAMS_RESET)
                  endif
                  
                  debug:
                  	@echo - openocd server is running...
                  	$(FLASHER) $(OPENOCD_PARAMS_DEBUG)
                  


                  После чего досточно просто вводить в командную строку: «make program» или «make debug» или что вы сами захотите.
                    0
                    спасибо
                    0

                    deleted

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

                    Самое читаемое