STM32. Порівняння IDE для розробників-початківців

Привіт, мене звати Євгеній. Спочатку трохи про себе. Закінчив НАУ в Києві за спеціальністю інженер-електрик авіаційних систем. Після 10 років роботи з Джавою і клауд-технологіями вирішив знову взятись за старе — за електроніку. Почав вивчати мікроконтролери й згадувати схемотехніку з університетського курсу. В попередній статті ми розглядали, що потрібно, щоб почати працювати з мікроконтролерами STM32. Ця стаття буде одночасно і продовженням, і розширенням попередньої і буде зосереджена лише на IDE.

Давайте порівняємо кілька популярних IDE для розробки під STM32: Arduino, VS Code + PlatformIO, STM32Cube. Звичайно, писати для STM32 можна не лише в цих IDE, але ці найпопулярніші, з якими початківці стикаються на початку вивчення STM32. Тому важливо зрозуміти особливості кожної з них, щоб вхід в STM32 був плавний і зрозумілий.

Arduino IDE

Arduino — це універсальна платформа для розробки під мікроконтролери різних виробників. Тому є велика ймовірність, що ви уже працювали з цим середовищем розробки. Ця IDE добре підходить для класичних плат розробки Arduino (Mega, Uno, Nano і так далі) та ESP32. Для того, щоб працювати з мікроконтролерами (МК) в цьому середовищі, потрібно мати встановлене Arduino «ядро» для вашого МК. Для класичних Arduino-плат не потрібно цього робити на відміну від ESP32 чи STM32 (приклад буде нижче).

Також Arduino IDE має вбудований каталог бібліотек для роботи з різними модулями: наприклад, дисплеї, датчики, адресні світлодіоди, що ще більше знижує поріг входу в Embedded-розробку. Також часто ці бібліотеки постачаються з уже готовими прикладами використання цієї бібліотеки в різних варіаціях. Але, з власного досвіду, вони добре оптимізовані і працюють лише під класичні Ардуїно або ESP32 — тобто під найбільш поширені для хобістів платформи. Але чого можна точно очікувати від Arduino для STM32 — це те, що будуть працювати базові функції з Arduino ядра: digitalRead, digitalWrite, tone, Serial.println і так далі.

Поглянемо, як налаштувати Arduino IDE для розробки під STM32. Для початку потрібно встановити Arduino ядро для STM32: заходимо в Налаштування Arduino IDE і в поле як на прикладі нижче вставляємо наступне посилання:

https://github.com/stm32duino/BoardManagerFiles/raw/main/package_stmicroelectronics_index.json

Потім в Менеджері плат шукаємо ядро по ключовому слову «stm32» та встановлюємо його. Нарешті в меню Інструменти обираємо відповідні налаштування. Я використовую STM32G030F6P6 МК разом з ST-Link програматором (SWD), тому у моєму випадку налаштування виглядають як на скріні нижче.


Щоб Arduino IDE могла завантажувати написану програму на МК, потрібно встановити STM32CubeProgrammer з офіційного сайту STMicroelectronics: www.st.com/...​-tools/stm32cubeprog.html і перезавантажити ПК.

Давайте напишемо простий блінк. На моїй борді світлодіод підключений до піна PA4, тому програма (скетч) виглядає таким чином.

void setup() {
  pinMode(PA4, OUTPUT);
}

void loop() {
  digitalWrite(PA4, 1);
  delay(100);
  digitalWrite(PA4, 0);
  delay(100);
}

Результат після успішної прошивки виглядає таким чином:

Попри дуже простий код скетчу, розмір програми у флеш-пам’яті МК займає майже половину з наявних 32КБ у моєму МК. 32КБ це вже не так і мало за сучасними мірками, і ось такий результат маємо. Мав випадок, коли використав кілька стандартних периферій, мав 100+ стрічок коду в скетчі й отримав помилку, що в МК недостатньо пам’яті для скетчу. Тобто ми не можемо контролювати, що саме Arduino компілює під капотом чи з якими параметрами.

Хоча варто зауважити, що для класичних Arduino ядро написане ефективніше, що і не дивно. Але це ще і тому, що AVR архітектура простіша за Cortex-M, тому має простіший код ініціалізації. Зате ця IDE чудово підходить для швидких POC (доказ концепції — щось швидко перевірити) чи для хобі.

