Запускаем Программу, Созданную В Nxp Mcuxpresso, На Плате Teensy 4.1.

Некоторое время назад по необходимости проекта у меня появилась возможность поиграться с отладочной платой Teensy 4.1. Что это за зверь - можно посмотреть на сайте разработчика.

Teensy 4.1 (pjrc.com) .

В общем, это замечательная вещь.

Имеется контроллер MIMXRT1062DVJ6A от NXP. Ядро – Кортекс М7. Тактовая частота – до 600 МГц! Впечатляющий? Но самое главное — есть два контроллера EHCI, реализующие порты USB 2.0 HS. На этой плате один контроллер подключен к разъему Micro USB, а второй к разъему USB Host. Еще есть порт Ethernet, но я с ним пока не возился.

Ну и много других замечательных вещей.



Запускаем программу, созданную в NXP MCUXpresso, на плате Teensy 4.1.

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

Само по себе оно работает. Программист приложений будет рад его использовать.

Но его завершение — это все еще процесс.

Плюс ко всему, его по сути делает один разработчик, а не огромное сообщество (как, например, ESP8266 или ESP32).

Поэтому функционал небогат, и самостоятельная модификация затруднена.

Но мой неугомонный начальник задал простой и естественный вопрос: «Что вам мешает использовать стандартную среду разработки от NXP — MCUXpressoЭ» Дело в том, что существует огромный набор готовых библиотек для нужного нам контроллера.

Лично я уже работал с этой средой для нашего сервиса All-Hardware. Впечатления остались самые приятные, поделился ими здесь.

Эта статья .

Попробовав, я понял, что он, как всегда, прав.

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

Итак, давайте начнем.

Сегодня мы просто возьмем готовый пример от MCUXpresso, запустим его в Teensy и убедимся, что все работает.



Важная заметка

Не хотел перегружать анонсом статьи, но пожалуй напишу это в самом начале.

Обычно, поигравшись с тем или иным контроллером или ПЛИС, я покупаю себе хотя бы одну вещь для домашнего использования.

В случае с Teensy за последние полгода я предпочитаю удовлетворять свои проценты за счет работодателя.

Цена макетки для таких характеристик очень и очень вкусная, но порт отладки на этой макетке отсутствует напрочь.

Здесь нет ни JTAG, ни SWD, ни чего-то подобного.

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

В следующей статье мы рассмотрим полумеры.

Поработаем с отладчиком GDB через порт UART. Но все это особые разновидности извращений.

И из моих статей видно, что я большой поклонник JTAG (а еще лучше SWD) отладки.

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



Какое программное обеспечение мне следует установить?

Сегодня я буду ссылаться на установленную среду разработки Teensyduino. Его можно скачать здесь: Teensyduino: загрузите и установите поддержку Teensy в Arduino IDE (pjrc.com) .

Но вместо этого вы можете просто использовать проект Teensy Loader. В тексте он упоминаться не будет, но прочитать о нем и скачать можно здесь: Приложение Teensy Loader — доступно для систем Windows, Linux и Macintosh (pjrc.com) .

Что ж, тогда вам нужно скачать и установить среду разработки MCUXpresso от NXP, а в ней установить SDK и примеры для семейства MIMXRT1060.

Давайте начнем

Так.

Сегодня мы возьмем готовый пример виртуального COM-порта, соответствующего стандарту CDC, и попробуем запустить его на плате Teensy. Запустите среду разработки MCUXpresso, выберите там «Импортировать примеры из SDK»:

Запускаем программу, созданную в NXP MCUXpresso, на плате Teensy 4.1.

Откройте в дереве ветку MXMXRT1060, выберите контроллер MXMXRT1062xxxxA (других там все равно нет), а затем выберите плату.

Доска, но не ее название.

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



Запускаем программу, созданную в NXP MCUXpresso, на плате Teensy 4.1.

Что ж, теперь вы можете нажать кнопку «Далее»:

Запускаем программу, созданную в NXP MCUXpresso, на плате Teensy 4.1.

Открылось огромное дерево возможных примеров.

Мои глаза широко открыты! Ведь этот бизнес поддерживает огромная корпорация! Для сегодняшнего опыта откройте ветку USB и выберите там dev_cdc_vcom_bm. Да, я не люблю использовать никакую ОС на Кортексе-М.

