🖥️ IDE для STM32
Давайте порівняємо кілька популярних IDE для розробки під STM32: Arduino, VS Code + PlatformIO, STM32Cube.
Звичайно, писати для STM32 можна не лише в цих IDE, але ці найпопулярніші, з якими початківці стикаються на початку вивчення STM32. Тому важливо зрозуміти особливості кожної з них, щоб вхід в STM32 був плавний і зрозумілий.
∞ Arduino IDE
Arduino це універсальна платформа для розробки під мікроконтролери різних виробників. Тому є велика ймовірність, що Ви уже працювали з цим середовищем розробки. Ця IDE добре підходить для класичних плат розробки Arduino (Mega, Uno, Nano і т.д.) та ESP32. Для того, щоб працювати з мікроконтролерами (МК) в цьому середовищі потрібно мати встановлене 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:
https://www.st.com/en/development-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 можна обрати один із 3-ох фреймворків: 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 фреймворк. 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 код, але набагато зручніше.
Дата публікації
2024.10.28