Мы уже рассказывали о том, как начать работу в Intel System Studio for Microcontrollers 2015 (ISSM) и создавать программы для Intel Quark D1000. Сегодня поговорим о том, как модифицировать в IDE Eclipse простую прошивку из примеров к ISSM. Так же рассмотрим работу с эталонной платой для проведения технических испытаний D1000 (Customer Reference Board, CRB). А именно, пользуясь JTAG-подключением, задействуем OpenOCD для того, чтобы прошить созданный нами образ в микроконтроллер и отладить код.


Среда разработки для Intel Quark D1000


Intel System Studio for Microcontrollers включает в себя C/C++ компилятор, основанный на LLVM (в его состав входят ассемблер, компоновщик и библиотеки времени выполнения C/C++), GDB-отладчик и внутрисхемный отладчик OpenOCD. ISSM можно использовать как самостоятельный набор инструментальных средств, но в нём есть и плагины для интеграции с IDE Eclipse.

Открываем проект прошивки в ISSM


Прежде чем создавать проект для Intel Quark D1000, нужно установить необходимое программное обеспечение. А именно: IDE Eclipse для C/C++ разработчиков, ISSM, Putty и Zadig. Инсталлируя программы, старайтесь внимательно следовать руководствам, которые можно найти в директории установки ISSM, в папке «docs». Здесь мы так же предполагаем, что вы разобрались с примерами «Hello World» и «FW» для IDE Eclipse. Если это не так, пожалуйста обратитесь к разделу руководства пользователя «Using the Eclipse IDE». Его тоже можно найти в вышеупомянутой папке «docs».
После того, как всё будет готово к работе, запустите Eclipse, воспользовавшись командным файлом «runEclipse.bat», указав в качестве аргумента ту папку, в которую установлена Eclipse. Затем откройте проект прошивки, в нашем случае это «FW-D1000», и выполните его сборку. Ошибок быть не должно.

После того, как прошивку удалось успешно собрать, найдите файл «FW-D1000.elf», который находится в папке проекта «Binaries». Его содержимое будет таким же, как на рисунке ниже. Если вам не удаётся увидеть разделы образа с информацией о символах, нужно проверить, установлена ли на компьютере утилита «objdump». Если она действительно не установлена, обратитесь к разделу «Viewing GNU Elf and Map Files» руководства пользователя для того, чтобы установить «objdump» и настроить путь к ней на компьютере.


Дамп объекта в файле FW-D1000.elf

Передача данных из обработчика аппаратного прерывания


После того, как стало ясно, что пример «FW-D1000» нормально компилируется, его можно изменить под собственные нужды. Здесь мы собираемся поменять строку, которую выводит в окно терминала программа «PushButton» из примера «FW-D1000».

Перейдите в папку «Applicaition» проекта «FW-D1000». В ней имеется 10 приложений-примеров для Intel Quark D1000. Просмотрите файл «AppConfig.h» для того, чтобы выяснить, какое именно приложение будет интегрировано в проект, и, при необходимости, измените файл так, чтобы этим приложением было «PUSH_BUTTON_TEST». Вот как выглядит файл, в котором включена интеграция в готовый проект того, что нам нужно.

//#define MAN_DECODING
//#define POWER_MANAGEMENT_TEST
#define PUSH_BUTTON_TEST
//#define ADC2SPI_TEST
//#define ADC2GPIO_TEST
//#define DDS_TEST
//#define OSCILLATOR_RE_TRIM
//#define PWM_TESTING
//#define MOTOR_CTRL
//#define UART_WAKE

Теперь перейдите в начальный файл приложения, «PushButton.c», который находится в папке «Applications», и слегка отредактируйте код. В результате, когда программа запустится устройстве, вы точно поймёте, что исполняется именно её изменённый вариант. Здесь мы подправили строку «rts_interrupt_msg». Эта строка будет выводиться каждую секунду по прерыванию часов реального времени (Real Time Clocl, RTC).

////////////////////////////////////////////////////////////////////////////////
// это функция обратного вызова для прерывания часов реального времени
////////////////////////////////////////////////////////////////////////////////
char rtc_interrupt_msg[] = "\r\nSean RTC interrupt!";
void rtc_callback_function_PB(void)
{
 PUSH_UART(rtc_interrupt_msg,sizeof(rtc_interrupt_msg),0,0);
 rtc_callback(rtc_callback_function_PB); // повторно регистрируем функцию обратного вызова
}

Изменив файл, сохраните его. Теперь всё готов к компиляции и прошивке образа на устройство.

Компиляция и прошивка образа на D1000


