- Настройка Sublime Text 3, SW4 и STM32CubeMX для разработки STM32 под Linux
- Предварительно устанавливаем необходимый софт
- Создадим нужные директории для установки программ и хранения библиотек
- Для STM32CubeMX и Eclipse нам понадобятся:
- Устанавливаем 32-битные библиотеки
- Устанавливаем Open JDK 8 JRE
- Устанавливаем STM32CubeMX
- Создадим красивый ярлык и добавим поиск в Dash
- Устанавливаем Sublime Text 3
- Настройка Sublime Text 3
- Настроим ST3
- Настраиваем пакеты ST3
- EasyClangComplete
- Sublimelinter
- SublimeAStyleFormatter
- Устанавливаем AC6 System Workbench for STM32 (SW4STM32)
- Добавим поиск SW4 в Dash
- Настройка SW4
- Проверка настроенной среды и небольшие доводки
- Сделаем минимальную настройку МК
- Настроим сам проект
- Проверим Sublime Text 3
- Откомпилируем проект и посмотрим debug
- Настройка Git
- Записки программиста
- Готовим «взрослую» среду разработки под STM32 в Linux
- Необходимый софт
- Необходимое железо
- Создание каркаса проекта в STM32CubeMX
- Пишем код!
- Заключение
Настройка Sublime Text 3, SW4 и STM32CubeMX для разработки STM32 под Linux
Подобных статей достаточно много на просторах интернета, но хотелось бы написать актуальную вариацию. Лично я долгое время мучался в связке: Ubuntu — основная система, разработка под STM32 в виртуальной машине Windows 7. Но однажды меня это очень утомило и я таки решил потратить несколько дней на поиск решения и вылизывание полноценной среды под Linux Ubuntu. Забегу вперёд и скажу, что идеала я так и не добился, не удалось сделать realtime debug, как в Keil. В остальном всё очень пристойно.
Внимание, очень много текста и картинок!
Что в итоге у меня получилось:
- Sublime Text 3 с автодополнениями и подсветкой всех функций, включая HAL и остальные библиотеки проекта;
- AC6 System Workbench for STM32 с кастомизированными перспективами и прочими плюшками;
- Конечно же использую контроль версий в Git.
Шаги, которые необходимо проделать:
- Добавить необходимые PPA в APT;
- Установить нужные библиотеки;
- Установить программы;
- Внести правки в конфигурационные файлы;
- Доделать всякие плюшки в виде красивых иконок, поиска из меню и т.д.
Инструкция дана для абсолютно чистой машины на базе Ubuntu 16.04, в вашем случае могут быть уже установлены какие-то компоненты. В этой статье и в последующих буду приводить примеры для отладочной платы STM32F3DISCOVERY. Она основана на МК STM32F303VCT6 c 256-Кбайт Flash и 48-КБайт RAM в корпусе LQFP100. Вы можете адаптировать настройки под ваш МК очень легко благодаря STM32CubeMX.
Всё указано для пользователя с именем bulkin, не забудьте менять его при настройке.
Предварительно устанавливаем необходимый софт
Создадим нужные директории для установки программ и хранения библиотек
Я предпочитаю устанавливать программы не из PPA в отдельную папку в домашней директории
/Programs. Во-первых, устанавливаю с правами локального пользователя. Во-вторых, папка с именем на английском, т.к. некоторые программы не любят кириллицу в пути.
Библиотеки предпочитаю хранить в /opt/libs.
Да, /opt — это OPTIONAL APPLICATIONS. Но у меня в /opt монтируется отдельный раздел с btrfs со сжатием. На всех своих машинах я настроил пути к своим библиотекам в /opt/libs. Морочиться и делать все по канонам (использовать /usr/local/lib и /usr/local/share) не вижу смысла, легко запутаться.
Для STM32CubeMX и Eclipse нам понадобятся:
Устанавливаем 32-битные библиотеки
Устанавливаем Open JDK 8 JRE
Устанавливаем STM32CubeMX
Скачиваем дистрибутив с сайта ST (потребуется регистрация), разархивируем и запустим файл с расширением .linux. Если установщик не запускается, скорее всего не установлены 32-битные библиотеки. Путь установки меняем на /home/bulkin/Programs/STM32CubeMX, устанавливаем.
Создадим красивый ярлык и добавим поиск в Dash
Вставим следующее содержимое:
Теперь в dash иконка появится в разделе Приложения, поиск в dash будет работать после перелогинивания.
Запускаем STM32CubeMX, идём в настройки Help->Updater Settings и меняем путь для хранения библиотек на /opt/libs/STM32Cube/Repository/
Установим библиотеку для STM32F3. Открываем Help->Install New Libriaries, ставим галку Firmware Package for Family STM32F3, жмём Install Now
Устанавливаем Sublime Text 3
Вообще, SW4 вполне самодостаточная IDE. Но я люблю кодить именно в ST3, а компиляция и дебаг в SW4. Инструкция по установке ST3 для любых дистрибутивов лежит тут.
После этого стоит перелогиниться.
Настройка Sublime Text 3
Для начала установим Package Control.
Запускаем ST3 и жмём CTRL+`, в командную строку вставляем код и жмём ENTER:
Для полноценной работы нам понадобятся такие пакеты:
- ARM Assembly (Подсветка Assembler в коде)
- C Improved (Подсветка C)
- CMakeEditor (Подсветка Cmake)
- DocBlokr (Форматирование комментариев)
- EasyClangComplete (автодополнение функций)
- Hex to Int preview (показывает значение HEX)
- SublimeAStyleFormatter (форматирует код нажатием CTRL+SHIFT+A)
- Sublimelinter
- Sublimelinter-contrib-cmakelint (Подсветка cmake)
- Sublimelinter-cppcheck (проверяет код на ошибки с помощью cppcheck)
- Sublimelinter-annotations (Подсвечивает FIXME, NOTE, TODO и т.д.)
Устанавливаем нужные пакеты из меню Preferences -> Package Control -> Install Package.
Настроим ST3
Откроем Preferences -> Settings и вставляем в правую половину:
Настраиваем пакеты ST3
EasyClangComplete
Настраиваем clang на C99 и указываем директории с базовыми библиотеками вроде StdLib.
Открываем Preferences -> EasyClangComplete -> Settings и вставляем в правую половину:
Sublimelinter
Открываем Preferences -> Sublimelinter -> Settings и вставляем в правую половину:
SublimeAStyleFormatter
Форматирование настроено на мой вкус. Подробное описание всех пунктов есть в Preferences -> SublimeAStyleFormatter -> Settings — Default
Открываем Preferences -> SublimeAStyleFormatter -> Settings — User и вставляем:
Устанавливаем AC6 System Workbench for STM32 (SW4STM32)
Полностью процесс установки описан на сайте OpenSTM32.org.
Переходим в папку загрузки и вводим
Если у вас установлен gksudo, установщик запустится в графическом режиме. У меня не установлен, потому всё в терминале.
Несколько раз вводим 1 в качестве согласия со всякой ерундой. Указываем путь установки:
Снова соглашаемся со всем, как девственник в свой первый раз, и ждём окончания установки.
Добавим поиск SW4 в Dash
Настройка SW4
Запускаем SW4, соглашаемся с созданием рабочей области, кликаем на workbench. При первом запуске будет установлен ARM Toolchain.
Сначала установим удобную тему. Открываем Help->Install New Software, жмём Add.. и вводим:
Жмём ОК, выбираем Eclipse Color Theme и жмём Next > и дальше всё по накатанной.
Включим тему: Window -> Preferences ->Appearance -> Color Theme. Я люблю Monokai, а вы можете позже подобрать, какую вам нравится.
Ну вот и пришло время запустить наш первый проект и проверить среду разработки в работе.
Проверка настроенной среды и небольшие доводки
Повторюсь, я буду приводить примеры для отладочной платы STM32F3DISCOVERY. Делаю всё максимально просто, нам ведь банально надо проверить настройки среды разработки.
Запустим STM32CubeMX, выберем в главном окне New Project. Откроем вкладку Board Selector. Выбираем нашу плату:
- Type of board: Discovery
- MCU Series: STM32F3
- Из списка ниже выбираем STM32F3DISCOVERY
И два щелчка на нашей плате.
Сделаем минимальную настройку МК
В левом меню включим:
- FreeRTOS: поставить галку Enabled
- SYS: Trace Asynchronous Sw
- Timebase Source: TIM17 (на текущем этапе можно выбрать любой)
Переходим во вкладку Clock Configuration:
- В поле HCLK вводим 64МГц (на встроенном осциляторе максимальная частота)
Настроим сам проект
Открываем Project->Settings из верхнего меню.
- Указываем имя проекта в поле Project Name: STM32Discovery-SW4-Test
- Указываем путь в поле Project Location: /home/bulkin/workspace
- Выбираем Toolchain: SW4STM32
Откроем вкладку Code Generator и включим «Add necessary libriary files as reference in the toolchain project configuration file»
Жмём ОК и теперь мы готовы создать проект. Жмите Generate Source Code в верхнем меню:
Проверим Sublime Text 3
Для начала надо создать CMakeList.txt. Для этого открываем консоль в корне нашего проекта и вводим:
Из нашего STM32Discovery-SW4-Test.ioc будут созданы необходимые для компиляции из командной строки файлы. Но нас интересует только CMakeLists.txt.template. Переименуем его в CMakeLists.txt.
Project->Add folder to Project. и выбираем папку нашего нового проекта.
Для начала надо добавить в CMakeList.txt недостающие пути к библиотекам. Это нужно для корректной работы EasyClangComplete. Слева щёлкаем на CMakeList.txt и вносим изменения:
Над строкой set(USER_INCLUDE Inc) добавляем:
Все последующие set вплоть до file меняем на:
Ну и в раздел include_directories в самый конец добавить $
Стоит объяснить, зачем нужны эти танцы с бубном. Дело в том, что при создании проекта мы выбрали опцию «добавлять библиотеки в качестве ссылок в тулчейне». А вот cubemx2cmake указывает относительный путь к библиотекам HAL, а также не добавляет пару путей к библиотекам CMSIS и FreeRTOS. Вероятно, это будет исправлено в будущих версиях, но пока так.
Теперь надо сбросить кэш Cmake: CTRL-SHIFT-P -> EasyClangComplete: Clean current cmake cache
Откроем Src/main.c Наведём курсор на какую-нибудь функцию и порадуемся всплывающим окошкам с её описанием. Подробнее о работе EasyClangComplete можно посмотреть тут.
Попробуем отформатировать код: нажмём CTRL+ALT+F и радуемся, как всё поменялось. Если предпочитаете другой стиль, нет проблем, настройки в Preferences -> SublimeAStyleFormatter.
Откомпилируем проект и посмотрим debug
Запускаем SW4 и импортируем проект:
- File -> Import… -> General -> Existing projects into workspace
- Select root directory: /home/bulkin/workspace/STM32Discovery-SW4-Test
- НЕ ставим галку Copy projects into workspace
Выбираем проект в Project explorer. Компилируем Project -> Build Project. Если всё было сделано без ошибок ранее, проект скомпилируется за несколько секунд. И в консоли в нижней части будет примерно так:
Подключим нашу плату к компьютеру и попробуем загрузить прошивку: Run -> Run as Ac6 STM32 C/C++ Application. Если всё удачно, в конце вывода консоли будет:
Ну и самое вкусное. Запустим дебагер. Run -> Debug (или просто жмите F11). SW4 загрузит прошивку и предложит открыть отдельную перспективу для дебагера. Советую согласиться.
Изначально наша программа будет остановлена на int main(void) <> , это брейкпонт по-умолчанию. Запустим программу нажав F8, чтобы инициализировались все настройки МК, потом остановим, нажав кнопку Suspend в верхней панели. Давайте попробуем зажечь светодиоды. В правой верхней части перспективы откроем вкладку I/O Registers, развернём GPIO и правый щелчок на GPIOE -> ODR -> Activate
Теперь посмотрим в STM32CubeMX в нашем проекте, что светодиоды сидят на ногах PE8 — PE15:
В столбце HEX Value в строках c GPIOE -> ODR -> ODR15 по GPIOE -> ODR -> ODR8 выставим 1 и радуемся магии, как загораются светодиоды на плате. Ставим 0 — гаснут.
К сожалению, такая магия возможно только в остановленном состоянии, в отличие от того же Keil uVision, реалтайма тут нет. (грустный смайлик)
Осталось только настроить Git
Настройка Git
Заходим через терминал в директорию с нашим проектом и инициализируем Git, включая ввод персональных данных:
Создадим .gitignore и добавим в него:
Ну и сделаем коммит:
В общем-то дальнейшие вещи выходят за рамки статьи о настройке среды разработки. Это и полноценное описание дебагинга, и всякие горячие клавиши ST3. Об этом я бы хотел поговорить в другой раз. Надеюсь, данная статья будет полезна, хотя ныне настройка среды стала гораздо проще, чем ещё год назад. Удачи!
Источник
Записки программиста
Готовим «взрослую» среду разработки под STM32 в Linux
Ранее мы выяснили, как разрабатывать под микроконтроллеры STM32 с использованием знакомой и понятной многим Arduino IDE. Этот подход, впрочем, не лишен недостатков. В частности, он (1) вводит лишние слои абстракции, что не позволяет писать максимально эффективный и компактный код, (2) работает с весьма ограниченным множеством микроконтроллеров и плат, а также (3) привязан к конкретной среде разработки, и не самой лучшей. Поэтому сегодня мы научимся разрабатывать под STM32 по-взрослому.
Важно! Порог вхождения в мир STM32 довольно высокий. Если вы никогда раньше не работали с микроконтроллерами, я бы рекомендовал начинать с плат Arduino и микроконтроллеров AVR.
Необходимый софт
Нам понадобятся следующие пакеты, часть из которых уже упоминалась в предыдущем посте:
Здесь приведены названия пакетов для Arch Linux, но я довольно уверен, что в других дистрибутивах Linux они называются так же, или как-то похоже. Если вам не удастся найти готовый пакет с STM32CubeMX, программу можно скачать отсюда (потребуется регистрация). Для работы приложению требуется виртуальная машина Java. Несмотря на то, что программа имеет расширение .exe, она превосходно запускается в Linux через java -jar file.exe .
Опционально вы также можете загрузить программу STLinkUpgrade, доступную для скачивания здесь (также потребуется регистрация). Эта программа предназначена для обновления прошивки программаторов STLink, что нередко приводит к исправлению багов, ну или как минимум к лучшим сообщениям об ошибках. Как и STM32CubeMX, эта программа написана на Java.
Необходимое железо
Помимо профессионального софта нам также понадобится профессиональное железо. Плата Blue Pill, рассмотренная в прошлом посте, в целом неплоха, но пользоваться ею несколько неудобно. В частности, к ней приходится подсоединять внешний программатор с его лишними проводами. Плюс STM32CubeMX про эту плату ничего не знает, что также вносит свою долю неудобства. Наконец, если у вас этой платы еще нет, вам придется ждать ее доставки с AliExpress.
Компания STMicroelectronics производит собственные отладочные платы серий Discovery и Nucleo. Последние являются более новыми, поэтому сосредоточим свое внимание на них. Платы STM32 Nucleo имеют встроенный отладчик STLink v2.1, что избавляет нас от лишних проводов. Они до определенной степени совместимы с Arduino-шилдами, что может пригодиться. Цены на платы Nucleo в России начинаются от 19$ за плату Nucleo-F030R8, притом купить ее можно в любом Чип-и-Дипе хоть сегодня.
Лично я взял плату помощнее — Nucleo-F411RE, на вырост, так сказать:
Принимая во внимание разнообразие плат Nucleo, выбор первой платы может быть непростым делом для начинающих. Следует учитывать множество факторов, включая количество Flash-, SRAM- и EEPROM-памяти, максимальную рабочую частоту, используемое ядро Cortex-M, количество аппаратных реализаций SPI/I2C/I2S/UART/CAN-интерфейсов, наличие/отсутствие DAC, ADC и модуля FSMC, энергопотребление, стоимость отладочной платы и ее наличие в ближайших магазинах, и, конечно же, стоимость и доступность самого микроконтроллера. Так как сейчас я не работаю над каким-то конкретным проектом, а просто изучаю микроконтроллеры STM32, я выбрал плату Nucleo-F411RE из-за неплохого соотношения цены и качества. Также меня привлек тот факт, что в микроконтроллере STM32F411RET6, на котором основана эта плата, используется довольно мощное ядро Cortex-M4F со встроенным FPU.
Fun fact! Существуют платы Xnucleo от компании Waveshare, совместимые с платами Nucleo. Платы Xnucleo легко узнать по характерному сине-желтому дизайну. На вид они более продуманы, чем Nucleo, так как используют более общепринятый в наше время разъем micro USB вместо mini USB, лишены дизайнерских «линий надреза» (см предыдущее фото), делающих плату более хрупкой, и имеют впаянный HSE кварцевый резонатор. Также компания Waveshare является производителем множества шилдов для плат Nucleo и Xnucleo.
Создание каркаса проекта в STM32CubeMX
Имеется большое количество отладочных плат и микроконтроллеров, под каждый из которых может требоваться немного измененные версии заголовочных файлов и стандартной библиотеки. Это количество помножим на число всевозможных конфигураций этих микроконтроллеров, например, какие пины для чего используются, какая из внутренних шин на какой частоте работает, и так далее. В плане подобных настроек STM32 является очень гибкой платформой. Получается довольно сложно. Для борьбы с этой сложностью создание каркаса пустого проекта (так называемый scaffolding) для заданной платы или микроконтроллера осуществляется при помощи специальной GUI-программы, STM32CubeMX.
Запускаем программу, жмем New Project. Во вкладке Board Selector находим вашу плату и делаем по ней двойной клик. Если у вас еще нет платы Nucleo, но есть плата Blue Pill и программатор STLink v2, на этом шаге вы можете выбрать микроконтроллер STM32F103C8Tx во вкладке MCU Selector.
Появится интерфейс с несколькими вкладками, из которых наиболее интересной для нас сейчас является вкладка Pinout:
Эта вкладка позволяет настроить, какой пин микроконтроллера для чего будет использован (ввод, вывод, аналоговое чтение, SPI/I2C/UART-шина, и так далее). Так как STM32CubeMX знает про нашу плату, программа автоматически настроила пин PC13 на ввод (для чтения синей кнопки на плате), а пин PA5 — на вывод (для управления зеленым светодиодом на плате). В рамках этой заметки другие пины нам не потребуются, поэтому оставляем все, как есть. Если же вы используете незнакомую STM32CubeMX плату, здесь вам потребуется настроить пины вручную. Например, в случае с Blue Pill вы наверняка захотите настроить пин PC13 как GPIO_Output, так как он подключен к светодиоду на плате.
Важно! Если вы используете Blue Pill, в STM32CubeMX обязательно требуется включить SWD. По умолчанию для микроконтроллера STM32F103C8T6 он выключен. В связи с этим, плату вы без труда прошьете в первый раз, но прошить ее во второй будет довольно непросто (хотя возможно). Более подробное описание этой тонкости ищите в заметке Используем STM32 безо всяких отладочных плат.
На двух других вкладках с названиями Clock Configuration и Configuration в этот раз нам ничего менять не придется. На вкладке Power Consumtion Calculator можно оценить энергопотребление микроконтроллера и время его работы в зависимости от выбранного аккумулятора и рабочего напряжения. Надо сказать, довольно любопытная и полезная возможность.
На этом с настройкой покончено. Говорим Project → Generate Code. Во вкладке Project вводим имя проекта (Project Name), выбираем родительский каталог для этого проекта (Prоject Location), в выпадающем списке Toolchain / IDE выбираем вариант «Makefile». Во вкладке Code Generator стоит выбрать опцию «Add necessary library files as reference in the toolchain project configuration file». Иначе в ваш проект будут скопированы все библиотечные файлы, а это более 160 Мб. Затем жмем ОК. Проект STM32CubeMX автоматически сохранится в каталоге с исходным кодом (файл с расширением .ioc), поэтому отдельно сохранять его не требуется.
Makefile в получившемся проекте нужно немного подправить. Во-первых, нужно исправить значение переменных BINPATH и PREFIX :
В противном случае не будут найдены исполняемые файлы компилятора.
Во-вторых, стоит найти переменную OPT и дописать в нее флаг -Wall :
Иначе компилятор не будет ругаться на код, который скорее всего содержит ошибки — например, выражение if ( arr [ i ] = 1 ) , на месте которого почти наверняка должно быть if ( arr [ i ] == 1 ) .
В-третьих, если после этого шага сказать make , вы можете получить ошибки вроде следующих:
На момент написания этих строк в STM32CubeMX был баг, заключавшийся в том, что он несколько раз включал одни и те же файлы в список C_SOURCES . Нужно найти этот список в Makefile и убрать из него все повторы.
В-четвертых, Makefile умеет компилировать проект, но не содержит таргетов для прошивания платы, ее очистки, а также подключения по UART. Стоит дописать:
Наконец, из соображений скорее перфекционизма, чем острой надобности, я бы заменил все абсолютные пути на относительные, введя переменную вроде:
… а также прогнал бы Makefile через утилиту dos2unix.
На этом подготовку шаблона/каркаса можно считать завершенной! Чтобы не проделывать описанные выше шаги при создании каждого нового проекта, шаблон стоит сохранить где-нибудь в надежном месте. Дабы не приходилось при повторном использовании этого шаблона редактировать имя проекта, стоит также отредактировать значение переменной TARGET на какое-нибудь абстрактное main .
Пишем код!
Если вы откроете файл Src/main.c, то найдете в нем множество отметок вроде:
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
По задумке, код нужно вписывать между этими комментариями, чтобы при обновлении проекта в STM32CubeMX пользовательский код не был затерт. Лично я добавил вызов процедур init ( ) и loop ( ) в окрестностях основного цикла программы:
/* Infinite loop */
/* USER CODE BEGIN WHILE */
init ( ) ;
while ( 1 )
<
loop ( ) ;
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
>
/* USER CODE END 3 */
… а сами процедуры объявил перед процедурой main ( ) :
/* USER CODE BEGIN 0 */
void init ( void ) <
/* do nothing, yet */
>
void loop ( void ) <
/*
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
HAL_Delay(500);
*/
if ( HAL_GPIO_ReadPin ( GPIOC , GPIO_PIN_13 ) == GPIO_PIN_RESET ) <
HAL_GPIO_TogglePin ( GPIOA , GPIO_PIN_5 ) ;
>
/* USER CODE END 0 */
Управление микроконтроллером осуществляется через библиотеку под названием HAL, Hardware Abstraction Layer. Как видите, что касается обычного чтения кнопок и мигания светодиодами, здесь все не намного сложнее, чем в случае с той же Arduino.
Подключаем плату и говорим make flash . Если все было сделано правильно, нажатие синей кнопки на плате будет приводить к переключению зеленого светодиода. Также можно оставить в процедуре loop ( ) только код, который в приведенном выше отрывке я закомментировал, и тогда программа превратиться в обычный Blink.
Важно! Иногда микроконтроллер не запускается с новой прошивкой без нажатия черной кнопки Reset. По идее, обновление прошивки программатора с помощью утилиты STLinkUpgrade и использование утилиты st-flash с флагом —reset , как в нашем Makefile, исправляет эту проблему. Но так как она воспроизводится нерегулярно, полной уверенности нет.
Заключение
Как видите, все не так уж и сложно. Полученных знаний уже вполне достаточно, например, для того, чтобы написать программу, выводящую что-то на ЖК-экранчик или декодирующую сигнал от джойстика Sega. Можно даже пообщаться с какими-то сторонними модулями по SPI или I2C, хотя и не слишком эффективно, если вспомнить о наличии в микроконтроллере аппаратной поддержки этих протоколов. Однако эти темы, ровно как и ШИМ, чтение аналогового сигнала, работа с прерываниями или отладка кода, увы, выходят за рамки этой и без того уже довольно длинной статьи.
Кстати, к вопросу о выходящем за рамки. Хотя приведенных выше сведений будет вполне достаточно тем, кто пишет в Vim, как в данное время суток это делаю я, или каком-нибудь Sublime Text, кто-то из читателей может предпочитать работать в IDE. Настройка Eclipse для разработки под STM32 подробно расписана в книге Mastering STM32 за авторством Carmine Noviello. Если же вы предпочитаете CLion, его настройку подробно описал Илья Моторный в статье JetBrains CLion для микроконтроллеров.
Полную версию исходников к этому посту, как обычно, вы найдете на GitHub.
Источник