Продолжаем освоение микроконтроллеров Kinetis. На этот раз освоим среду разработки KDS и запрограммируем вывод меандра. Выясним сколько на это нужно времени. Узнаем какой максимальной частоты меандра можем добиться и обнаружим удивительное быстродействие портов Kinetis. И конечно же напишем классический «Hello, world!» с выводом через UART на скорости в 1.5 Мбит/c.

Предыдущие статьи:



Напомню, мой выбор микроконтроллеров Kinetis был в основном обусловлен более развитой программно-инструментальной поддержкой со стороны производителя этих чипов по сравнению с конкурирующими решениями. В своей профессиональной деятельности мне приходилось использовать много различных микроконтроллерных архитектур в их числе 32-х разрядные микроконтроллеры: STMicroelectronics (STM32), NXP (LPC), Texas Instruments (OMAP), поэтому сравнить есть с чем.

Итак, предыдущая стать про умную силовую плату продемонстрировала аппаратные возможности микроконтроллеров семейства Kinetis фирмы Freescale. Плата может управлять асинхронными двигателями, ТЭН-ами, мощными осветительными приборами и прочими нагрузками и во многих случаях упрощает создание надежных и инновационных бытовых и промышленных устройств и установок.
Теперь нужно рассказать, как программировать Kinetis.

Перед этим желательно уже иметь опыт программирования подобных микроконтроллеров. К подобным можно отнести любые 32-х разрядные микроконтроллеры выполненные на ядре ARM Cortex-M3, M4, M7. Но если до этого имели дело только с Arduino, то тут будет сложнее, но и интереснее, поскольку это открывает окно в широкий мир эффективных функционально насыщенных встраиваемых систем.

Что нам нужно для начала?



1. Плата с микроконтроллером семейства Kinetis.
2. Отладочный адаптер для подключения PC к интерфейсу JTAG/SWJ-DP микроконтроллера
3. Осциллограф.
4. Интегрированная среда разработки IDE адаптированная для микроконтроллеров Kinetis

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


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

Отладочный адаптер я настоятельно бы рекомендовал Segger J-Link. Причем именно оригинальный. Это будет оправданной инвестицией, даже если не собираетесь программировать Kinetis, а, скажем, ориентируетесь на другие чипы на ядре ARM.
Осциллограф, желательно 4-х канальный, все-таки плата работает с 3-х фазной сетью и с полосой не менее 200 МГц, поскольку частота выходных сигналов микроконтроллера может достигать нескольких десятков мегагерц.

Инсталляция интегрированной среды разработки



Для работы с Kinetis фирмой Freescale разработан бесплатный пакет программного обеспечения Kinetis Design Studio (KDS). Данный пакет существует в реализациях для Linux, Mac и Windows. В него входит интегрированная среда разработки на базе Eclipse, GDB отладчик, инструменты компиляции и сборки GNU, специальный плагин Processor Expert для авто генерации исходных текстов для Kinetis и плагин поддержки отладки операционных систем реального времени MQX и FreeRTOS и еще многое другое, о чем можно прочитать на странице продукта.

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

Для скачивания пакета может потребоваться регистрация на сайте Freescale, но она не займет много времени.
Когда найдете страницу скачивания Kinetis Design Studio перед вами предстанет такая картина:



Далее будем рассматривать только вариант для Windows.

Скачиваем главный пакет и апдейты:
Installer: Kinetis Design Studio installer for Microsoft Windows 3.0.0
Processor Expert for Kinetis 3.0.1 Update
Project Wizard support for Kinetis KM14, KM33 and KM34

Исходники KDS v3.0.0 Source Files Package скачивать не обязательно.

Инсталлируем Kinetis Design Studio installer for Microsoft Windows 3.0.0.
Скачанные апдейты инсталлируем уже из запущенной IDE Kinetis Design Studio (KDS). В каждом архиве с апдейтом есть инструкция как это сделать.

Кроме самого Kinetis Design Studio нужно еще скачать пакет ПО KSDK v1.2.0 Mainline release, в котором содержатся: исходные коды драйверов периферии используемых в Processor Expert, ПО уровня аппаратной абстракции, исходные тексты операционных систем реального времени (MQX, uCOS-II, uCOS-III, FreeRTOS), промежуточное программное обеспечения (LwIP, FATfs, RTCS, MFS), стеки USB и проч.
Здесь страница скачивания может предстать в таком виде:



Скачиваем:
KSDK v1.2.0 Mainline release и совместно с ним патч Eclipse update patch for Kinetis SDK v1.2.0
CyaSSL for Kinetis SDK v1.2.0 with MQX RTOS releases and patches

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

Инсталлируем KSDK v1.2.0 Mainline release и патч Eclipse update patch for Kinetis SDK v1.2.0.

Здесь все инсталляции завершены.
Это несколько дольше чем инсталляция IDE Arduino, и может занять больше часа, однако объем получаемого при этом программного обеспечения и гибкость решений несравненно больше.

Среда разработки инсталлирована, что делать дальше чтобы написать первое приложение на Kinetis?



Прежде всего вспомнить точное название чипа, с которым работаем – это MK60FN1M0VLQ12.
Далее нам нужна документация именно на этот чип:
Лист данных
Справочное руководство

Документация предоставляется не на конкретный чип, а на подсемейство (Sub-Family). Поэтому потребуются некоторые усилия для поиска в документации действительной конфигурации именно для нашего чипа. Справочные руководства от разных производителей сильно отличаются по стилю друг от друга. Это иногда является сильнейшим препятствием для перехода на новую архитектуру. Хорошая новость в том, что документация на Kinetis одна из самых исчерпывающих и подробных, а форум по микроконтроллерам Kinetis не уступает по активности иным обще-электронным форумам.

Справочное руководство для нас важнейший документ. У руководств от Freescale есть особенность – одна из первых глав под название Chip Configuration содержит короткие уточнения по составу, подключению и функциональным возможностям отдельных периферийных блоков чипа. Эту главу надо изучать обязательно при ознакомлении с полными описаниями периферийных модулей находящимися в отдельных главах руководства.
Все руководство прочитать скорее всего никогда не придется, оно более 2100 страниц, но первые 9 глав стоит бегло просмотреть.

Теперь запускаем KDS и создаем пустой проект.


Появляется диалоговое окно с указанием пути к рабочему пространству среды Eclipse.
Здесь можем ввести произвольный удобный нам путь.
В этом окне не тратим время и нажимаем кнопку в верхнем правом углу — Workbench
Открывается пустое окно рабочего пространства. Создаем проект в этом пространстве. Для этого выбираем пункт меню File->New->Kinetis Project как показано ниже.
Поскольку KDS сделан на основе Eclipse и Eclipse CDT (C/C++ Development Tooling) то здесь присутствует множество пунктов которые нам сейчас не нужны. Eclipse и дальше будет подавлять количеством непонятных фичей, с этим надо просто смириться. Потом это все приобретет смысл.
В поле Project Name задаем имя нашему первому проекту. В этом проекте мы запрограммируем вывод меандра на один из пинов микроконтроллера и узнаем какую максимальную частоту мы можем генерировать.
В этом окне выбираем чип с которым собираемся работать. Пункт Boards для тех кто решил все таки использовать отладочную плату от Freescale.
Здесь щелкаем чекбокс Processor Expert.
Выбираем перспективу Eclipse, т.е. состав и размещение рабочих панелей в окне Eclipse, которые впрочем всегда потом можно будет поменять. А также решаем, что проект у нас будет автономным (Standalone) т.е. не будет ссылаться на файлы где-то далеко за пределами директории проекта, а все скопируется в проект. Далее жмем Next.
Пока мы не знаем за что Keil и IAR хотят деньги за свои компиляторы выбираем бесплатный компилятор GNU C и жмем наконец Finish
Работа закипела. В директории проекта создается множество файлов. А именно 72 файла и 12 поддиректорий.
Вот что должно изобразиться в конце.
Голубые прямоугольники на на чипе обозначают уже предварительно сгенерированную инициализацию отдельных периферийных модулей чипа. Без этой необходимой инициализации, чип просто не сможет корректно запустить пользовательскую программу.


Теперь определимся на каком пине будем генерировать сигнал.



На выбранной мной плате есть специальные контактные площадки для наблюдения за сигналами OUT1...OUT7, как показано на схеме. Выходят сигналы после буфера ULN2003 (U16) на разъем X41. У микроконтроллера эти сигналы подключены к линиям PTB1-PTB7 порта B. Выбираем для генерации меандра сигнал OUT1.