Для того, чтобы прошить скомпилированный образ на D1000, нужно установить JTAG-соединение с платой. В подробностях это описано в разделе руководства пользователя «Starting Debugging Session». Прежде чем открыть перспективу OpenOCD в Eclipse, проверьте, удалось ли OpenOCD успешно прочитать код «IdCode» целевого CPU, совпадает ли он с ожидаемым («Expected») кодом процессора.

В этом примере мы подключились по JTAG к D1000 и установили OpenOCD-соединение до запуска Eclipse. Иногда Eclipse не может прочитать «IdCode» и показывает вместо кода нули. Если это произошло, нажмите кнопку перезагрузки и посмотрите, удалось ли OpenOCD верно определить «IdCode». После того, как всё определилось, и вы дождались появления сообщений, вроде тех, что приведены на рисунке ниже, можно прошивать изменённый образ на D1000.


Консоль OpenOCD при подключении к эталонной плате D1000

После того, как удалось установить JTAG-соединение с платой D1000, соберите проект «FW-D1000» в IDE Eclipse. Если в ходе сборки ошибок не обнаружится, в папке «Binaries» появится файл образа «FW-D1000.elf». Его можно будет прошить на устройство, воспользовавшись отладочной перспективой «Debug» в Eclipse, которая настроена на использование GDB через OpenOCD.


Настройка отладчика для работы с эталонной платой D1000 с использованием OpenOCD

После прошивки образа появится сообщение об успешном завершении операции в консоли OpenOCD (взгляните на рисунок с консолью выше). В данном примере нужно, чтобы отладчик остановил процесс в функции «main» для пошагового исполнения.

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


Задаём точку останова в функции «main»

Теперь откроем консоль последовательного порта с помощью Putty. Нужно это для того, чтобы видеть UART-сообщения, которые будут выводиться, когда программа отправляет заданное сообщение по аппаратному событию прерывания часов реального времени (RTC) или при нажатии на кнопку (ButtonPress).

При подключении к плате D1000 в нашем распоряжении будут два USB-устройства. А именно, одно – это Dual RS232 HS, которое используется для JTAG-соединения OpenOCD, а второе – это USB-интерфейс к последовательному порту. Перед запуском приложения «PushButton» нужно открыть подключение к последовательному порту, используя клиент Putty со следующими настройками: Baudrate-19200, Flow Control-XON/XOFF.

Отладка: пошаговое исполнение кода


Когда завершится прошивка образа, начнётся отладка кода, с самого начала функции «main», как показано на рисунке ниже. В этом примере программа «PushButton» запускается, а затем отладчик ожидает вызова функции «PushButton», главной функции приложения. Тут же можно просматривать код, написанный на языке высокого уровня, а так же – машинные команды в окне «Disassembly», в котором подсвечивается инструкция текущего указателя команд.

Теперь можно приступать к отладке, выполнять шаги с обходом процедур (step over), шаги с заходом в процедуры (step into), возобновлять (resume) исполнение программы.


Отладчик остановил процессор в начале функции «main»

Здесь мы выполняем шаг с заходом в процедуру, затем видим исходный код входной функции «PushButton», отладчик открывает «PushButton.c» для того, чтобы указать на следующую исполняемую функцию.


Шаг с заходом в процедуру, выполненный из «main»

Запуск примера на D1000


В итоге, мы можем возобновить исполнение программы, она будет работать в обычном режиме. Если теперь взглянуть на окно терминала Putty, можно увидеть журнал сообщений от D1000. Сообщения, содержащие именно ту строку, которую мы выше модифицировали в коде примера, выводятся по прерываниям часов реального времени.


Тестовый вывод программы, выполняемой на D1000

Об аппаратном обеспечении


Эталонная плата для проведения технических испытаний (CRB V2) содержит следующие компоненты:

  • Микроконтроллер Intel Quark D1000.
  • Акселерометр.
  • Флэш-память SPI.
  • Адаптер Bluetooth LE.
  • Модуль последовательного порта для WiFi.
  • Конвертер последовательного порта для USB и JTAG.
  • Модуль электропитания.
  • Цепь зарядки батареи.

Микроконтроллер Intel Quark D1000