Поэтому наши эксперименты мы будем проводить с BareMetal. И тогда вы сможете выбрать то, что хотите.



Запускаем программу, созданную в NXP MCUXpresso, на плате Teensy 4.1.

Ну а дальше, как всегда.

Теперь перед нами открывается окно, где мы выберем, с каким портом будут работать функции printf/scanf. Нет, мы можем сделать это и без ничего, но лучше, если у нас будет хоть какой-то отладочный вывод. На самом деле, у нас нет особого выбора.

Плата Teensy 4.1 не имеет разъемов для аппаратного отладчика.

Поэтому только UART. О возможных библиотеках вы можете прочитать в разделе 16 описания MCUXpresso. Руководство пользователя MCUXpresso IDE (nxp.com) .

Скажу лишь, что Redlib не поддерживает язык C++, поэтому мы к нему даже не привыкаем.

Из Newlib и Newlib-Nano вообще второй лучше, так как более компактный.

Суффикс должен быть NoHost. Что это такое, вы можете узнать в описании среды разработки.



Запускаем программу, созданную в NXP MCUXpresso, на плате Teensy 4.1.

После этого специальные функции уже будут работать.

Но по какой-то причине мне также понравилось проверять флажки «Перенаправить SDK «PRINTF» в библиотеку C printf» и «Перенаправить printf/scanf на UART».

Мы не будем использовать это сегодня, но потом я потанцую с сегодняшним проектом.

Общий:

Запускаем программу, созданную в NXP MCUXpresso, на плате Teensy 4.1.

Внизу того же окна находится карта памяти, не похожая на ту, что мы можем найти в настройках Teensy:

Запускаем программу, созданную в NXP MCUXpresso, на плате Teensy 4.1.

Почему не соответствует и как это можно исправить я опишу в одной из следующих статей.

Пока оставляем по умолчанию.

Нажмите «Готово».

Вот как выглядит дерево проекта:

Запускаем программу, созданную в NXP MCUXpresso, на плате Teensy 4.1.

Корпус контроллера не наш.

Давайте сразу поменяем.

На ветке MCU нажимаем правую кнопку мыши и в меню выбираем наш контроллер:

Запускаем программу, созданную в NXP MCUXpresso, на плате Teensy 4.1.

Большой! Проект готов.

Давайте соберем его.

Получен файл \NXPworkspace\evkmimxrt1060_dev_cdc_vcom_bm\Debug\evkmimxrt1060_dev_cdc_vcom_bm.axf Теперь его нужно подготовить к заливке в Тинси.

Для этого вам придется позаимствовать пару утилит из пакета TeensyDuino. Откройте среду разработки Arduino и выберите пункт меню Файл-> Настройки:

Запускаем программу, созданную в NXP MCUXpresso, на плате Teensy 4.1.

Там ставим галочки: Показать подробный вывод: Компиляция и загрузка.



Запускаем программу, созданную в NXP MCUXpresso, на плате Teensy 4.1.

Откройте любой пример и соберите его.

Нас будет интересовать окончание процесса:

Запускаем программу, созданную в NXP MCUXpresso, на плате Teensy 4.1.

Вот крупный план выделенной строки: "C:\\Program Files (x86)\\Arduino\\hardware\\teensy/.

/tools/teensy_post_compile" - file=CardInfo.ino "-path=C:\\Users\\User\\AppData\\Local\\Temp\\arduino_build_253223" "-tools=C:\\Program Files (x86)\\Arduino\\hardware\ \teensy/.

/tools/" -board=TEENSY41 Это значит, что интересующие нас утилиты находятся здесь:

Запускаем программу, созданную в NXP MCUXpresso, на плате Teensy 4.1.

Более того, нас не интересуют достаточно увесистые вложенные каталоги.

В общем, отсюда нас интересуют только два файла, но я предлагаю скопировать их все.

Я специально показал способ поиска, а не точное местоположение, так как подозреваю, что и в Linux всё можно найти именно так.

Я скопирую это в корень диска c:\.

Так мне будет легче не запутаться в каталогах.



Запускаем программу, созданную в NXP MCUXpresso, на плате Teensy 4.1.

Далее мне очень хотелось записать все необходимые мне шаги на этапе после сборки.