Замечание по поводу программирования портов.


У чипов Kinetis в отличие скажем от STM32 есть два периферийных модуля отвечающих за управление внешними выводами общего назначения. Это модуль под названием Port Control and Interrupts (PORT) и модуль General-Purpose Input/Output (GPIO).
В модуле PORT настраиваются редко изменяемые свойства выводов такие как: назначение альтернативной функции, назначение прерывания, сила выходного драйвера, подключение подтягивающих резисторов, подключение фильтров и т.д.
В модуле GPIO происходит оперативное управление выводом: установка уровня сигнала, чтение сигнала, установка направления вывода.

Настраиваем периферию для программы генерации меандра.



Пока никакой код не пишем, все делается через диалоговые окна и панели в KDS.
Нам нужно, во-первых, настроить подсистему тактирования, во-вторых, настроить порт вывода.
Не вникая в специфику подсистемы тактирования, которая довольно сложна, просто приведу скриншоты диалоговых панелей с правильной настройкой.

Настройка подсистемы тактирования




Здесь мы активируем системный осциллятор 0. Записываем частоту внешнего кварца и устанавливаем на каких выводах подключен внешний кварц осциллятора 0.


Указываем что выход осциллятора 0 подаётся на умножитель частоты 0 (PLL0). Умножитель повышает частоту до 120 МГц.


Задействуем умножитель частоты 0 (PLL0) для тактирования процессора. Для этого включаем режим PEE (расшифровку смотреть в мануале) от выхода PLL0.


Настраиваем Core Clock, Bus Clock, External Bus Clock, Flash Clock. KDS не даст ввести ошибочные варианты этих настроек. На скриншоте указаны настройки на максимальные возможные частоты всех этих сигналов.

Настройка линии вывода меандра




Разрешаем работу выхода 1 порта B. Это приведет к генерации иницализации порта на старте программы.


Настраиваем режим работы непосредственно выхода 1.

Конфигурирование закончено. Пишем свою программу



Программа состоит всего их двух строк. Это гораздо меньше чем для аналогичной функциональности пришлось бы писать на Arduino.
Программа записывается в файл main.c уже сгенерированный на предыдущем этапе.
А выглядит программа так:


Важно помнить.
При генерации исходных текстов файл main.c перезаписывается. При этом стираются все изменения сделанные в нем в ненадлежащих местах.
Остается нетронутым только фрагмент в функции main начиная от комментария
/* Write your code here */
и до комментария
/*** Don't write any code pass this line, or it will be deleted during code generation. ***/


Прежде чем скомпилировать программу сделаем еще пару важных настроек.

В свойствах файла main.c вызываемых из контекстного меню файла устанавливаем максимальный уровень оптимизации:


Чтобы отладка программы была более удобной в меню Window->Preferences -> C/C++ ->Debug -> EmSys Register View указываем настройки как на скриншоте.


Генерация, запись во Flash и запуск кода на исполнение



Генерируем код командой Project -> Generate Processoe Expert Code.
Запись кода во Flash и начало исполнения выполняются командой Run -> Debug (F11)
При запуске должен появится диалог с просьбой выбрать отладочный адаптер.
Я выбираю Segger поскольку именно он подключен у меня к плате.

Если загрузка прошла без ошибок, то после точки останова на функции PE_low_level_init(); нажимаем Resume и на экране осциллографа подключенного к сигналу OUT1 на плате должна возникнуть вот картинка подобная этой:


Синусоидальность сигнала не должна смущать.
Поскольку здесь мы имеем дело с меандром частотой 60 МГц, то начинают сказываться ограниченная полоса пропускания щупа, полоса пропускания осциллографа, емкость щупа, отражения сигнала в проводнике между точкой измерения и выводом микроконтроллера и ограниченное быстродействие вывода микроконтроллера.
Однако видно что микроконтроллер способен генерировать частоту до 60 МГц, это примерно соответствует частоте телевизионного сигнала.
Также интересно то, что снизив частоту шины в два раза частота на внешнем выводе не изменится. Т.е. запись в порт у микроконтроллера MK60 производится всегда за один такт частоты ядра.

