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 часто коробит код в вставках, уже надоело бороться с этими приколами…), поэтому переходите по ссылкам и изучайте, копируйте, что нужно. 🙂
Да, разве что небольшой нюанс касательно 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 способа, “Простой проект“ и “Серьезный проект“. Стоит отметить, проекты в этом репозиторие сугубо демонстрационные, некоторый код в них абсурден.
Отлично подходит для любительских проектов, с одним контроллером, без собственного 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
Рассмотрим основные элементы интерфейса
- Выпадающее меню выбора сборки, здесь указываем с каким под проектом работаем в текущий момент. В примере есть возможность выбора APP или BOOT, Debug или Release
- Меню выбора ToolChain, здесь мы указываем какой набор компиляторов используем в текущий момент.
- Основная кнопка, запуск сборки цели
- Выбор цели сборки, практически всегда можно использовать [all]. С помощью этого пункта можно скомпилировать конкретную часть под проекта, например драйвер или библиотеку.
- Самые бесполезные кнопки, у меня так и не вышло заставить их работать с embedded проектом. В будущем возможно найдется способ починить эти кнопки.
- Выбор цели отладки, тут у нас нет выбора. Практически всегда она автоматически определяет elf файл который мы только что компилировали. иногда приходится однократно клацнуть на нее.
- Встроенный проводник, с его помощью можно работать непосредственно с фалами
- В какой то степени то же проводник, но уже по конкретному проекту. Здесь мы можем отчистить сбоку выбрать цели
- Git менеджер, показывает список изменений с предыдущего коммита
- Отладка. Именно через это меню её необходимо запускать, работает в автоматическом режиме через openocd
- Менеджер расширений, с ним познакомились еще в процессе установки 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 системой
Пример проекта расположен в каталоге 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