У контроллера имеется 24 вывода GPIO, многие из которых многофункциональны (подробности о них смотрите в таблице). CRB V2 обеспечивает подключение этих выводов к контактным площадкам монтажной платы, которая очень напоминает Arduino, но не полностью совместима с этим стандартом. Стоит отметить, что несколько выводов, кроме того, подключены к периферийным устройствам, размещённым на плате. В некоторых случаях их нельзя использовать в роли многофункциональных выводов. Они отмечены в таблице и в описании аппаратных компонентов платы, которое приведено ниже. А именно, при описании выводов приведены их названия для микроконтроллера D1000, для Arduino и для платы CRB V2. Обратите внимание на то, что интерфейс SPI применяется для связи со всеми встроенными в плату периферийными устройствами с использованием следующих контактов:

  • MST_M2SC (выход сигнала синхронизации передачи данных SPI, Arduino — D13, CRB v2 – XPB5).
  • MST_M2SD (выход последовательной передачи данных (MOSI) SPI, Arduino – D11, CRB v2 – XPB3).
  • MST_S2MD (вход последовательного приёма данных (MISO) SPI, Arduino – D12, CRB v2 – XPB4).

Подключение выводов Intel Quark D1000 к CRB v2


Плата CRB V2, кроме того, включает в себя некоторые другие компоненты, поведением которых нельзя управлять с помощью микроконтроллера D1000.

  • FTDI FT2232H – микросхема конвертера последовательного порта для USB и JTAG. Она используется для обеспечения консольного (UART) подключения к D1000, для программирования и отладки с использованием интерфейса JTAG. Светодиоды D6 (жёлтый) и D7 (зелёный) подключены к FTDI FT2232H, они мигают, когда устройство принимает или отправляет данные.

  • Контроллеры Linear Technologies LTC4414, Texas Instruments BQ24080, Maxim Integrated MAX8869 применяются для организации электропитания и зарядки батареи. Светодиоды D10 и D11 подключены к BQ24080 и служат для индикации состояния заряда батареи.


Схема платы Intel Quark D1000 CRB v2

Выводы


Теперь вы знаете, как работать с прошивками для Intel Quark D1000 в IDE Eclipse. Вы умеете их редактировать, записывать на устройство, тестировать и отлаживать код. Так же мы рассказали об эталонной плате для проведения технических испытаний (CRB V2), которая, помимо Quark D1000, включает в себя набор дополнительных компонентов. Здесь и здесь вы можете найти подробности об Intel Quark D1000, а вот тут – об ISSM.
Поделиться с друзьями
-->

Комментарии (8)


  1. Daffodil
    13.05.2016 19:55

    Непонятно кому адресован этот перевод, не вижу этот микроконтроллер в продаже в России. STM32 продается везде, а quark d1000 нет ни у кого http://efind.ru/icsearch/?search=quark+d1000


    1. SvetlanaGEm
      13.05.2016 23:46

      Можно купить у Mouser и Arrow http://www.intel.ru/content/www/ru/ru/embedded/products/quark/sample-and-buy-page.html


      1. olartamonov
        14.05.2016 11:02

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

        И это даже если не трогать вопроса об общем унынии D1000 — это простенький и дешёвенький микроконтроллер с крайне ограниченным набором периферии, единственным серьёзным отличием которого от конкурентов является то, что конкурентов используют все, а D1000 — никто.


  1. x893
    13.05.2016 21:13

    Видимо для отчетности надо написать что-нибудь.
    Про Keil что-то не видно писателей.


  1. GarryC
    16.05.2016 15:25

    Меня особенно порадовало представление данного камня как низкопотребляющего — лет десять назад это еще было бы правдоподобно, но в 2016 иметь такие параметры потребления — это просто неприлично.


  1. den1s1
    16.05.2016 21:33

    В прошлом году на одной из конференций про IoT видел выступление представителч Интел (русский парень), который в том числе презентовал эти кварки. Я задал вопрос, всерьез ли Интел планирует войти на рынке микроконтроллеров. Ответ был, что скорее не войти, а вернуться. Я не большой знаток истории электроники, но не уверен, что Интел на этом рынке вообще присутствовал.

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


    1. olartamonov
      17.05.2016 10:35
      -1

      Ядро Intel 8051 до сих пор в дешёвых микроконтроллерах используется на каждом шагу (хотя лично я эту стюардессу уже давно закопал бы — и категорически рад, что в областях, которыми мы занимаемся, наконец начали доминировать Cortex-M).

      Но D1000 действительно… странный. Кто-то из Intel может объяснить, почему в нём нет ШИМ? «Мы провели исследование и выяснили, что ШИМ не нужен»?

      И почему он стоит таких конских денег? 36 КБ флэша, 8 КБ ОЗУ, жиденькая периферия — и больше $1 оптом? Да что там, больше $5 оптом? А за что и зачем?


      1. GarryC
        17.05.2016 12:10

        Потому, что это Intel? Ну так они себя ценят.