STM32CubeIDE: среда разработки для STM32
STM32CubeIDE — бесплатная среда ST для микроконтроллеров STM32: редактор на Eclipse, компиляторы GCC и Clang, отладчик GDB с GDB-серверами ST-LINK, SEGGER J-Link и OpenOCD. С версии 2.0 настройка выводов и генерация кода вынесены в отдельную программу STM32CubeMX. Разбираем установку, создание проекта, сборку, отладку, вывод printf через SWV и типичные проблемы с ST-LINK.
Обновлено Редакция GAW
STM32CubeIDE — бесплатная среда разработки STMicroelectronics на C и C++ для микроконтроллеров и микропроцессоров STM32. Внутри неё платформа Eclipse с модулем CDT, компиляторы GCC и Clang (LLVM), отладчик GDB и три GDB-сервера: ST-LINK GDB server, OpenOCD и SEGGER J-Link GDB server. Для записи флеш-памяти среда вызывает консольную версию STM32CubeProgrammer. Есть анализатор сборки (Build Analyzer), статический анализатор стека, окна регистров периферии, «живых» переменных, трассировки SWV и анализатор аварийных исключений (Fault Analyzer). Текущая версия — 2.2.0, документация — руководство UM2609 Rev 18 и заметки о выпуске RN0114 Rev 39 (июнь 2026).
У среды два варианта: классическая STM32CubeIDE на Eclipse (с 2019 года, поддерживает все STM32 MCU и MPU) и STM32CubeIDE for VS Code — расширение для Visual Studio Code (с 2025 года, все STM32 MCU). На странице продукта ST пишет, что сейчас вкладывается в первую очередь в вариант на VS Code. Эта статья — про вариант на Eclipse.
Коротко
- Состав: Eclipse 2025-12 и CDT 12.3.0, GCC на базе GNU Tools for Arm 14.3, STARM-Clang 21.1.1, ST-LINK_gdbserver 7.14.0, J-Link GDB server 9.42, OpenOCD 0.12.0+dev, STM32CubeProgrammer 2.23.0 (версия 2.2.0).
- ОС: только 64-разрядные — Windows 10 и 11, Ubuntu LTS 26.04, Fedora 44, macOS 15 и 26; ОЗУ 4 ГБ, на диске 6 ГБ.
- С версии 2.0.0 STM32CubeMX больше не встроен: выводы и тактирование настраивают в отдельной STM32CubeMX, а готовый проект импортируют.
- Код вне секций USER CODE перезаписывается при каждой генерации кода в STM32CubeMX.
- По умолчанию в проекте две конфигурации: Debug (без оптимизации, с отладочной информацией) и Release (оптимизация по размеру).
- printf без UART — через ITM и SWV, но только на ядрах с SWV (обычно Cortex-M3, M4, M7, M33) и при подключённом выводе SWO.
Что изменилось в версиях 2.x
Ветка 2.x заметно отличается от привычных по старым инструкциям версий 1.x, где внутри среды был графический конфигуратор выводов (перспектива Device Configuration Tool).
| Версия | Что важно |
|---|---|
| 2.0.0 | STM32CubeMX отделён от среды, убраны вход в учётную запись ST и ST-MCU-FINDER-PC; добавлены STARM-Clang, GCC 14 через обновления, semihosting через ST-LINK GDB server, встроенные CMake и Ninja |
| 2.1.0 | GCC 14 стал компилятором по умолчанию; пресеты CMake; сборка для Apple Silicon (ARM64); импорт проектов STM32CubeMX2 |
| 2.1.1 | CMake 3.30.8, исправлено окно Live Expressions при отладке через J-Link |
| 2.2.0 | серия STM32V8, новые STM32H5 и STM32U3; Eclipse 2025-12; отладка нескольких кристаллов на одной шине SWD (multi-drop) через ST-LINK GDB server, OpenOCD и J-Link; CMake 4.3.1; Ubuntu 26.04 и Fedora 44 |
В заметках к версиям 1.x ST советовала для работы в версии 1.4 и новее заводить новое рабочее пространство (workspace) и импортировать в него с копированием проекты из более ранних версий; к версиям 2.x такого примечания нет.
Установка и требования
STM32CubeIDE распространяется бесплатно по лицензии ST SLA0048, скачивается со страницы продукта на st.com. Порядок установки описан в отдельном руководстве UM2563; несколько версий среды можно держать на компьютере одновременно.
| Параметр | Требование (RN0114 Rev 39) |
|---|---|
| Windows | 10 и 11, только x64 |
| Linux | Ubuntu LTS 26.04, Fedora 44 |
| macOS | 15 Sequoia, 26 Tahoe; с версии 2.1.0 есть сборка для Apple Silicon |
| ОЗУ | рекомендуется 4 ГБ |
| Диск | 6 ГБ свободного места; 15 ГБ, если нужен OpenSTLinux для STM32MP |
При первом запуске среда спрашивает, где создать рабочее пространство (workspace) — папку, в которой лежат проекты; активным может быть только одно. Две вещи из руководств ST стоит учесть сразу:
- имена workspace и проектов и весь путь к ним должны состоять только из символов ASCII — значит, кириллицы не должно быть и в именах папок, через которые проходит путь, включая папку пользователя Windows, если workspace лежит в ней;
- в Windows папку workspace не стоит прятать глубоко: при слишком длинных путях к файлам сборка завершается ошибками.
Создание проекта
Пустой проект прямо в STM32CubeIDE
Команда File → STM32 Project Create/Import → Create New STM32 Project, затем «STM32CubeIDE project». В мастере выбирают микроконтроллер на вкладке MCU/MPU Selector (фильтр по серии и ядру) или плату на вкладке Board Selector, вводят имя проекта, язык (C или C++) и тип результата: исполняемый файл или статическая библиотека. Тем же меню создаётся проект на CMake (шаблоны Executable и Static Library). Микроконтроллер у готового проекта мастер сменить не позволяет. Поэтому статические библиотеки, которые собирают под разные STM32, ST советует создавать как обычный CDT-проект (File → New → C/C++ Project): в нём целевой микроконтроллер выбирается отдельно для каждой конфигурации сборки (Properties → C/C++ Build → Settings → Tool Settings → MCU Settings → Select…).
По руководству UM2553 такой проект уже содержит всё, чтобы собрать и записать программу, включая файл syscalls.c, но кода инициализации периферии в нём нет.
Проект из STM32CubeMX
Обычный путь для проекта с HAL выглядит так:
- В STM32CubeMX выбрать микроконтроллер, плату или пример, настроить выводы, тактирование, периферию и middleware. Всё это сохраняется в файле .ioc — один такой файл на проект.
- На вкладке Project Manager указать в поле Toolchain/IDE значение STM32CubeIDE и нажать GENERATE CODE.
- В STM32CubeIDE выполнить File → STM32 Project Create/Import → Import STM32 Project, выбрать «STM32CubeMX project» (или STM32CubeMX2), ввести имя и папку проекта STM32CubeMX.
Функции инициализации периферии в сгенерированном коде начинаются с MX_: MX_GPIO_Init(), MX_I2S2_Init() и так далее — по одной на каждый включённый блок периферии. Чтобы изменить настройки, правят .ioc в STM32CubeMX и генерируют код заново — поэтому важно, где лежит ваш собственный код.
Секции USER CODE: что переживёт повторную генерацию
STM32CubeMX расставляет в сгенерированных файлах пары комментариев:
int main(void)
{
/* USER CODE BEGIN 1 */
uint32_t counter = 0; /* saved on regeneration */
/* USER CODE END 1 */
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
HAL_Delay(500);
counter++;
}
/* USER CODE END 3 */
}
Правила из руководства UM1718:
- код внутри секций сохраняется при следующей генерации, код вне их перезаписывается;
- секции нельзя переносить и переименовывать — иначе их содержимое теряется;
- сохраняются только секции, которые расставил сам STM32CubeMX; придуманные пользователем пары BEGIN/END игнорируются;
- бесконечный цикл
while (1)тоже находится внутри секции, поэтому тело цикла пишут междуUSER CODE BEGIN 3иUSER CODE END 3; - опция «Keep user code when regenerating» касается только секций в сгенерированных файлах, а не ваших отдельных файлов; папки
MiddlewaresиUtilitiesвнутри проекта зарезервированы — при регенерации их содержимое удаляется или меняется.
Надёжнее всего крупный собственный код держать в своих .c и .h файлах, а в секции main.c оставлять только вызовы.
Сборка: Debug и Release
В каждом новом проекте две конфигурации сборки:
| Конфигурация | Оптимизация | Отладочная информация | Когда нужна |
|---|---|---|---|
| Debug (по умолчанию) | нет | есть | отладка по шагам, точки останова |
| Release | по размеру кода | нет | готовая прошивка |
Активную конфигурацию выбирают стрелкой рядом с кнопкой Build на панели инструментов или через контекстное меню проекта Build Configurations → Set Active. Результат сборки (.elf и карта памяти .map) кладётся в папку с именем активной конфигурации; в конце сборки окно Console печатает размеры секций. Можно создать свои конфигурации на основе существующих, а Build Configurations → Build All соберёт все сразу. Форматы файлов прошивки разобраны в статье о файлах прошивки.
Для сборки на сервере без графического интерфейса в папке установки есть скрипт headless-build.bat. Пример для Windows из руководства:
headless-build.bat -data C:\Users\Name\STM32CubeIDE\workspace -cleanBuild NUCLEO-F401RE
Перед запуском workspace должен быть закрыт в STM32CubeIDE, иначе скрипт не сможет его открыть.
Скрипт компоновщика и startup-файл
Проект собирается командой вида arm-none-eabi-gcc … -T"STM32F401RETX_FLASH.ld" --specs=nosys.specs -Wl,--gc-sections; в примере из руководства для платы NUCLEO-F401RE скрипт компоновщика STM32F401RETX_FLASH.ld лежит в корне папки проекта. В нём:
- блок
MEMORYс адресами и размерами флеш-памяти и ОЗУ; - точка входа
ENTRY(Reset_Handler); - размещение секций
.isr_vector,.text,.rodata,.data,.bss; - символы
_estack,_sidata,_sdata,_edata,_sbss,_ebss, по которым startup-код ставит указатель стека, копирует.dataиз флеш-памяти в ОЗУ и обнуляет.bss; _Min_Heap_Sizeи_Min_Stack_Size— минимальные размеры кучи и стека. Компоновщик лишь проверяет, что они помещаются в ОЗУ; реальный стек во время работы может оказаться больше.
Таблица векторов g_pfnVectors и функция Reset_Handler находятся в ассемблерном файле startup_stm32xxxx.s. Если его нет в сборке, GNU ld по умолчанию лишь предупреждает «cannot find entry symbol Reset_Handler» и всё равно создаёт неработающий .elf. Чтобы такие предупреждения останавливали сборку, в Properties → C/C++ Build → Settings → MCU GCC Linker → Miscellaneous добавляют флаг -Wl,--fatal-warnings. Как устроены MEMORY, SECTIONS, адреса загрузки и выполнения, — в статье о скриптах компоновщика; карта флеш-памяти STM32 и загрузчик — в статье о флеш-памяти и загрузчике STM32.
Отладка через ST-LINK
Первая отладочная конфигурация создаётся из контекстного меню проекта: Debug As → STM32 C/C++ Application. При первом запуске среда собирает проект и открывает окно настроек; после нажатия Debug она запускает GDB-сервер, записывает программу и останавливается на первой строке main(), а затем предлагает перейти в перспективу Debug.
На вкладке Debugger выбирают программатор и сервер:
| Программатор | GDB-сервер | Замечание |
|---|---|---|
| ST-LINK/V2, STLINK-V3 и встроенные в Nucleo и Discovery | ST-LINK GDB server или OpenOCD | ST-LINK GDB server — вариант по умолчанию |
| SEGGER J-Link | SEGGER J-Link GDB server |
Все три сервера поддерживают обычную отладку, Live Expressions, SWV и отладку с учётом FreeRTOS и ThreadX. Основные настройки для ST-LINK:
- Interface — SWD или JTAG. ST рекомендует SWD; для SWV он обязателен. Распиновка разъёмов — на странице JTAG и SWD.
- Frequency (kHz) — частота SWD или JTAG; Auto означает максимум для данного ST-LINK. При длинных проводах и помехах частоту снижают.
- ST-LINK S/N — серийный номер, если к компьютеру подключено несколько программаторов; кнопка Scan показывает все найденные.
- Reset behaviour — как подключаться к микроконтроллеру (таблица ниже).
- Debug in low power modes и Suspend watchdog counters while halted — не терять связь в режимах сна и не получать сброс от сторожевого таймера, пока ядро остановлено.
- Shared ST-LINK — нужен, если во время отладки к тому же ST-LINK обращается другая программа, например STM32CubeProgrammer.
- Log to file — подробный журнал GDB-сервера на случай непонятных ошибок.
| Reset behaviour | Что делает |
|---|---|
| Connect under reset (по умолчанию) | ST-LINK держит NRST в низком уровне, подключается по SWD или JTAG и отпускает сброс |
| Software system reset | программный сброс ядра и периферии через регистр |
| Hardware reset | импульс на NRST, затем подключение |
| Core reset | сброс только ядра; по UM2609 недоступен на Cortex-M0, M0+ и M33, по UM2237 — ещё и на Cortex-M55 и M85 |
| None | подключение к уже работающей программе без сброса и без записи |
Если в отладочной конфигурации есть запись флеш-памяти, выбранный режим не действует: ST-LINK GDB server вызывает STM32_Programmer_CLI с параметрами mode=UR reset=hwRst, то есть всегда подключается под сбросом. Поэтому вывод NRST микроконтроллера должен быть соединён с выводом NRST программатора — у ST-LINK/V2 это контакт 15 20-контактного разъёма.
ST советует отлаживать код, собранный с оптимизацией -O0: с -Og отладка возможна, с более высокими уровнями переменные «пропадают», а шаги прыгают по строкам. В перспективе Debug доступны точки останова (щелчок по полосе слева от номера строки), окна Variables, Expressions, Memory, Registers, SFRs с регистрами периферии из файла SVD, Live Expressions — значения переменных, обновляемые без остановки программы, и Fault Analyzer, который после аварийного исключения показывает его причину, например деление на ноль. Кнопка Terminate and Relaunch останавливает сессию, пересобирает проект и запускает отладку заново.
Прошивка без отладки
Чтобы только записать программу и запустить её, создают конфигурацию запуска: Run As → STM32 C/C++ Application. Программа записывается, и сессия сразу закрывается. Для записи готовых .hex и .bin, работы с option bytes и загрузчиком через UART или USB есть отдельная программа STM32CubeProgrammer.
printf через SWV и ITM
Функция printf() из newlib вызывает _write() из файла syscalls.c, а та — __io_putchar() для каждого символа. Чтобы вывод шёл в окно отладчика без UART, используют модуль ITM ядра и вывод SWO. В примере ST для STM32F4 _write() переписывают так:
#include "stm32f4xx.h"
#include "core_cm4.h"
int _write(int file, char *ptr, int len)
{
for (int i = 0; i < len; i++)
ITM_SendChar(*ptr++); /* stimulus port 0 */
return len;
}
В syscalls.c функция _write() объявлена со слабым атрибутом weak, поэтому её можно переопределить в любом своём файле, не трогая сгенерированный. Дальше:
- Run → Debug Configurations, вкладка Debugger: интерфейс SWD, включить Serial Wire Viewer (SWV).
- В поле Core Clock ввести частоту ядра, которую устанавливает программа. Её можно подсмотреть в переменной
SystemCoreClockв окне Expressions после инициализации тактирования (при необходимости вызватьSystemCoreClockUpdate()). Частоту SWO среда подберёт сама; для медленной разводки её ограничивают опцией Limit SWO clock. - Запустить отладку, открыть Window → Show View → SWV → SWV ITM Data Console, в настройках окна включить порт 0 и нажать красную кнопку Start Trace, затем продолжить выполнение программы.
По UM2609 запись байта в порт ITM занимает один цикл записи, но функция CMSIS ITM_SendChar() перед записью ждёт, пока порт освободится: при медленном SWO и большом объёме вывода printf тормозит программу. Если ITM не включён (отладчик не подключён), функция сразу возвращается. Ограничения: SWV обычно есть на Cortex-M3, M4, M7 и M33, но его нет на Cortex-M0 и M0+ (например, у STM32L053), а вывод SWO микроконтроллера должен быть подключён к программатору. Альтернативы — UART (например, через виртуальный COM-порт, который есть у ST-LINK/V2-1 и STLINK-V3) или SEGGER RTT, для которого нужен J-Link.
Если в консоли пусто, руководство UM2609 предлагает проверить: включён ли SWV именно в той конфигурации, которая запущена; нажата ли кнопка Start Trace; верна ли частота Core Clock (самая частая причина); не меняет ли программа частоту ядра на ходу; не переполнен ли SWO лишними данными трассировки; поддерживают ли SWV программатор, сервер и плата.
Частые проблемы
| Симптом | Что проверить |
|---|---|
| ST-LINK не находится | Windows: драйвер STSW-LINK009 обязателен для ST-LINK/V2 и V2-1 (среда ставит его сама, но при подключении до установки устройство может остаться «неизвестным»). Linux: правила udev из STSW-LINK007 и пакет libusb-1.0. Светодиод COM мигает красным, затем оранжевым — сбой определения USB: другой кабель или порт |
| Программатор занят | к нему подключена другая программа; закрыть её или включить Shared ST-LINK в обеих |
| Среда просит обновить прошивку ST-LINK | обновить программой STLinkUpgrade (пакет STSW-LINK007, версии .exe для Windows и .jar для Windows, Linux и macOS) или кнопкой Firmware upgrade в STM32CubeProgrammer; не отключать программатор во время записи |
| Не удаётся подключиться к ядру или остановить его («Target not halted») | режим Connect under reset и соединённый NRST; меньшая частота SWD; включить Debug in low power modes, если программа уходит в сон; если программа перенастроила выводы SWDIO и SWCLK, помогает только подключение под сбросом |
| После генерации пропал код | код был вне секций USER CODE или секции переименованы; восстановить из .bak, если включено резервное копирование, или из системы контроля версий |
Сборка создала .elf, но программа не стартует | нет startup-файла: в консоли предупреждение о Reset_Handler; добавить -Wl,--fatal-warnings |
| Workspace не открывается | его уже использует другой запущенный экземпляр STM32CubeIDE |
| Ошибки сборки «на ровном месте» в Windows | слишком длинный путь или не-ASCII символы в пути к workspace |
Текст «Target not halted» не встречается ни в UM2237, ни в просмотренных разделах UM2609 (полный поиск по UM2609 не проводился); в таблице — меры из описания режимов подключения в этих двух руководствах. Сами ST-LINK, их напряжения и скорости разобраны в обзоре программаторов и отладчиков; как подключить плату STM32 к компьютеру без ST-LINK — в статье о загрузчике STM32.
Частые вопросы
Где в STM32CubeIDE 2.x настраивать выводы и тактирование?
В отдельной программе STM32CubeMX. С версии 2.0.0 ST отделила STM32CubeMX от STM32CubeIDE: в STM32CubeMX выбирают микроконтроллер или плату, настраивают выводы, тактирование и периферию, указывают STM32CubeIDE в поле Toolchain/IDE и генерируют проект. Затем его открывают командой File → STM32 Project Create/Import → Import STM32 Project. Конфигурация хранится в файле .ioc, по одному на проект.
Почему после повторной генерации кода пропал мой код?
STM32CubeMX сохраняет только код, написанный внутри своих секций между комментариями /* USER CODE BEGIN … */ и /* USER CODE END … */. Всё, что стоит вне этих секций в сгенерированных файлах, перезаписывается. Секции нельзя переносить и переименовывать, а секции, придуманные самим пользователем, тоже теряются. Свой крупный код лучше держать в отдельных файлах.
Как вывести printf в консоль STM32CubeIDE без UART?
Через SWV и ITM: в syscalls.c функция _write() должна вызывать ITM_SendChar() вместо __io_putchar(). В отладочной конфигурации выбирают интерфейс SWD, включают SWV и вводят точную частоту ядра Core Clock, затем открывают окно SWV ITM Data Console, включают порт 0 и запускают трассировку. Нужен подключённый вывод SWO; на ядрах Cortex-M0 и M0+ SWV нет.
STM32CubeIDE не видит ST-LINK. Что проверить?
В Windows для ST-LINK/V2 и V2-1 нужен драйвер STSW-LINK009 (обычно его ставит сама среда), в Linux — правила udev из пакета STSW-LINK007 и libusb-1.0. Светодиод COM, мигающий красным и затем оранжевым, означает сбой определения USB-порта: замените кабель или порт. Если программатор занят другой программой, включите Shared ST-LINK. Старую прошивку обновляет STLinkUpgrade.
Чем отличаются конфигурации Debug и Release?
Обе создаются в каждом новом проекте. Debug собирается с отладочной информацией и без оптимизации и выбрана по умолчанию; Release оптимизирована по размеру кода и не содержит отладочной информации. Файлы сборки кладутся в папку с именем активной конфигурации. ST рекомендует отлаживать код, собранный с -O0: с -Og отладка возможна, с более сильной оптимизацией затруднена.
Источники
- STMicroelectronics. UM2609 Rev 18. STM32CubeIDE user guide, июнь 2026 — состав среды, требования к ОС, создание и импорт проектов, скрипт компоновщика и startup, перенаправление printf, конфигурации Debug и Release, headless build, GDB-серверы, режимы сброса, SWV и ITM, история версий документа
- STMicroelectronics. UM2553 Rev 6. STM32CubeIDE quick start guide, июнь 2026 — типы проектов, импорт проектов STM32CubeMX и STM32CubeMX2, ограничение на символы в путях, первый запуск отладки
- STMicroelectronics. RN0114 Rev 39. STM32CubeIDE release v2.2.0, июнь 2026 — версии компонентов, поддерживаемые ОС, объём ОЗУ и диска, изменения версий 2.0.0, 2.1.0 и 2.2.0
- STMicroelectronics. UM1718 Rev 51. STM32CubeMX for STM32 configuration and initialization C code generation, май 2026 — файл .ioc, выбор Toolchain/IDE, пользовательские секции USER CODE и их сохранение при повторной генерации
- STMicroelectronics. TN1235 Rev 7. Overview of ST-LINK derivatives, январь 2025 — обновление прошивки ST-LINK (STSW-LINK007), драйверы Windows, Linux и macOS (STSW-LINK009), светодиод COM
- STMicroelectronics. STM32CubeIDE — страница продукта — два варианта среды (Eclipse и VS Code), список версий, поддержка ST-LINK и J-Link
Нашли ошибку?
Смотрите также
- STM32Распиновки по корпусам, альтернативные функции, похожие по выводам МК
- Flash и загрузчик STM32Страницы и секторы, BOOT0, системный загрузчик, AN3155, IAP, option bytes, RDP
- Скрипт компоновщика GNU ldMEMORY, SECTIONS, VMA и LMA, KEEP, стек и куча, map-файл, переполнение
- JTAG и SWDARM JTAG 20, Cortex Debug 10, STDC14, ST-LINK
- Программаторы и отладчикиUSBasp, ST-LINK, J-Link, PICkit 5, Snap, CMSIS-DAP, WCH-LinkE: сравнение
- ПрограммыСАПР плат, симуляторы схем, среды и утилиты прошивки МК