Занадто велика спрощеність цієї IDE одночасно являється і перевагою і недоліком. Мінімалістичний UI не дає зручно працювати з кількома файлами коду, а спонукає тримати все в одному скетчі. До недоліків можна також віднести ще відносно сиру функцію Дебаг (Налагоджування). В режимі налагоджування поки підтримується лише невеликий набір Nucleo бордів. Тобто рандомний STM32 МК на своїй борді просто так не подебажеш. Ще з недоліків можна виділити наступні:

  • Помітна кількість багів цієї IDE. Баги є в будь-якому софті, але коли їх не критична маса чи вони незначні, то користувач цього може ніколи і не помітити. Тут, на жаль — не так.
  • Тривала перша компіляція під STM32. Схоже, що під капотом дійсно компілюється все що треба і не треба.
  • Власне неможливість подивитись прямо в IDE вихідний код того, що написано в Ардуїно ядрі для STM32: наприклад, код налаштування тактування МК.
  • Деякі бібліотеки з коробки не працюють для STM32.

Якщо підсумувати, то Arduino IDE — чудово підходить для класичних Arduino чи ESP32 і відчутно гірше для STM32. Тобто на перших етапах — згодиться, але далі потрібно переходити на щось інше.

Visual Studio Code + PlatformIO

VS Code саме і є та IDE, яка дозволяє отримати відчутно покращений досвід при роботі з STM32. По-перше, VS Code сам по собі є зручним і швидким середовищем розробки. По-друге, разом зі встановленими плагінами дозволяє писати багатьма мовами і під різні платформи, STM32 — в тому числі. Плагін, який потрібно довстановити, називається PlatformIO (український проєкт). Він дозволяє писати під багато різних МК і на різних фреймворках. Наприклад, для STM32 можна обрати один із трьох фреймворків: Arduino, HAL, CMSIS. Для початку розглянемо Arduino-фреймворк. За допомогою нього можна писати той самий Ардуїно код, але набагато зручніше, де вже немає вище описаних недоліків Arduino IDE:

  • можна легко дебажити будь-який STM32 МК;
  • можна легко переходити в код Arduino ядра і читати його (привіт Arduino IDE);
  • компіляція як ніби трохи швидша (по відчуттях);
  • відсутність багів (принаймні, я не стикався).


Наступні 2 фреймворки: HAL та CMSIS. Відрізняються між собою рівнем абстракції у роботі з регістрами МК. CMSIS — найнижчий рівень абстракції, якщо просто дефайни регістрів взагалі можна назвати абстракцією. HAL — вищий рівень абстракції над CMSIS, який додатково описує певну логіку при роботі з регістрами. Тобто уже несе код, який нам би довелось писати самостійно, щоб виконати якісь базові речі з МК. Тобто можна сказати, що Arduino і HAL — високорівневі фреймворки, а CMSIS — низькорівневий. Давайте тепер розглянемо, наприклад, HAL фреймворк, код виглядає ось так:

Тут в коді ми ініціалізуємо сам фреймворк через HAL_Init (всього лиш запускає системний таймер з перериваннями в 1мс), далі в SystemClock_Config налаштовуємо частоту роботи ядра та в GPIO_PA4_Init ініціалізуємо пін PA4 для роботи в режимі на вихід. Далі в циклі while нарешті вмикаємо/вимикаємо світлодіод.

Як можна бачити, складність простого блінку значно виросла. Але це лише тому, що багато речей тепер доводиться робити самому, не покладаючись на Arduino фреймворк. Він насправді робив все те саме, але під капотом (використовуючи HAL), що спрощувало написання коду. Також зверніть увагу на використання флеш-пам’яті МК внизу скриншоту. Цього разу маємо той самий блінк, але в 1.5КБ замість 13КБ, різниця майже на порядок. Тобто залишається ще достатньо пам’яті, щоб, наприклад, зберігати картинки для виведення на дисплей чи розвертання FreeRTOS.

