STM32: с чего начать — ST-Link, CubeMX и HAL без каши в терминологии
«Программирование STM32» (1 616), «STM32 HAL» (1 096), «STM32 Cube» (1 625), «ST-Link» (суммарно ~3 400) — новичок тонет в трёх разных инструментах с похожими названиями, не понимая, что каждый делает. Разбираем по ролям.
Три разные вещи, которые путают чаще всего
**ST-Link** — не софт, а физический программатор/отладчик (встроен на платах Nucleo/Discovery или отдельным модулем). Передаёт прошивку с компьютера на чип через SWD и позволяет ставить breakpoints во время выполнения — без него залить код на «голый» STM32 нельзя, в отличие от Arduino со встроенным UART-загрузчиком. **STM32CubeMX** — графический конфигуратор периферии: кликами настраивают тактирование, пины, таймеры, UART/SPI/I2C, и генерирует стартовый C-проект под выбранную IDE. Это не среда разработки, а генератор шаблона. **HAL (Hardware Abstraction Layer)** — библиотека, которую генерирует CubeMX: единый API (`HAL_UART_Transmit()`, `HAL_GPIO_WritePin()`) поверх разных серий STM32, чтобы код не переписывать при смене чипа. Есть более низкоуровневая альтернатива LL (Low Layer) — быстрее, но без кроссплатформенности между сериями.
Минимальный путь от чипа до мигающего светодиода
1) Подключить ST-Link к SWD-выводам платы (SWDIO, SWCLK, GND, при необходимости 3.3V/NRST). 2) В CubeMX выбрать конкретный чип, не серию — периферия отличается даже внутри одной линейки. 3) Настроить тактирование (Clock Configuration) — частая ошибка новичков: не включить нужный источник тактирования для конкретного периферийного блока, тогда он молча не работает. 4) Сгенерировать проект под STM32CubeIDE (бесплатная, Eclipse-based редактор + отладчик + сам CubeMX). 5) Прошить через встроенный в CubeIDE интерфейс ST-Link — отдельный загрузчик не нужен.
Частые причины «не работает» на старте
Забыт `HAL_Init()` или он вызван после переинициализации тактирования — часть периферии зависит от порядка вызовов, которые CubeMX генерирует автоматически, но ломаются при ручной правке `main.c` вне user-code-секций. Правки кода вне `/* USER CODE BEGIN */.../* USER CODE END */` — при повторной генерации из CubeMX всё вне этих меток перезатирается. NRST не подтянут — на самодельных платах без готового модуля забывают подтягивающий резистор на выводе сброса, чип не выходит из reset.