STM32 – Частина 1: Перший запуск і середовище розробки (IDE)

28.05.2025 2 хвилин Автор: animator404

Хочу поділитися власним досвідом старту в STM32. Багато в чому це буде саме власний досвід, осмислений і узагальнений в цій статті. Свій шлях я починав з Ардуїно (Arduino), тому все буде розраховане саме на тих, хто вже так само знайомий з Ардуїно і шукає дорожню карту (роадмапу) як перейти на STM32. Якщо ще не знайомі з Ардуїно, то рекомендую все-таки почати саме з неї. Вам може бути цього достатньо і це може стати чудовим хобі на все життя. Для інших, хто вирішив заглянути за горизонт або професійно розвиватися в сфері Embedded — ласкаво прошу!

Плата розробки для STM32

Пропоную почати з опису що таке STM32. Це сімейство мікроконтролерів (далі МК) компанії STMicroelectronics побудованих на архітектурі ARM сімейства мікропроцесорів Cortex-M. Це актуальна та ефективна архітектура від компанії ARM призначена для побудови пристроїв з невеликим електроспоживанням і високою продуктивністю. Тепер, після офіційної частини, розглянемо як нам почати працювати з цими МК.

Як не дивно, знадобиться девборда (плата розробки) побудована навколо STM32. Тут все доволі просто і важко буде помилитися при виборі яку ж обрати своєю першою девбордою. Кожен, навіть найдешевший МК, має в собі стандартний набір периферії, яку Ви і будете вивчати, якщо вирішили почати цей шлях: GPIO, UART, I2C, SPI, ADC, Таймери, DMA, Watchdog.

Більш просунуті МК мають додатковий набір периферії (DAC, CAN, USB, Ethernet і т.д.), але стандартний набір є у всіх і для початку цього більш ніж достатньо. Девбордів існує велика кількість, але є 2 основні офіційні лінійки від STMicroelectronics: Nucleo та Discovery.

Переваги Nucleo плат:

  • вбудований програматор і дебагер прямо на платі

  • якість виконання системи живлення

  • сумісність виведених на плату GPIO пінів з Ардуїно шілдами

Discovery плати мають ті самі переваги, що і Nucleo окрім сумісності з Ардуїно. Також зачасту мають специфічну периферію на платі, як от наприклад:

  • TFT/LCD дисплей

  • гіроскоп чи будь-які інші датчики

  • сенсорну кнопку

  • Ethernet

Вартість цих плат розробки зазвичай починається близько 800 грн і різниця у вартості між ними часто зумовлена тим фактором, що Discovery борда має якусь специфічну периферію, як от наприклад дисплей чи якийсь сенсор. Discovery є сенс обирати під конкретний проєкт, коли Ви точно знаєте, що у Вашому продукті буде використовуватись дисплей чи наприклад датчик температури і для зручності розробки Ви хочете, щоб це уже було на девборді.

Ви точно не помилитесь, якщо в якості своєї першої девборди оберете будь-яку доступну Nucleo без ніякої додаткової зовнішньої периферії, оскільки та стандартна периферія описана на початку цього параграфу знаходиться вже всередині самого МК і нікуди від Вас не дінеться. А будь-який сумісний дисплей чи датчик температури Ви завжди зможете докупити пізніше і підключити.

Хоч Nucleo і дуже рекомендована для легкого і безболісного старту, але варто розповісти і про варіанти з АліEкспресу. Це більш доступні, але і більш “суворі” варіанти (найвідоміша BlackPill – F401 або F411). Суворі, тому що вимагають трохи більше навичок в плані підключення плати і завантаження прошивки.

Такі плати мають значно менші габарити і не несуть на борту програматора/дебагера ST-Link. Прошивка відбувається зачасту через зовнішній програматор, який треба докупити. В дорожчих варіантах прошивка можлива і через DFU (USB), хоча зовнішній програматор буде краще. Також мають простішу систему живлення з меншою кількістю захисних механізмів.

Зате ці плати дуже добре підійдуть для різних домашніх проєктів із-за ціни і габаритів коли Ви станете трохи більш досвідченим і вище описані недоліки для Вас перестануть бути перешкодою. Адже на кожен домашній пет-проєкт Ви точно не будете купувати дорожчі і габаритніші Nucleo/Discovery, які буде важко помістити в невеликий пластиковий корпус.

