Предистория
CLion — это среда для разработки на С/С++, близкий родственник IntelliJ IDEA и, соответственно, Android Studio.
Я представляю вниманию сообщества перевод моего блог поста, в котором по шагам описано, как использовать эту IDE для написания прошивок микроконтроллеров.
Примерно полтора года назад я написал блог-пост по английски, в котором рассказал, как можно использовать JetBrains CLion для программирования микроконтроллеров.
Если кратко, в тот раз я использовал одну из плат серии STM32-Discovery. Набортный программатор был перешит в совместимый с SEGGER JLink. Также был использован генератор кода STM32CubeMX, тулчейн GCC ARM и отладчик SEGGER Ozone. При помощи всего этого удалось поморгать светодиодиком :).
Такой набор инструментов в целом работал, но требовал перешивки программатора, запуска внешнего отладчика (зачем он нам, если есть замечательный CLion?), кроме того, SEGGER накладывает довольно жесткие лицензионные ограничения на такие перепрошитые программаторы.
Естественно, все эти проблемы меня не радовали, и я пытался найти решение получше. К счастью, прогресс не стоит на месте, и за прошедшее время и CLion, и CubeMX были существенно улучшены, и самое главное, CLion теперь поддерживает Remote GDB. Теперь стало реально использовать OpenOCD (Open On-Chip-Debugger) как ПО для заливки и отладки прошивок микроконтроллеров. Таким образом можно избавиться от ограничений лицензии SEGGER в пользу инструментов с открытым исходным кодом. Более не требуются никакие перепрошивки программаторов, демо-платы можно использовать прямо так, даже для прошивки целевых устройств (см. документацию на платы ST Nucleo или Discovery).
Мне удавалось запустить это все на ванильном CLion, но настройка проектов была настолько сложной, что я в конце концов пришел к мысли написать свой собственный плагин, который позволит увязать друг с другом все инструменты сразу. И вот, я довел плагин до бета-версии, опубликовал в репозитории JetBrains, и готов показать, как это все это функционирует. Для примера мы сделаем небольшой демо проект (сюрприз! Мы будем мигать светодиодами!), используя одну из самых популярных плат от ST Microelectronics – STM32F4-Discovery. Тот же самый пример, с небольшими изменениями, может быть запущен на любой плате из серий STM32 Nucleo, Discovery или EVAL, поскольку светодиоды есть на каждой из них.
Инструментарий
CLion
Прежде всего, нам нужна, собственно, IDE. CLion доступен для загрузки на сайте JetBrains. Просто запустите инсталлятор и следуйте инструкциям. Вам понадобится лицензия, но месячного триала должно хватить на первое время. Инструкция по установке тут.
Плагин
Откройте настройки CLion, вкладку Plugins, нажмите Browse Repositories… и найдите плагин по ключевому слову openocd. Далее Install и рестарт CLion.
Теперь в CLion появился еще один Run Configuration, два дополнительных пункта в меню Tools еще одна вкладка в настройках.
Тулчейн
Тулчейн (toolchain) – это кросс-платформенный набор инструментов для сборки программ и прошивок. Кросс-платформенный – это значит, что компиляция происходит на PC или Mac, а результат сборки будет работать только на целевом устройстве. В нашем случае это ARM-совместимый МК.
Существует несколько разных тулчейнов, таких как свободные и поддерживаемые CLion’ом Clang или GCC, а так же несколько коммерческих (Keil, IAR, Raisonance, etc). Я использую GCC, скачанный из официального источника – https://developer.arm.com/open-source/gnu-toolchain/gnu-rm. Обратите внимание, после установки тулчейн должен включен в system path. Проверить это можно, запустив arm-none-eabi-gcc из командной строки.
OpenOCD
OpenOCD – это отладчик, поддерживающий аппаратную отладку различных МК с помощью одного из множества поддерживаемых программаторов. Также он может прошивать FPGA и flash-память. Таким образом, потенциально можно работать с огромным количеством разных чипов, не ограничиваясь продукцией ST.
Из всех возможностей OpenOCD плагин использует три:
поддержка прошивальщика ST-Link/V2
Поддержку МК с ядром ARM Cortex M
- Поддержку протокола Remote GDB
OpenOCD официально распространяется в виде исходников, но существуют также полуофициальные сборки под все популярные платформы. Более подробно смотрите тут: http://openocd.org/getting-openocd/. Под Windows еще нужен драйвер для ST-LINK/V2. Драйвер обычно идет в сборке OpenOCD для Windows, но можно его скачать и напрямую, с сайта ST, вместе с весьма удобной утилитой для прошивки МК, вот отсюда: http://www.st.com/en/development-tools/stsw-link004.html.
STM32CubeMX
STM32CubeMX – это бесплатный генератор кода для любых МК STM32. В нем можно настроить конфигурацию выводов, периферийных устройств, тактирование ЦПУ и так далее. Все это происходит в весьма удобном визуальном редакторе. После этого Cube создает костяк исходного кода, то есть все необходимые .c и .h файлы, а также файлы проекта для одной из поддерживаемых IDE (в число которых CLion, увы, не входит). Cube состоит из собственно редактора-генератора и подгружаемых т.н. "Firmware Packages", по одному на каждое семейство МК. Сам генератор доступен для загрузки здесь.
Приступим
Одна из самых популярных плат для STмовских МК – STM32F4-Discovery. Ее и возьмем для нашего примера. На борту довольно мощный (хотя и не топовый) МК – STM32F407, прошиватель, совместимый с ST-LINK/V2, и 4 управляемых светодиода. Там еще микрофон, звуковой выход, акселерометр, USB, но в этой статье мы не будем углубляться в них – займемся только светодиодами. Если у вас уже есть какая-нибудь другая плата из серий STM32 Discovery, Eval или Nucleo, то это не беда, вы можете сделать все тоже самое на любой из них, т.к. там есть как минимум один светодиод.
Настройка платы
После установки всех инструментов давайте, наконец, напишем "улучшенную мигалку" для нашей STM32F4-Discovery. Перво-наперво, запускаем CubeMX. При старте он загружает список доступных МК и плат из сети, и после этого можно выбрать любой из МК. Естественно, мы больше заинтересованы в платах. Переходим в “Board Selector”, находим и дважды кликаем STM32F4DISCOVERY.
После этого откроется редактор, в котором показан собственно чип МК, и можно настроить режимы пинов, любую периферию и схему тактирования процессора, пользуясь тремя вкладками. На последней, четвертой, вкладке ничего настроить нельзя, но можно рассчитать энергопотребление чипа в зависимости от конфигурации.
Поскольку мы начали не с "голого" МК, а с платы, то кое-что уже сделано для нас. В частности, настроены нужные нам GPIO для светодиодов, им даже присвоены имена LD3...LD6. Нам только требуется донастроить сам проект и сгенерировать код. Нужно выбрать папку проектов, имя собственно проекта и задать SW4STM32 в качестве Toolchain/IDE.
Теперь нужно закрыть настройки и нажать Generate Code, т.е. кнопку с шестеренкой. Когда генерация кода закончена, просто закройте финальный диалог (т.е. не надо трогать кнопку "Open Project").
Наконец мы можем открыть полученный год с помощью CLion. Выберите File -> Import из главного меню или Import Project from Sources из Welcome screen. В процессе импорта CLIon может показывать диалоги подтверждения или показывать ошибки – просто игнорируйте это. Когда проект будет, наконец, импортирован, следует выбрать в меню Tools->Update CMake project with STM32CubeMX project.
В этот момент плагин перепишет CMakeLists.txt полностью, и, таким образом, подключит тулчейн и все необходимые скрипты. Теперь CLion сможет скомпилировать и собрать проект. Кроме того, плагин настраивает новую Run Configuration для заливки и отладки скомпилированного проекта.
Настройка параметров плагина.
Снова откройте настройки CLion, на этот раз вкладку OpenOCD Support в группе Build, Execution, Deployment.
Там необходимо указать папку, где находится OpenOCD и файл конфигурации для платы. Плагин пытается найти OpenOCD в system path сам, но иногда нужно явно прописать точное местонахождение. В большинстве случаев настройки портов и путь к GDB вам менять не надо, однако пользователям Mac все-таки нужен другой gdb. Например, можно взять arm-none-eabi-gdb из тулчейна.
Самое последнее, что нужно сделать – выбрать файл конфигурации платы (Board Config File) с помощью соответствующего диалога. Эти файлы находятся в подпапке boards инсталляции OpenOCD. Для данного проекта наилучшим выбором является, очевидно, stm32f4discovery.cfg.
А теперь добавим кода
Вот теперь мы все необходимые настройки сделаны, можно писать код. Открываем main.c, находим бесконечный цикл while и добавляем туда несколько строк, см. строки 106-111:
Эти строки зажигают случайную комбинацию светодиодов каждые 300 мсек.
Также можно добавить несколько директив #pragma (строки 100, 101 и 113) чтобы избавиться от предупреждений CLion – бесконечные циклы не используются в "нормальных" программах на C и, поэтому, они не нравятся нашей IDE.
Ключ на старт!
Настал момент поставить breakpoint где-нибудь внутри тела main() и запустить это все! CLion соберет проект, загрузит в нашу плату, запустит отладчик и сбросит МК. Теперь можно пользоваться breakpoints и watches для отладки.
Лучше один раз увидеть, чем три раза прочесть:
Что дальше?
Если уважаемому читателю удалось проделать все вышеописанное, то простенький пример прошивки работает. Но как писать код далее? Окей, вот несколько советов в форме вопрос-ответ.
Q: Какие платы поддерживаются?
A: Более-менее любые демо платы STMicroelectronics серий STM32 Discovery, Nucleo или EVAL должны работать.
Q: Что делать, если мне надо поменять аппаратную конфигурацию МК?
A: Запустите STM32CubeMX снова и откройте ваш проект, сделайте необходимые изменения и перегрерируйте код. Плагин в IDE спросит, не надо ли обновить проект. Просто ответьте "Yes".
Q: Как я могу защитить написанный мной код от перезаписи в момент генерации?
A: Всегда пишите свой код между псевдокомментариями
/* USER CODE BEGIN ??? */
и /* USER CODE END ??? */
.
Cube не трогает эти фрагменты при генерации кода. Не забывайте переносить автоматически добавляемые директивы #include в такие места. Альтернативный подход для больших кусков кода – отдельные файлы .c/.h.
Q: Мне нужно добавить внешнюю библиотеку, подключить FPU, сделать еще какие-то изменения в CMakeLists.txt. Но как?
A: CMakeLists.txt автоматически перезаписывается плагином из шаблона, напрямую там лучше ничего не менять. Сам шаблон автоматически записывается среди файлов проекта, следует сделать изменения там, после чего обновить проект, используя пункт меню Tools->Update CMake project with STM32CubeMX.
Q: Я хочу использовать CLion для моих разработок на базе ARM, но не на STM32. Могу я использовать этот плагин?
A: Скорее всего, да. Надо установить все те же инструменты (кроме STM32CubeMX), а затем написать свой собственный CMakeLists.txt (вот шаблон), скрипт для линкера и файл конфигурации платы. Когда все готово, выберите Tools -> CMake -> Reset Cache and Reload Project и создайте свою Run Configuration типа OpenOCD Download & Run. Один из пользователей плагина все это проделал для Atmel SAM E70.
Q: Я хочу использовать CLion и плагин для моих разработок, но не для ARM. Это возможно?
A: Ну, если ваш МК поддерживается GCC, прошиватель совместим с OpenOCD, то как минимум можно попробовать. Возьмите подходящий тулчейн и см. предыдущий ответ.
Q: Я не могу подобрать подходящий файл конфигурации платы. Я могу использовать несколько отдельных файлов конфигурации?
A: Можно написать свой файл конфигурации платы, скомбинировав их. Положите его в свой проект, а за образец возьмите один из стандартных.
Q: А мне нравится! Могу я как-нибудь поддержать проект или поучаствовать в нем?
A: Конечно!