CMSIS фреймворк розглядати не будемо, оскільки там буде ще більше коду, який буде напряму взаємодіяти з регістрами пам’яті. Для того, щоб працювати з цим фреймворком потрібно або вже вміти і знати багато чого, або вміти читати референс мануал (Reference Manual) до Вашого МК. В референс мануалі буде покроково описано як можна, наприклад, ініціалізувати пін чи будь-яку іншу периферію, часто навіть зі зручними намальованими діаграмами (flow chart). Якщо все-таки Вам потрібен приклад роботи з CMSIS та роботи з мануалом, то дайте знати в коментарях, можливо напишу окрему статтю на цю тему.

STM32Cube IDE

STM32Cube — це офіційне середовище розробки від компанії STMicroelectronics основане на Eclipse IDE. З цього автоматично випливають багато недоліків:

  • застарілий і незручний інтерфейс;
  • повільна робота навіть на потужних машинах;
  • баги;
  • відсутність повноцінного масштабування інтерфейсу і як наслідок — складність роздивитися іконки на моніторах більше 1080p.

Незважаючи на описані вище недоліки, є сценарії, коли ця IDE на жаль є безальтернативною. А саме — коли ви тільки знайомитесь з новим МК (наприклад, з нової серії) або взагалі зі своїм першим STM32 МК, і ще не знайомі з нюансами ініціалізації МК, його частот і периферій. Саме в цьому випадку STM32Cube дозволяє мишкою в графічному інтерфейсі налаштувати все це, і код ініціалізацій буде згенерований/написаний за вас. Тобто, якщо попередні IDE — Arduino та VS Code (з Arduino фреймворком) — взагалі не дають можливості це налаштовувати під ваші потреби і просто пропонують дефолтні налаштування, то у випадку STM32Cube це можна зробити і причому відносно не складно — просто мишкою.

Особливістю такої автогенерації коду є те, що ваш код потрібно писати в спеціальних секціях — помічених спеціальними коментарями. Це потрібно для того, щоб не було колізій між написаним вами кодом і згенерованим IDE кодом (тому що знаходяться в тому самому файлі). Інакше при наступній генерації коду (наприклад, ініціалізації I2C) ваш код буде видалено, якщо він знаходився поза межами секцій, де дозволено писати код. Приклад блінку та цих спеціальних секцій можна побачити на скріні нижче.


Тобто STM32Cube має такі переваги:

  • спрощує ініціалізацію МК і його периферій;
  • офіційна від STMicroelectronics;
  • можна використовувати як зручний каталог продукції STMicroelectronics з пошуком, фільтрами, документацією;
  • може згенерувати універсальний проєкт з CMake.

Висновки

Давайте складемо порівняльну таблицю цих IDE на основі всього вище сказаного:

Характеристика

Arduino

VS Code + PIO

STM32Cube

Автогенерація коду

Немає

Немає

Є

Інтерфейс

Спрощений

Повноцінний

«Який жах! А що — не жах?» © Стерненко

Швидкодія

Достатня

Висока

Низька

Баги

Присутні

Не помітив

Присутні

Фішки

Найлегший запуск

блінку на STM32

Просто зручна і швидка

IDE, в якій можна писати

і інші Ваші проєкти

Каталог МК STM32;

документація

На жаль, для початківця немає універсальної IDE, яка б мала лише переваги всіх трьох IDE і не мала б їх недоліків. Тому я поділюсь власним досвідом: після покупки свого першого МК STM32 запустіть пару скетчів в уже знайомій Вам Arduino IDE, щоб просто пересвідчитись, що МК працює і Вам не дістався брак. Після цього переходьте в STM32Cube і вивчайте HAL. Коли будете більш-менш впевнено почувати себе з HAL, можна перейти до будь-якої іншої IDE, яка більше подобається, наприклад, VS Code (чи neovim).

Причому можна продовжувати користуватися автогенерацією коду з STM32Cube, просто копіюючи цей згенерований код шматками в іншу IDE за потреби. Якщо ж не плануєте вивчати STM32 глибоко і Вам достатньо написання Arduino коду, то після Arduino IDE можете перейти в VS Code, де можна писати той самий Arduino код, але набагато зручніше.

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