Но, к сожалению, мне не удалось договориться с загрузчиком Teensy при запуске его из «клипа» (а по сути MCUXpresso — это модифицированный «клип»).

Поэтому мы проделаем два этапа.

Мы создадим файл HEX в среде разработки.

Давайте перейдем сюда (чтобы отредактировать шаги после сборки):

Запускаем программу, созданную в NXP MCUXpresso, на плате Teensy 4.1.

И вот мы видим вот это безобразие:

Запускаем программу, созданную в NXP MCUXpresso, на плате Teensy 4.1.

Вторая и третья строки закомментированы.

Причем второй явно конвертирует axf-файл в двоичный.

На основе этого теперь сделаем генератор файлов в формате Intel Hex:

  • Удалите знак комментария (решетку и пробел позади него);
  • Замените тип выходного файла с двоичного на ihex;
  • Измените расширение выходного файла с bin на hex.
Общий: рука-нет-еаби-objcopy -v -O iшестнадцатеричный "${BuildArtifactFileName}" "${BuildArtifactFileBaseName}.

hex" Или на экране:

Запускаем программу, созданную в NXP MCUXpresso, на плате Teensy 4.1.

А на втором этапе будут полумеры.

Возможно, тогда вопрос решится с помощью пакетного загрузчика TeensyLoader CLI, но для простоты, а пока для остального буду помещать в каталог, где собрано приложение , bat-файл следующего содержания: C:\Tensy_Tools\teensy_post_compile.exe -file=%~n1 -path=.

/ -tools=C:\Teensy_Tools C:\Teensy_Tools\teensy_reboot.exe Получается вот так:

Запускаем программу, созданную в NXP MCUXpresso, на плате Teensy 4.1.

Я запускаю его, передавая в качестве аргумента шестнадцатеричный файл: makeTeensy.bat evkmimxrt1060_dev_cdc_vcom_bm.axf.hex И тут те, кто работал с Teensyduino, уже узнают автоматически запускающийся стандартный загрузчик.



Запускаем программу, созданную в NXP MCUXpresso, на плате Teensy 4.1.

Нажимаю кнопку на плате, файл загружается, получается виртуальный COM-порт, у меня это COM8:

Запускаем программу, созданную в NXP MCUXpresso, на плате Teensy 4.1.

Давайте откроем терминал (скорость не важна, просто у нас протокол CDC без физического UART) и что-нибудь введем.

Скажем «Привет UART»:

Запускаем программу, созданную в NXP MCUXpresso, на плате Teensy 4.1.

Эхо есть.

Но всё как-то скучно.

Давайте добавим немного интересного функционала.

Генерация эха происходит здесь:

Запускаем программу, созданную в NXP MCUXpresso, на плате Teensy 4.1.

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

Запускаем программу, созданную в NXP MCUXpresso, на плате Teensy 4.1.

То же самое и с текстом.

   

/* Copy Buffer to Send Buff */ for (i = 0; i < s_recvSize; i++) { s_currSendBuf[s_sendSize++] = s_currRecvBuf[i]+1; }

Собираем, загружаем, входим в терминал, вводим заветную фразу.

Видим такое эхо:

Запускаем программу, созданную в NXP MCUXpresso, на плате Teensy 4.1.

Работает! К коду каждого символа добавляется один.

Получившаяся «прошивка» имеет один небольшой недостаток.

Чтобы предотвратить переполнение буфера, разработчики NXP применили хитрость.

Пока данные не будут собраны, передать новые в такой UART не получится.

Нет приема эха – новые символы не получены.

Просто я эту «прошивку» использовал для измерения производительности USB этого устройства, а там просто отправляю данные, не получая их обратно.

Подробнее о методике измерения я писал в предыдущая статья .

Но в следующий раз я расскажу, как устранить эту особенность и как проводились измерения для NXP. Кроме того, мы научимся работать с GPIO и UART.

Заключение

Мы освоили методику разработки прошивки для платы Teensy не с помощью Teensyduino, а с использованием инструментов разработки от NXP. Автор считает, что библиотеки от NXP гораздо удобнее своих аналогов Arduino. Ну или хотя бы более полно.

В любом случае владение различными техниками дает возможность выбора, а выбор всегда велик.

Теги: #Программирование микроконтроллеров #Компьютерное оборудование #Системное программирование #teensy 4.1 #NXP MCUXpresso

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.