Вартість таких плат варіюється від 60 до 200 грн в залежності від МК, який використовується і магазину. Рекомендую магазин-виробник WeAct Studio з АліEкспрес. Купував у них кілька різних девбордів, ST-Link програматор, логічний аналізатор, претензій не маю. Посилання додавати не буду оскільки посилання часто перестають працювати.

Середовище розробки (IDE)

Середовище розробки це основне місце роботи, де ви будете створювати програми для вашого STM32 МК. Їх є багато різних: STM32CubeIDE (офіційна від ST Microelectronics), Microsoft VS Code, Keil uVision (офіційна від самої ARM), IAR і навіть Arduino IDE. Якщо ми тут вже професійно зібрались працювати з STM32, то Arduino нам звичайно не підходить.

Але насправді досить часто для перевірки концепту Arduino не така вже і погана. Майте лише на увазі, що гарантовано в Arduino у вас буде працювати Arduino API, але добра половина прикладів з Ардуїно бібліотек просто так не заведеться або не заведеться взагалі оскільки вони заточені зачасту під AVR (класичні Arduino) і ESP32, хоч і написані на Arduino API. Але поблимати світлодіодом точно зможете і навіть більше.

Далі йде STM32CubeIDE, яка скоріше всього і буде Вашим вибором на початку. Це офіційне середовище розробки від STMicroelectronics, яке дозволить відносно швидко запустити той самий “блінк” (поблимати світлодіодом), заснована на Eclipse. Тут можна графічним способом ініціалізувати GPIO піни, периферії, задати бажану частоту самого МК і частоти окремої групи периферій і це все – в кілька кліків мишкою.

Під капотом же IDE напише за вас “нудний” код по ініціалізації цього всього, а вам залишиться лише написати безпосередньо потрібний шматок і лише у спеціально виведеному під це місці. Тобто виходять досить контрольовані умови розробки, щоб важко було помилитися і зробити щось не те, від чого ваш МК навіть не запуститься, а ви не зрозумієте чому нічого не працює.

Інший варіант це Microsoft Visual Studio Code (VS Code). З усіх перелічених раніше IDE ця не створювалась спеціально для програмування мікроконтролерів (компенсується PlatformIO плагіном від українських розробників), але, як на мене, є найзручнішою, найшвидшою і сучасною. І якщо Ви вже використовуєте її для інших мов програмування (скоріше всього так і є), то перейти на неї Вам буде нескладно (окрім тієї частини роботи, де STM32CubeIDE згенерував би замість Вас важливу і не тривіальну частину коду).

Отже, вибір середовища розробки на початку нашого шляху падає на STM32CubeIDE. Далі, коли станете більш обізнані в тому, як ініціалізується сам МК і його периферії, як користуватися периферіями, зрозумієте принцип роботи з HAL і якщо у Вас так само як і у автора статті вроджена алергія на Eclipse-подібні IDE, то перейдете в VS Code. А далі, на більш реальних проєктах, будете використовувати CMake, власноруч встановлювати компілятор, лінкер, дебагер (toolchain), власноруч керувати залежностями/бібліотеками в будь-якій зручній для Вас IDE. Але це все вже потім.

Ось приклад як виглядають налаштування PlatformIO та блінк програма на STM32G030 з дефолтною частотою ядра та ініціалізацією GPIO:

Висновки

Якщо підсумувати, то для старту буде потрібен один з таких сетапів:

* в альтернативному і бюджетному сетапах потрібно буде запаяти гребінки пінів власноруч

IDE для STM32

Тобто для старту в STM32 рекомендується плата розробки Nucleo-64, причому не обов’язково якоїсь потужної серії як от G4 чи H5, згодиться і G0, F3. Також потрібна безкоштовна STM32CubeIDE (потребує реєстрації) в якості середовища розробки. Давайте порівняємо кілька популярних 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

Висновок

Посилання на першоджерело: https://solderkid-blog.netlify.app/stm32/neopixel

Підписатися
Сповістити про
0 Коментарі
Найстаріші
Найновіше Найбільше голосів
Знайшли помилку?
Якщо ви знайшли помилку, зробіть скріншот і надішліть його боту.