Vs code stm32 windows

A_D Electronics

development and research

Visual Studio Code — написание и отладка прошивок для ARM Cortex-M

Давно хотел это опробовать, да руки не доходили. Наконец-то освободился и решил это освоить — превращение Visual Studio Code в IDE для написания и отладки прошивок под микроконтроллеры, и как первые ласточки опробованы Wi-Fi SoC RTL8195AM и Cortex-M4 STM32F407VGT6. Пример-описание в статье будет для STM32F407VGT6.

Подготовка Visual Studio Code

Для примера используется Visual Studio Code v1.33.1, на старых версиях могут быть небольшие отличия в плане конфигурационных json файлов.

Предполагается, что у вас уже установлена или есть портативная версия Visual Studio Code. Для работы с C\C++ и отладчиком Cortex-M нам потребуются следующие расширения:

Установить их можно прямо в VS Code, поиском по имени в окне расширений:

Настраивать особо там ничего не требуется.

Установка тулчейна, драйверов отладчика

Ставим драйвера на J-Link — тут совсем ничего сложного, скачать их можно тут — J-Link Software and Documentation Pack.

Далее нам потребуются инструменты, которыми мы будем собирать и заливать прошивку. Cкачиваем официальный тулчейн GNU Arm Embedded Toolchain версии x32 или лучше GNU MCU Eclipse ARM Embedded GCC arm-none-eabi-gcc-xpack x64 версию, т. к. в официальной последней х32 я столкнулся с багом objcopy.exe в GNU Arm Embedded Toolchain, который выглядит во время сборки проекта вот так (более подробно по ссылке выше):

Также скачиваем GNU MCU Eclipse Windows Build Tools — это инструменты для сборки, Windows порт. Далее распаковываем тулчейн и инструменты в 2 разные папки, без кириллицы в пути (в идеале без длинного пути и без пробелов). Теперь прописываем их в пользовательский Path (можно и в глобальный):

У меня это выглядит вот так:

Как можно видеть выше, у меня прописаны пути аж к Visual Studio тулчейну\инструментам (чтобы не делать две копии на ПК), и я могу тем самым делать проекты как в большой и могучей Visual Studio, так и в сторонних приложениях (как мы сейчас разбираем, Visual Studio Code). Да, GNU MCU Eclipse ARM Embedded GCC я просто распаковал взамен стокового (очень старого) тулчейна, устанавливаемого с Visual Studio.

Пути, которые я добавил (у вас будут явно другие, просто пример, до каких папок необходимо указывать):

Тестовый проект

В качестве тестового проекта возьмем любимый всеми STM32CubeMX и сгенерируем в нём для старючей STM32F4DISCOVERY (просто она есть под рукой) минимальный проект, чтобы не собирать исходники и не писать самому makefile (предполагается, что вы уже знаете уже, как это делается). В проекте задействуем кнопку и светодиоды:

Не забываем выбрать тип проекта/IDE — Makefile:

Подготовка проекта и компиляция

Теперь осталось немного подготовить проект к работе в VS Code. Я не буду подробно описывать, что и как, пример проекта, уже готового к работе в VS Code, лежит здесь — STM32F407_VSC_Example.

Вкратце же изменения и дополнения следующие:

  • В корне проекта появилась папка JLink (название и расположение может быть любое другое, не принципиально) со скриптами для записи, чтения и затирания прошивки, а также тут лежит SVD-файл, описывающий всю периферию в микроконтроллере;
  • В корне проекта появилась папка .vscode (название и расположение важны!), тут хранятся все настройки и задачи для VS Code, минимальное необходимое содержание следующее:
    • Файл c_cpp_properties.json — тут определяются директории, которые будет сканировать IntelliSense, путь к компилятору для него, а также все объявления в проекте (дублируются из makefile);
    • Файл launch.json — это файл конфигурации для отладчика, здесь описывается, откуда и чего брать и как подключаться;
    • Файл settings.json — это дополнительный файл конфигурации для отладчика, здесь прописываем полный путь к GDB серверу (без полного пути отладка не запускалась, какой-то баг в расширении);
    • Файл tasks.json — описание всех задач, компиляция, прошивка, сброс и, как дополнительный пример, запуск GDB-сервера дополнительным окном.

Все объявленные задачи можно посмотреть здесь:

Удобно, кстати, назначить задачи на горячие клавиши.

Приводить здесь код из файлов не вижу смысла (и еще wordpress часто коробит код в вставках, уже надоело бороться с этими приколами…), поэтому переходите по ссылкам и изучайте, копируйте, что нужно. 🙂

Читайте также:  Ssh in windows machine

Да, разве что небольшой нюанс касательно makefile, который генерирует STM32CubeMX. Если его не править, то при сборке в терминал будет выводиться только следующее:

