Бесплатных IDE для разработки микроконтроллеров не так уж много, а их интерфейс, основанный на Eclipse, вызывает у меня только страдания. В итоге разработка превращается в постоянное переключение с VSCode для редактирования кода в CubeIDE для его сборки и отладки.
Но почему бы не собрать все инструменты в VSCode в едином расширении, заодно подогнав автогенерацию проектов под стиль компании/личные предпочтения? Об и будет моя первая статья. Привет, Хабр!


В процессе поиска альтернативных решений была найдена система сборки Xmake, основанная на Lua. Сама по себе она уже поддерживает разработку на ARM, но я бы не назвал ее полноценной заменой CubeIDE из-за отсутствия удобного GUI, да и быстро запустить разработку на ней у меня не получилось. Но сама система меня завлекла и было принято решение создать поверх неё узкоспециализированное расширение, которое позволит через графический интерфейс настроить проект, скомпилировать и запустить отладку, но чтобы все это занимало минимум времени.

Так появилось расширение Xbuild MCU, предназначенное для разработки проектов на STM32.

Важное замечание: мой опыт в создании расширений для VSCode минимальный, а знакомство с Xmake не было углубленным. Расширение было проверено на нескольких проектах и показало свою работоспособность, но разработка все еще продолжается. Если у Вас будут указания на ошибки или предложения по улучшению, я с радостью приму их.

Основной функционал расширения: автогенерация структуры проекта, импорт системных файлов из CubeMX, настройка сборки через GCC/G++ и прошивка через JLink.

Внешний вид расширения
Внешний вид расширения

Основное меню, используемое для работы с проектом - Project Configuration. Для создания нового проекта достаточно открыть пустую папку через VSCode и зайти в настройки проекта. Система определит, что в текущей папке нет базового скрипта xmake.lua и предложит его сгенерировать автоматически.

Внешний вид
Генерация стартового скрипта
Генерация стартового скрипта
Уведомление об успешном завершении операции
Уведомление об успешном завершении операции

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

STM32 SDK Path - это путь до папки ARM GCC

JLINK_PATH = "c:/Programs/JLink_V872a/JLink.exe"
STM32_SDK = "c:/ST/STM32CubeIDE_1.19.0/STM32CubeIDE/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.14.3.rel1.win32_1.0.0.202510090749/tools"

Далее необходимо настроить все дефайны и файлы, включаемые в сборку. Это так же проще сделать через "Reset to STM32F103 Defaults", а затем изменить под нужные в текущем проекте.
Если Вы не знаете, что туда вписать, то значения для всех этих полей можно найти в через интерфейс CubeIDE.

Вероятнее всего, вы создавали стартовый код проекта через CubeMX. Тогда можно быстро импортировать его основные файлы, указав путь до проекта. Расширение скопирует startup файл, linker script и драйверы. Файлы с кодом по типу main.c не копируются: предполагается, что структура проекта может отличаться от стандартно сгенерированной CubeMX, и эти файлы либо вообще не переносятся, либо копируются отдельные блоки.

Расширение позволяет управлять Git-сабмодулями. Так, например, если в Вашей компании в каждом проекте используется определенный набор сабмодулей, их можно указать в User Settings VSCode, и тогда расширение позволит подключать/удалять их по нажатию одной кнопки. Подробнее о настройке можно прочитать в README репозитория.

Внешний вид
Пример конфигурации GIT-сабмодулей
Пример конфигурации GIT-сабмодулей
Внешний вид после редактирования конфигурации
Внешний вид после редактирования конфигурации

Для генерации начальной структуры проекта удобно использовать шаблоны. Расширение предполагает, что в корне проекта может находиться папка templates, в которой собраны шаблоны со структурой папок и дефайнами. Удобнее всего добавлять эту папку как сабмодуль, после генерации структуры ее можно будет безболезненно убрать из проекта.

Расширение автоматически генерирует .vscode/launch.json для работы с плагином Cortex-Debug.

Кроме того, расширение поддерживает два типа сборки: Debug и Release. Для каждого из них можно настроить степень оптимизации. После сборки проекта открывается окно, в котором показывается, какой процент Flash и Ram памяти микроконтроллера использован под программу (по аналогии с ESP-IDF).

Внешний вид подпункта Optimization
Выбор оптимизации
Выбор оптимизации

В раскрывающемся списке "Available Optimization Levels" есть краткое описание доступных вариантов уровня оптимизации.

Если в системе установлен Doxygen, то доступна генерация документации через соответствующий пункт меню.ma


Данное расширение создавалось под конкретные входные условия, из-за чего его нельзя назвать по-настоящему универсальным, но мне кажется, оно может стать достойной заменой CubeIDE, ориентируясь больше на лаконичность и удобство интерфейса. А благодаря поддержке шаблонов и простому редактированию Lua скрипта его можно подогнать под конкретные требования Вашей команды или личные предпочтения. Прошу относиться к этому проекту как к демонстрации жизнеспособности идеи. Работа над дальнейшим улучшением функционала и исправлением ошибок будет продолжаться. Если Вы нашли критические ошибки или у Вас есть предложения, как сделать расширение более гибким, пожалуйста, поделитесь этой информацией.