👍ПодобаєтьсяСподобалось8
До обраногоВ обраному3
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Я для хоббі використовую CLion для написання коду а для дебагу — Segger Ozone, SystemView.

Зручність Segger JLink в тому що програмування, дебаг в 1 середовищі зручному і підтримується багато платформ, особисто я юзав з — ST, Microchip, Nordic.

Для кодогенерації звісно Cube під stm, сам ноутбук — mac на silicon.

Из всех перечисленных IDE ни одна не зашла, если честно.

VSCode вроде неплох, но у меня от него вентиляторы вращаться начинают. А я кодить в тишине люблю.

Еще CLion достойный в принципе, на нем поддержка STM тоже есть, но — нет, не мое.

Моя опция — SublimeText (или любой другой текстовый редактор) + make/cmake.
Сгенерировал первоначальный код в STM32CubeMx, отрефакторил, написал make/cmake и горя не знаю. :)
В плане скорости — огонь, по багам в саблайме — критичных нет, лишней нагрузки на проц от ненужных свистоперделок — тоже нет.
Не хватает брейкпоинтов всяких, и глубокого дебага, но это решается JTAG’ом и запуском CubeIDE раз в столетку. Для всего остального есть логи и printf. Можно все в SWD перенаправить, и в принципе читать логи и принты не вынимая программатор :)

якось не зрозумів порівняння STM32Cube та VSCode. Я наприклад в STM32Cube налаштував під Nucleo-F767ZI таймер і щоб таймер мигав через Output Compare Mode світлодіодом. Те що stm32cube нагенерував в main.c файлі мені зрозуміло. Але генеруються і інші допоміжні файли stm32cube-ом. VSCode таке може робити? Чи ці файли теж руками писати? Я це на практиці працює? Наприклад junior-middle embedded developer починає проект на чипі stm32 з яким до того не працював. Відразу відкриває VSCode чи vim і починає все писати вручну включаючи всі крім main.c тому що всякі графічні IDE stm32cube це фу-фу-фу?

Vscode не генерує код (дивиться порівняльну таблицю в кінці статті).
Джун має розуміти принцип ініціалізації певної периферії як на мене. Розуміючи принцип не важко написати код ініціалізації для будь якого МК. (Гугл/чат будуть в допомогу).

Arduino — якщо все що треба підтримується з коробки та запустилось з першого разу то мабуть можна щось написати. Вскод — у порівнянні з нормальним IDE має настільки убогий інтерфес що користуватись ним можна тільки при відсутності нормальних IDE для того чим користуєшся (я про щось що виходить за рамки написав — запустив, а наприклад за нормальний дебаг). Тому єдиний нормальний варіант для початківця це одразу брати CubeIDE з HAL. Щоб поморгати світлодіодом купа прикладів з покроковими інструкціями куди та для чого тиркати.

Вскод — у порівнянні з нормальним IDE має настільки убогий інтерфес

WAT?

Просто подивись як виглядає калічний vscode під час дебага STM32 і як вигляє куб. vscode можна буде нормально користуватись коди він буде підтримувати нормальний UI для плагінів як екліпс це робить для своїх плагінів.

Так і запишем, «калічний під час дебага». Питань нема. Куб рулез.

Але ж сучасна ардуйня іде, це той самий VS Code з допами, тільки не майкрософтовський, а в реалізації від екліпс фоундейшн.

1.Слово Arduino не должно употреблятся в сколько-нибудь профессиональном разговоре.
2. IDE это трёхколёсный велосипед и уходящая натура нулевых. Код пишется в любом текстовом редакторе.

незважаючи що ide термінологія вже застаріла, кодування нп в vim з lsp підтримкою значно зручніш ніж без неї

lsp підтримкою

Высосаное из пальца решение проблемы, которая давно уже решена.
И в целом: чем больше опыт — тем меньше требуется инструментов. И это не только программирования касается.

«решение проблемы, которая давно уже решена» — проблеми використання тулз нема як такової, це персональний вибір, відповідно і немає ніякого відношення до «решена» проблеми якої не існує.
А тому хто код пише в vim (нп мені) — зручно.

Слово Arduino не должно употреблятся в сколько-нибудь профессиональном разговоре