А во время сборки вообще ничего не выводится, т. е. непонятно, что в данный момент делается и какой файл компилируется. Подправить это легко, заходим в makefile и добавляем 2 строчки:

Строки 162 и 166, результат:

Vs code stm32 windows

Примеры в этом репозитории являются не доработанными и устаревшими. Поддерживатся репозиторий больше не будет, рекомендую использовать новую систему сборки https://github.com/MuratovAS/VScode_Docker_Stm32

История о том, как собрать вкусную среду для ARM

VSCode + STM32Cube + GCC [+ СPP + CMake] [+ Rust] = IDE

В один прекрасный день, появилась необходимость в гибкой и функциональной среде разработки, под stm32. Взор упал на молодой продукт от ST, под названием STM32CubeIDE. Он действительно хорош. Основное преимущества: работа из коробки, широкие функциональные возможности. К большому сожалению она базируется на Eclipse, хотя, многие назовут это плюсом. Недостатки: очень прожорливая, медленная, интуитивно не понятная, устаревший дизайн. Если для вас это не критично и вы обойтись сложностей, дальше можно не читать 🙂 Мой взор упал на VSCode, он быстрый, хорошо поддерживается, имеет великолепную базу дополнений, ну и конечно же бесплатный. Так же существует тормозной atom, платный clion. Не будем тянуть, приступим к делу. Стоит отметить, все происходило на Ubuntu 20.04 c использованием китайского ST-Link2 (модифицированный) и Bluepill (stm32f10cc8t6)

Про доработка ST-Link2 можно почитать здесь: https://habr.com/ru/post/402927/

Подготовка рабочего пространства

Жизненно необходимые пакеты, без них будет сложно. Необходимы для сборки и менеджмента проектов.

ToolChain — набор созданных в рамках проекта пакетов программ, необходимых для компиляции и генерации выполняемого кода из исходных текстов.

Качаем с официального сайта, в репозитории (Ubuntu) очень обрезанная версия, не годится под наши нужды.

Необходимо распаковать в каталог /opt/gcc-arm/ , с помощью Midnight Commander (mc), не забываем про root права.

Для удобства использования, пропишем в PATH, это позволит запускать приложения без полного пути

Добавляем в конец файла такую строку

Проверим работоспособность компилятора, если все ок, продолжаем дальше

Проверяем работоспособность пакета отладки

В случае ошибки, устанавливаем дополнительные библиотеки

Установим систему отладки

Проверим корректность установки, проблем обычно не возникает с этим пакетом.

Установим пакеты для работы с STLINK

Не ленимся проверить работоспособность. В последствии, сложно будет найти не функционирующий узел нашей системы.

Если пакет установлен, можно подключить какой нибудь контроллер через ST-Link, и попытаться получить информацию

Мало ли пригодится, с помощью этой команды можно сразу прошить/считать контроллер из/в Bin файл

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

Установка приложений STMicroelectronics

Как известно, большинство продуктов от ST для работы требуют JAVA. В мире linux существует как минимум 2 реализации, open java и oracle java. В репозитории ubuntu можно найти только первый вариант. Второй, проприетарный вариант придется устанавливать вручную. Если планируете использовать только СubeMX достаточно открытой реализации, а вот для CubeProg требуется уже именно Oracle версия. Так что тут выбор за вами, я установил oracle версию.

Установка open версии, очень простая

Установка oracle java

Для начало её нужно скачать. например с оф. сайта https://www.java.com/ru/

Затем распакуем архив в /usr/lib/jvm с помощью все то го же mc и root прав.

Теперь нам необходимо создать символьные ссылки, на установленную версию java

Зададим переменную JAVA_HOME, которую используют некоторые приложения. Для этого добавляем в файл /etc/environment следующую строку

Сохраняем его и применяем изменение, а так же проверим работоспособность

Наконец то, можем скачать и установить STM32cubeMX. Он необходим что бы генерировать проект. В принципе, без него сложно представить разработку. Очень удобный инструмент.

Распаковываем и запускаем через терминал (не удивляйтесь, файл exe).

Должны увидеть процесс установки. Следуем инструкциям. Я устанавливаю в директорию

Установка и настройка IDE

Настало время….. установить среду разработки, а точнее мощный текстовый редактор

Для работы потребуется некоторые расширения. Я по рекомендую такой набор, идеально подходящих для embedded. Подробнее, зачем они нужны, можно почить в описание 🙂

Самое время создать проект

С этого момента наши пути могут разойтись. Предлога 2 способа, “Простой проект“ и “Серьезный проект“. Стоит отметить, проекты в этом репозиторие сугубо демонстрационные, некоторый код в них абсурден.