Пишем «Hello, world!»



Здесь все просто.
Добавляем из Componrnts Library в проект компонент Term. И настраиваем его на скорость 1500000 бит/с. Также указываем, что он будет работать в канале UART5 (разъем X37) и назначаем внешние пины для сигналов Rx и Tx.


Текст нашей программы будет следующим:


Отрываем программу эмулятор терминала на PC и наблюдаем результат.
Правда редкий RS232-USB адаптер может поддерживать такую скорость.
Для этого рекомендую использовать адаптеры фирмы FTDI.

Итог.



Благодаря среде Freescale KDS мы создали два проекта хорошо раскрывающие потенциал чипов Kinetis не потратив и пары часов.
И это только начало.
В запасе еще много достойных внимания программных средств для этих чипов способных сильно упростить жизнь разработчиков встраиваемых систем.

Представленные здесь проекты для среды KDS можно скачать по ссылке на GitHub:
github.com/Indemsys/SB200BE/tree/master/PCB_SB200BEv2/DemoProjects

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


  1. Dark_Purple
    11.10.2015 01:47
    +1

    Kinetis очень неплох, в сравнении с теми же STM32, LPC. Но вот эта ихняя Kinetis Design Studio это просто вынос мозга мне не понравилась, очень монструозная штука, множество крутилок и галочек, при чем они часто дублируются, требует серьёзных ресурсов компьютера. Использую православный IAR.
    Это всё только мое мнение, возможно новичку который глубже ардуино не копал, будет наоборот проще разобраться.
    Статья понравилась, пишите ещё.


  1. GarryC
    11.10.2015 17:15
    -1

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

    Забавно. Что такое частота шины? Какой шины? При чем тут вообще шина? Если имелось в виду тактирование порта, то тогда и не должно было измениться.
    Не вникая в специфику подсистемы тактирования, которая довольно сложна, просто приведу скриншоты диалоговых панелей с правильной настройкой.

    А вот это вообще порадовало. Тогда зачем вообще писать? Просто, чтобы рассказать о програмном продукте?
    Мне почему то кажется, что человеку, неспособному разобраться в системе тактирования МК, не следует делать устройства управления трехфазной сетью, или я чего-то недопонимаю?


  1. GarryC
    12.10.2015 10:51
    +1

    Указанная в посте программа будет скомпилирована в минимум 3 команды (не забудем про переход), и как на частоте 120 получается выходная частота почти 60, да еще и со скважностью единица, я даже представить не могу. Это, наверное, очень сильное колдунство.

    Кстати, интересное наблюдение. Компилятор IAR (правда free версия, может в pro было бы лучше?) эту программу при сильной оптимизации по скорости для ядра М0 превратил в 3 команды, а для ядра М4 почему-то в 5 команд, что никак не может быть засчитано в пользу компилятора.


    1. Indemsys
      12.10.2015 12:41

      Да, спасибо за замечание.
      Чтобы получить такую осциллограмму на самом деле было вставлено несколько десятков таких пар команд.
      Эт недочет, надо было дать скриншот реальной программы.

      Кстати при измерении частоты меандра изменялась частота системной шины. И она не влияла на частоту выходного сигнала.

      Я тоже в основном работаю с IAR. Он компилирует ровно в те же 3 команды что и GCC.
      Но про IAR напишу как нибудь в другой раз.


  1. Mirn
    12.10.2015 18:34

    спасибо. понравилось что они дают очень хорошую среду, и не только сразу готовую к написанию кода с подцепленным компилятором. А ещё имеется визуальный-диалоговый конфигуратор всей переферии, это существенный шаг вперёд по сравнению с STM32 где такой конфигуратор отдельно от среды и мало продуманный.
    Я как долго и муторно настраивавший сам эклипс+gcc очень рад что есть такое — это реально экономия как минимум недели. А если не знаешь юникс-идеалогию и не работал с эклипсом, то существенно больше (а таких железячников немало).
    Да и мне почему то по удобству больше эклипс понравился чем кейл и иар — но это дело вкуса скорее.
    А статья про IAR интересна, и очень прошу уделить внимание сравнению эффективности компиляторов gcc и IAR. Раньше (3-4 года назад) у IAR и кейла код существенно эффективнее чем у GCC был.