А чого ні? Воно закриває більшість рядових задач, ще й просте для освоєння. Я б порівняв Ардуїну з L-39, наче то і літаюча парта, але ніхто не заважає присрати до неї 20 мм автоматичну гармату, і щось штурмануть.

Не, ну для домашних самоделок — ок.
Но прививать этот стиль создателю того, что будет продаваться за деньги — только портить его.
P.S. Мне европейский коллега рассказывал, как «дети Ардуино» вытянули I2C на 20 метров для управления переферией, а потом хлопали глазами не понимая, почему оно не работает.

Якби вони вчились на STM або есп32 вони б так само хлопали очима. А так, я не бачу нічого поганого, щоб сунути ардуїну в прод. Дешево і сердито, ти ж не атомною станцією управляєш.

Лично я развел десятки плат под атмеловское железо за десять лет до того, как появилось слово Ардуино. Не вижу какая в нем сложность или ценность.
Если речь идет о софте — то это не кровавый энтерпрайз, десятка файлов хватит за глаза, отредактировать их можно в любом редакторе с синтакс хайлайтом, хоть том же виме, проект в CMake на десять строк, скомпилировать в avr-gcc, прошить avrdude.
Тут все настолько на коленке, что думать, как перелицевать ардуинку под требования проекта будет дольше.

Так Ардуїно це не плата, і чого одразу авр, там крім авр ще 3 десятка контроллерів.

чого одразу авр

Атмега8 по-моему самый ходовой, но не суть.
Все оно настолько одинаково примитивно, что не экономит ничего даже при малосерийном производстве, а проблемы с подключением периферии или корпусированием может создавать нешуточные. Я уже не говорю о сертификации на электромагнитную совместимость и подобное.
Например, когда речь идет о процессорных модулях и одноплатниках, то в них вложен немалый труд и на разводку высокочастотной платы, и на BSP, и на пайку BGA в конце-концов, тут покупка оправдана, это даст сильный буст. Но не детский конструктор.

Багато розумних термінів але як це впливає на те, що ардуіно це бутлоадер та конвенція бібліотек ? Що заважає розвести атмел як завгодно але використовувати не дорогий девборд а платку ардуіно і після бінарник заливати

ардуіно це бутлоадер та конвенція бібліотек

Ты вообще понимаешь требования к индустриальной электронике, даже не life-critical применения? Там где про деньги, а не светодиодами помигать?

Та трохи розумію, тому і здивован чого вас так бамбіт з того, як код организован чи яким редактором його поредагували.

Бомбит? Пускай бомбит у того, кто заплатил деньги ардуинщику.
Я не имею ничего против самого Ардуино, это талантливая техническая игрушка.
Я против того, чтобы новичкам пришедшим в профессиональную эмбеддед разработку прививали ардуино-стайл.

Колись я почав для 8051 на С писати, а діди навколо теж були против, тільки асемблер для профі, отой С-стайл це погано. А на них можливо шипіли що треба у кодах фігачити і відразу у РТшку зашивати чи феріт мотати. І так мало початківців, важко наймати людей, хай хоч на ардуіно вчаться

Ну я розумію вимоги до індустріальної електроніки, і більшість запитів ринку закриває ардуйня, а якби не вимога мати на борту зв’язок, то закривалаб 99 проектів зі 100. І ні в кого б не виникало запитань, коли воно відповідає тз. Бути проти ардуїни, це чисто релігійні переконання.

Я чув як машина в’їхала у натовп людей, тепер машини теж треба заборонити? Чи тільки для їзди по власному подвір’ю?

Нет, надо лучше готовить водителей

не повіриш, але деяких водіїв якраз для такого і готували.

взагалі початкові налаштування зараз можна робити у тому самому vs code з підключеним llm, типу

gimme boilerplate code for STM32 with led connected to PA4 which should blink with 500Hz frequency, compatible with platform.io and HAL support

дає компілюємий код. якщо ви вже наважилися вступити у стм32 треба робити на цьому гівняному HAL усе, бо інакше нема того задоволення

називається PlatformIO (український проєкт)

Интересно, с какой стороны от границы они находятся относительно мотивирующих бусиков, чтобы на них не оказывалось мотивирующее относительно кода влияние.

Підписатись на коментарі