Читайте также:  Скрытая схема электропитания windows 10

Отлично подходит для любительских проектов, с одним контроллером, без собственного bootloader’а. Основное преимущество, это быстрое и простое разворачивания проекта. Нет необходимости в ручной коррекции конфигурационных файлов, весь процесс автоматизирован. Из недостатков: весьма сложно что то изменить в структуре проекта, совершенно не гибкая система. Проект может быть написан только на GCC.

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

В STM32cubeMX необходимо создать проект. Указав в настройках makefile в качестве toolchain.

Хороший человек, damogranlabs написал Script, позволяющий в пару кликов преобразовывать проект cubeMX в проект для VSCode. Это очень упрощает дальнейшую работу. Клонируем его репозиторий.

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

Открыть каталог проекта созданный CubeMX, в VSCode. Сохраняем WorkSpace (подпункт меню Файл) в корень каталога.

Осталось скопировать папку ideScripts (из VS-Code-STM32-IDE) в корень нашего проекта.

Для окончательной настройки, запускаем Script нашего товарища. Лучше это сделать прямо в IDE, через встроенный терминал (запустить его можно через соответствующую кнопку верхнего меню). Далее следуем инструкции.

Необходимо вписать все пути, которые он требует (подробнее это описано в README автора). P.S. У меня не получилось использовать конфигурационные файлы, идущие вместе с openocd, скрипт их просто не видел. Необходимые файлы я нашел на просторах интернета. Рекомендую поместить их сразу в каталок .vscode проекта. Вам точно потребуются файлы stlink-v2.cfg, stm32f1xx.cfg, STM32F103xx.svd, для них лучше указать относительный путь (пример ./.vscode/stlink-v2.cfg).

В целом, проект готов. Можно писать и отлаживать код.

Пример проекта расположен в каталоге stm32f10x_gcc

Тут гораздо все интереснее. Отлично подходит для сложных много-контрроторных систем, но за это приходится платить ручной конфигурация системы сборки. За то, получаем очень гибкую систему. Преимущество в рамках одного проекта можно компилировать код сразу на несколько разных контроллеров. Так же, можно в разных проектах использовать общую кодовую базу. Можно использовать несколько разных компиляторов, следственно и языков, к примеру CPP и GCC. Очень удобный выбор типа сборки, Debug или Release. Все что вы сможете придумать, скорее всего можно реализовать в рамках такой системы. Недостатком является достаточно сложная настройка, по cmake существуют даже книги 🙂

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

  • Директория Build монтируется в RAM, при старте VScode, что позволяет ускорить сборку и снизить нагрузку на накопитель (hdd/ssd). Build уничтожается при от монтирование или перезагрузки ПК
  • Реализована SWV (SWO trace) в рамках IDE. Это позволяет выводить информацию с МК через printf.
  • Проект сразу разделен на APP (основная программа) и BOOT (кастомный загрузчик)
  • Множество полезных утилит запускаемых через “задачи” в VScode

Рассмотрим основные элементы интерфейса

  1. Выпадающее меню выбора сборки, здесь указываем с каким под проектом работаем в текущий момент. В примере есть возможность выбора APP или BOOT, Debug или Release
  2. Меню выбора ToolChain, здесь мы указываем какой набор компиляторов используем в текущий момент.
  3. Основная кнопка, запуск сборки цели
  4. Выбор цели сборки, практически всегда можно использовать [all]. С помощью этого пункта можно скомпилировать конкретную часть под проекта, например драйвер или библиотеку.
  5. Самые бесполезные кнопки, у меня так и не вышло заставить их работать с embedded проектом. В будущем возможно найдется способ починить эти кнопки.
  6. Выбор цели отладки, тут у нас нет выбора. Практически всегда она автоматически определяет elf файл который мы только что компилировали. иногда приходится однократно клацнуть на нее.

  1. Встроенный проводник, с его помощью можно работать непосредственно с фалами
  2. В какой то степени то же проводник, но уже по конкретному проекту. Здесь мы можем отчистить сбоку выбрать цели
  3. Git менеджер, показывает список изменений с предыдущего коммита
  4. Отладка. Именно через это меню её необходимо запускать, работает в автоматическом режиме через openocd
  5. Менеджер расширений, с ним познакомились еще в процессе установки IDE

Немного о структуре проекта

  • App — тут хранится код основной прошивки, по совместительству cubemx проект
    • App.cmake — информация для системы сборки как собирать данный под проект
  • Boot — тут хранится код кастомного загрузчика, по совместительству cubemx проект
    • Boot.cmake — информация для системы сборки как собирать данный под проект
  • build — каталог с файлами жизнедеятельности сборки, тут хранятся собранные elf, bin, т.д.
  • cmake — для системы сборки
    • CompilerSelectro.cmake — список компиляторов, меня его нет необходимости
    • stm32f103.cmake — параметры сборки исходников для конкретного МК, именно здесь указывается архитектура ядра, определяется режим работы FPU
  • openocd — для системы отладки
    • STLink-SWD.cfg — настройки отладчика, именно в нем указывается путь к .cfg для вашего МК и программатора
    • STLink-SWV.cfg — настройки SWV режима
    • STM32F103xx.svd — файл описывающий регистры конкретного МК, этот файл указан в launch.json
    • tools/AutoSWV.sh — скрипт для удобного вывода сообщений из SWO, так же в этой директории расположены необходимые утилиты для паркинга потока.
  • .vscode — конфигурации IDE
    • c_cpp_properties.json — настройки intelliSense. Тут необходимо прописать пути к всем header файлам проекта, а так же defines для вашего МК
    • cmake-kits.json — прописывает пути до компиляторов
    • launch.json — описывает то, как запускать отладку. тут указать путь до .svd файла
    • tasks.json — весьма объемный файл, хранит в себе все пользовательские задачи для IDE. Без необходимости не трогаем.
  • CMakeLists.txt — основной файл системы сборки, тут указывается имя проекта, используемые языки и контроллер
  • cmake-variants.json — описывает все разновидность под проектов.
  • STM32F103C8Tx_FLASH.ld.in — файл скопированный из cube проекта и модифицирован. добавляется на конце .in, если файл будет пересоздан для каждого под проекта. в файле присутствуют переменные $<>
  • .gitignore — список того что не требуется в контроле git системой
Читайте также:  Завершает сеанс пользователя windows

Пример проекта расположен в каталоге stm32f10x_cpp

Почему бы не попробовать Rust ?!

Уже было много разговоров о преимуществах этого языка. О безопасности этого языка, его быстродействие сравнимой с CPP. Пока что он, относительно, молод. В первом приближение можно сказать, у этого языка есть потенциал, это то, что скорее всего, заменить C/C++ в будущем. Я немного постарался, и написать Bash скрипт. Который позволяющий в два клика собирать проект, для VSCode. Хотелось бы сразу сказать спасибо smallnibbler за хорошую статью, на основе которой он был и сделан.

Важный момент. HAL на Rust для разных семейств МК, разный. Пример кода, создаваемый скриптом, может у вас не заработать.

Установим пакеты для компиляции новомодного языка

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

Устанавливаем полезное расширение, позволяющие преобразовывать elf в bin, подходящей к любому программатору.

Не забываем в VS Code установить расширение Rust (rls).

Создание Rust проекта

Тут все горазд проще, чем с C/C++.

Клонируем репозиторий в свою рабочую папку.

В случае Stm32f103, имеется уже собранный проект, но куда интереснее собрать его самому.

SVD файл можно взять в .vscode/STM32F103xx.svd Каталог .vscode может быть скрыт в вашем файловом менеджере, включите “видимость скрытых файлов”.

Из репозитория нам понадобится файл ProjectGenerator_Rust.sh, это и есть генератор. Его и SVD необходимо переместить в каталог ваших экспериментов. В процессе он создаст новую папку, для конкретного проекта.

Выполняем и следуем инструкции. В скобках приведены примеры. Отличие от скрипта для C в том, что нужно использовать конфигурационные файлы от openocd. SVD файла придется найти самому и поместить в одну папку с ProjectGenerator_Rust. Это очень важно.

Пример проекта расположен в каталоге stm32f10x_rust

Немного о USB-COM

в Linux имеется проблема с подключением USB-COM переходников, по причине серьезной системе прав, но это можно исправить.

Сначала нужно узнать VendorID и ProductID нашего переходника. Это можно сделать такой командой:

В результате получим что то подобное:

Запомните значения после аббревиатуры ID, они нам еще пригодятся.

Теперь создаем файл в /etc/udev/rules.d/

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

Теперь добавляем в открывшемся окне содержимое (изменяем idVendor и idProduct, эти значения мы получили в предыдущем пункте):

Этой записью мы устанавливаем на USB устройство 0403:6001 права на запись и чтение, обычным пользователям. А также говорим udev создавать символьную ссылку на него с именем ft232_номер.

Теперь проверяем права на наше устройство.

Как видим нам удалось достичь желаемого результата. Теперь можно обращаться к этому порту без Root прав из любого удобного приложения. Неплохо зарекомендовали себя PuTTY и Termite

Спасибо. да, это конец ^ _ ^

About

История о том, как собрать вкусную среду для ARM. На основе VSCode + STM32Cube + GCC [+ СPP + CMake] [+ Rust] = IDE

Оцените статью