Справочник платы

STM32 в Arduino IDE: Blue Pill и Black Pill

Blue Pill на STM32F103C8T6 и Black Pill на STM32F411 — недорогие 32-битные платы, которые программируют в Arduino IDE так же, как Uno: те же setup() и loop(). Здесь — распиновка обеих, какой пункт выбрать в меню, как прошить через ST-Link без STM32CubeProgrammer, почему молчит монитор порта и что поменялось в ядре 3.0.

Что это за платы

STM32 вместо Arduino Uno: что меняется

STM32 — большое семейство микроконтроллеров STMicroelectronics на ядрах ARM. Blue Pill и Black Pill — самые ходовые платы на них: маленькие, с двумя рядами выводов под макетную плату. В Arduino IDE их поддерживает официальный пакет от самой ST: скетчи пишутся привычно, и большинство библиотек для датчиков и дисплеев работает. Не подойдут те, что написаны только под чип Uno и обращаются к его регистрам напрямую.

Arduino UnoBlue PillBlack Pill
ЧипATmega328P, 8 битSTM32F103C8T6, ARM Cortex-M3, 32 битаSTM32F411CEU6, ARM Cortex-M4, 32 бита
Частота16 МГц72 МГцдо 100 МГц, в Arduino — 96; у F401 — 84
Флеш-память32 КБ64 КБ512 КБ, у F401CC — 256
Оперативная память2 КБ20 КБ128 КБ, у F401CC — 64
Аналоговые входы6, по 10 бит10, по 12 бит10, по 12 бит
Логические уровни5 В3,3 В, часть выводов терпит 5 В3,3 В, почти все выводы терпят 5 В
Порт для мониторачерез мост USB, есть всегдачерез сам чип — если включить в менючерез сам чип — если включить в меню
Чем прошиватькабелем USBпрограмматором ST-Link; переходником — только с программой STM32CubeProgrammerпрограмматором ST-Link; переходником или кабелем USB — только с STM32CubeProgrammer

Логика у STM32 — 3,3 В, поэтому модуль на 5 В подключают не к любому выводу. Одним кабелем, как Uno, Blue Pill не прошить: моста USB на ней нет, и первую программу заливают программатором ST-Link. А монитор порта через разъём USB платы заработает, только если включить это в меню.

STM32 или ESP32

Если нужен Wi-Fi или Bluetooth, берите ESP32: у STM32 из этой статьи радио нет. STM32 выбирают за другое: у неё много аппаратных таймеров для моторов и ШИМ, точный АЦП и малое потребление, а программу не прерывает радиомодуль, поэтому плата отвечает за предсказуемое время. Для осциллографа, частотомера, станка или пульта управления удобнее STM32, для умного дома — ESP32.

Какая у вас плата: Blue Pill, Black Pill или клон

Отличить их просто. Blue Pill — синяя, с разъёмом micro-USB, двумя жёлтыми перемычками и одной кнопкой RESET. Black Pill — чёрная, с разъёмом USB-C и тремя кнопками: NRST, BOOT0 и KEY. Длина у них почти одинаковая, и один ряд выводов — от PB12 до 3.3 — разведён одинаково.

Blue Pill: STM32F103C8T6 и C6T6

На большинстве Blue Pill стоит STM32F103C8T6: 72 МГц, 64 КБ флеш-памяти и 20 КБ оперативной. Посмотрите на чип: если в конце надписи C6T6, памяти вдвое меньше — 32 и 10 КБ. Для такой платы в меню есть свой пункт, и путать их нельзя: под пунктом для C8 программа рассчитывает на 20 КБ оперативной памяти, а у C6 их только 10, и даже Blink не запускается.

У многих C8T6 внутри на самом деле 128 КБ, но производитель гарантирует только 64, и на части плат верхняя половина памяти не работает. Пункт для 128 КБ в меню есть, но прошить через ST-Link и OpenOCD программу больше 64 КБ всё равно не выйдет: OpenOCD узнаёт объём памяти у самого чипа, а C8 сообщает о себе 64 КБ.

Black Pill: STM32F411CEU6 и STM32F401CCU6

Black Pill выпускает WeAct Studio. Сейчас на ней ставят STM32F411CEU6: до 100 МГц, 512 КБ флеш-памяти и 128 КБ оперативной, ядро Cortex-M4 с аппаратной арифметикой для float (double по-прежнему считается программно). В Arduino чип работает на 96 МГц: при такой частоте USB получает ровно те 48 МГц, что ему нужны. Платы на STM32F401CCU6 и F401CEU6 сняты с производства, но ещё продаются. Оригинальные подписаны «WeAct Studio» и номером версии.

От Blue Pill она отличается и тем, что загрузчик в чипе умеет принимать программу по кабелю USB. Правда, для этого нужна программа STM32CubeProgrammer — подробно в разделе о прошивке.

Ловушка в меню: в списке «Generic STM32F1 series» есть пункты «BlackPill F103C8» и «BlackPill F103CB (or C8 with 128k)». Это другая, старая чёрная плата на том же чипе, что и Blue Pill, со светодиодом на PB12. Для Black Pill от WeAct нужен «Generic STM32F4 series».

На чипе написано CKS32, GD32 или CH32

На дешёвых Blue Pill вместо STM32F103 часто стоит совместимый чип: CKS32F103 (на старых партиях — CS32F103), GD32F103 от GigaDevice, APM32F103 от Geehy или CH32F103 от WCH. Выводы у них те же, и большинство скетчей работает без изменений. Но отличия бывают: GD32 работает до 108 МГц, у некоторых клонов капризничает USB. Бывает и так, что на клоне написано STM32: по надписи оригинал от копии не отличить.

Проверить можно программой: чип сам сообщает номер ядра и код производителя. Залейте скетч ниже (как прошить плату — в разделе про ST-Link) и откройте монитор порта на скорости 115200. Чтобы печать шла через разъём USB платы, перед сборкой выберите в меню USB support → CDC — почему, рассказано в разделе «Монитор порта молчит».

// Какой чип на плате: STM32 от ST или совместимый клон (GD32, CKS32, APM32...).
// Скетч читает то, что чип сообщает о себе сам, и печатает раз в 5 секунд.
// Смотреть через USB платы: в меню USB support -> CDC (generic 'Serial' ...).
// Без этого пункта печать идёт на PA9 — через USB-UART-переходник.

void printHex(const char *name, uint32_t value) {
  Serial.print(name);
  Serial.print("0x");
  Serial.println(value, HEX);
}

void setup() {
  Serial.begin(115200);
}

void loop() {
  // Номер ядра: 0x411FC231 у STM32F103, 0x410FC241 у STM32F401 и F411.
  uint32_t cpuid = SCB->CPUID;
  // Код производителя из служебной таблицы ядра (JEP106): у ST — 0x20.
  uint32_t pid1 = *(volatile uint32_t *)0xE00FFFE4;
  uint32_t pid2 = *(volatile uint32_t *)0xE00FFFE8;
  uint32_t pid4 = *(volatile uint32_t *)0xE00FFFD0;
  uint32_t maker = ((pid1 >> 4) & 0x0F) | ((pid2 & 0x07) << 4);
  uint32_t bank = pid4 & 0x0F;
  // Объём флеш-памяти по паспорту чипа, в КБ. У F103C8 здесь 64,
  // даже если внутри на деле 128.
  uint16_t flashKb = *(volatile uint16_t *)FLASHSIZE_BASE;
  const uint32_t *uid = (const uint32_t *)UID_BASE;

  printHex("CPUID: ", cpuid);
  Serial.print("Производитель: ");
  if (maker == 0x20 && bank == 0) {
    Serial.println("STMicroelectronics");
  } else {
    Serial.print("не ST, код 0x");
    Serial.print(maker, HEX);
    Serial.print(", банк ");
    Serial.println(bank);
  }
  Serial.print("Флеш по паспорту: ");
  Serial.print(flashKb);
  Serial.println(" КБ");
  Serial.print("Частота ядра: ");
  Serial.print(SystemCoreClock / 1000000);
  Serial.println(" МГц");
  Serial.print("Уникальный номер: ");
  for (int i = 0; i < 3; i++) {
    Serial.print(uid[i], HEX);
    Serial.print(i < 2 ? "-" : "");
  }
  Serial.println();
  Serial.println();
  delay(5000);
}

У настоящего STM32F103 номер ядра 0x411FC231, у F401 и F411 — 0x410FC241, и производитель — STMicroelectronics, код 0x20. У клонов номер ядра другой, обычно 0x412FC231, и код производителя тоже: у GD32 там стоит код GigaDevice, а у CKS32 и APM32 — код самой компании ARM, 0x3B. Объём флеш-памяти чип берёт из своей служебной памяти: у C8T6 там 64 КБ, даже если внутри 128. Black Pill F411 покажет частоту 96 МГц — так и должно быть.

Если плата работает, менять её не нужно. Просто помните, что это клон, когда что-то поведёт себя странно.

Распиновка Blue Pill и Black Pill

На схеме плата лежит разъёмом USB вверх, деталями к вам. Кнопки над схемой переключают Blue Pill и Black Pill, цвета показывают, что можно подключать к выводу. Нажмите на пункт легенды: схема подсветит эту группу, а под ней появится пояснение.

Распиновка Blue Pill и Black Pill — схема выводовmicro-USBBOOT1BOOT001RESETSTM32F103C8T68 МГцPC13PWRPB12PB13PB14PB15PA8TX · PA9RX · PA10USB D− · PA11USB D+ · PA12PA15PB3PB4PB5SCL · PB6SDA · PB7PB8PB95VG3.3GG3.3RPB11PB10PB1PB0PA7 · MOSIPA6 · MISOPA5 · SCKPA4 · CSPA3PA2PA1PA0PC15PC14PC13 · LEDVB3.3DIOCLKGNDразъём SWD — для ST-Link

Плата повёрнута разъёмом USB вверх, деталями к вам. На самой плате выводы подписаны без буквы P: «A9» на плате — это PA9 в скетче. Перемычка BOOT0 — та, что ближе к ряду G, G, 3.3, вторая — BOOT1; положение «1» — со стороны чипа. Нажмите на цвет в легенде, чтобы подсветить группу выводов.

Какие выводы STM32 выдерживают 5 В

Сам чип питается от 3,3 В, но многие его выводы терпят 5 В на входе. В паспорте они помечены FT — five-volt tolerant. Выход модуля на 5 В можно подключить к такому выводу без делителя.

ПлатаТерпят 5 В на входеТолько до 3,3 В
Blue Pill (F103C8T6)PA8–PA15, PB3, PB4, PB6–PB15PA0–PA7, PB0, PB1, PB5, PC13–PC15
Black Pill на F411CEU6все остальныеPA0 и PB5
Black Pill на F401 (CCU6, CEU6)все выведенныетаких нет

Пять вольт вывод выдерживает, только когда работает цифровым входом без внутренней подтяжки — INPUT, а не INPUT_PULLUP — и только пока сама плата включена. Вывод, который читают через analogRead(), выдерживает только 3,3 В, даже у Black Pill, где тот же вывод в цифровом режиме терпит 5 В. На PC13–PC15 у обеих плат 5 В тоже не подавайте: там светодиод и часовой кварц. А выдаёт любой вывод 3,3 В: модулю на 5 В этого обычно хватает, но не всегда. Как согласовать уровни, рассказано в статье про питание и 3,3 В.

Serial, I²C и SPI: выводы по умолчанию

В скетче выводы называют как на плате, только с буквой P: «A9» на плате — это PA9 в программе. Букву P не пропускайте: A9 в программе означает девятый аналоговый вход, у Blue Pill это PB1. Простые номера вроде digitalWrite(13, HIGH) тоже собираются, но означают не то, что на Uno, — пишите имена.

ЧтоВыводыКак обратиться в скетче
SerialPA9 — TX, PA10 — RXЕсть сразу. С пунктом USB support → CDC Serial уходит в USB, а PA9 и PA10 остаются под именем Serial1
Serial2PA2 — TX, PA3 — RXОбъявить в начале скетча: Uart Serial2(PA3, PA2); — сначала RX, потом TX
Serial3, только Blue PillPB10 — TX, PB11 — RXUart Serial3(PB11, PB10); — тоже сначала RX
I²C (Wire)PB7 — SDA, PB6 — SCLWire.begin() без параметров
Второй I²C, только Blue PillPB11 — SDA, PB10 — SCLTwoWire Wire2(PB11, PB10); и #include <Wire.h>. Выводы те же, что у Serial3: одновременно их не занять
SPIPA7 — MOSI, PA6 — MISO, PA5 — SCK, PA4 — CSSPI.begin()
СветодиодPC13LED_BUILTIN; горит при LOW
Кнопка KEY, только Black PillPA0USER_BTN; pinMode(PA0, INPUT_PULLUP), нажата — LOW

Второй и третий порт в ядре 3.0 объявляются строкой с Uart. В старых статьях и примерах там стоит HardwareSerial, и с новым ядром такая строка не собирается (подробно — в разделе «Что поменялось в версии 3.0»). Скетч ниже пересылает строки из монитора порта в модуль на втором порту и обратно — так проверяют GPS-приёмник или Bluetooth-модуль HC-05:

// Второй аппаратный порт USART2: PA2 — TX, PA3 — RX.
// Мост между монитором порта и модулем на 9600 бод: GPS, HC-05 и т. п.
// В ядре STM32 3.0 класс порта называется Uart. Старая запись
// HardwareSerial Serial2(PA3, PA2) теперь не собирается.

Uart Serial2(PA3, PA2);   // сначала RX, потом TX

void setup() {
  Serial.begin(115200);   // монитор порта: PA9/PA10 или USB, смотря по меню
  Serial2.begin(9600);    // модуль: его TX — на PA3, его RX — на PA2
}

void loop() {
  while (Serial2.available()) {
    Serial.write(Serial2.read());
  }
  while (Serial.available()) {
    Serial2.write(Serial.read());
  }
}

У Blue Pill модуль на 5 В к PA2 и PA3 напрямую не подключайте: эти выводы 5 В не терпят. У Black Pill можно. Про сам UART и логические уровни подробно — в статье про UART.

Аналоговые входы и ШИМ

АЦП у STM32 12-битный, но analogRead() по умолчанию отдаёт 0–1023, как на Uno, — чтобы старые скетчи считали правильно. Полная точность включается строкой analogReadResolution(12): тогда 0–4095. Верх шкалы — 3,3 В, а не 5.

analogWrite() работает на выводах, к которым подведён таймер. У Blue Pill это почти все, кроме PA4, PA5, PA12, PB12 и PC13–PC15. Но некоторые выводы делят один канал таймера — например, PA0 и PA15, — и одновременно их не включить. По умолчанию ШИМ 8-битный на 1 кГц, и то и другое меняется: analogWriteFrequency(20000) уберёт писк мотора, analogWriteResolution(12) даст 4096 ступеней яркости.

Выводы с подвохом

  • PA13 и PA14 — линии ST-Link. Стоит вызвать для них pinMode(), и программатор перестанет видеть плату. Как её вернуть, написано в таблице ошибок прошивки ниже.
  • PA11 и PA12 — USB. Займёте их — пропадёт порт.
  • PC13, PC14, PC15 — слабые выводы: ток не больше 3 мА, нагрузку они могут только замыкать на землю, а питать не могут. На PC13 светодиод, на PC14 и PC15 — кварц часов.
  • PA15, PB3, PB4 после включения заняты отладкой, но ядро освобождает их само, как только скетч вызывает для них pinMode(). Их можно занимать.

Как установить поддержку STM32 в Arduino IDE

Нужен пакет «STM32 MCU based boards» от STMicroelectronics, его ещё называют STM32duino. Последняя версия на октябрь 2026 года — 3.0.0, она вышла в июле. В Arduino IDE 2 откройте «Файл → Параметры» и вставьте в поле «Дополнительные ссылки для менеджера плат» адрес:

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

Затем откройте менеджер плат — значок платы на левой панели, — найдите «STM32 MCU based boards» и нажмите «Установить». Пакет большой: скачивается около 410 МБ, на диске займёт почти 3 ГБ, и большая часть этого — компилятор. Если установка оборвалась, запустите её ещё раз.

В Trema IDE адрес вставлять не нужно: найдите в окне плат семейство STM32 — оно подписано «Blue Pill, Black Pill, Nucleo, Discovery» — и нажмите «Установить». Пакет скачается с российского зеркала.

Старое ядро Роджера Кларка из старых статей

Многие инструкции про Blue Pill написаны в 2016–2020 годах под другое ядро — Arduino_STM32 Роджера Кларка, его ещё называют libmaple. Там советуют скачать Arduino_STM32-master.zip, распаковать его в папку hardware и ставить «Arduino SAM Boards». Это ядро давно не обновляют: последняя сборка в каталоге, откуда его ставят, — от сентября 2022 года. Для новых проектов берите официальное.

Старое ядро нужно, только если вы собираете готовый старый проект — например, популярный осциллограф на STM32F103C8T6 с TFT-экраном. С официальным ядром такие скетчи не собираются, и ошибка 'pwmWrite' was not declared in this scope — верный признак, что скетч писали под старое (разбор ошибок — в таблице ниже). Старое ядро ставится через адрес http://dan.drown.org/stm32duino/package_STM32duino_index.json, плата в нём называется «Generic STM32F103C series». В Trema IDE этот адрес добавляют в «Платы → Дополнительно → Свои каталоги плат», а нужный ему старый компилятор приходит с нашего зеркала.

Что поменялось в версии 3.0

Ядро перешло на общую основу Arduino — ту же, что у UNO R4 и Raspberry Pi Pico. Для скетчей заметно одно: класс аппаратного порта теперь называется Uart, а строка HardwareSerial Serial2(PA3, PA2); из старых примеров даёт ошибку conflicting declaration. Библиотеки, которые принимают порт как HardwareSerial&, работают с ним по-прежнему: Uart — его наследник.

Какой пункт выбрать в меню плат

В меню «Инструменты → Плата → STM32 MCU based boards» выберите группу, а потом в пункте «Board part number» — свою плату:

Ваша платаГруппа в менюBoard part number
Blue Pill на STM32F103C8T6«Generic STM32F1 series»«BluePill F103C8»
Blue Pill на STM32F103C6T6«Generic STM32F1 series»«BluePill F103C6 (32K)»
Blue Pill, если не хватает 64 КБ«Generic STM32F1 series»«BluePill F103CB (or C8 with 128k)»
Black Pill на STM32F411CEU6«Generic STM32F4 series»«BlackPill F411CE»
Black Pill на STM32F401CCU6«Generic STM32F4 series»«BlackPill F401CC»
Black Pill на STM32F401CEU6«Generic STM32F4 series»«BlackPill F401CE»

Ниже в том же меню — остальные настройки платы. Обычно меняют только Upload method и USB support, остальное можно оставить как есть:

ПунктЧто выбрать
Upload methodКак прошивать. По умолчанию стоит STM32CubeProgrammer (SWD): этому способу нужна отдельная программа ST с тем же названием. С ST-Link выбирайте OpenOCD STLink (SWD) — всё нужное уже есть в пакете
USB support (if available)По умолчанию None: разъём USB платы только даёт питание. Чтобы монитор порта работал через него, выберите CDC (generic 'Serial' supersede U(S)ART)
U(S)ART supportОставьте Enabled (generic 'Serial'). При Disabled из программы пропадёт Serial
OptimizeSmallest (-Os default) — самый компактный код. Не влезает программа — пункты с LTO сожмут её ещё
C Runtime LibraryNewlib Nano + Float Printf — если в программе sprintf() или printf() с дробными числами (%f). Без этого пункта вместо числа будет пусто

В Trema IDE у пункта «Generic STM32F1 series» стоит пометка «Это Blue Pill (STM32F103C8T6)», у «Generic STM32F4 series» — «Это Black Pill (STM32F401, STM32F411)». Настройки открываются кнопкой «Параметры платы» на верхней панели.

Как прошить STM32: ST-Link, переходник или кабель USB

У Arduino Uno один путь — кабель. У STM32 их несколько, и какой подойдёт, зависит от платы и от того, что есть под рукой. Выберите свой случай:

Blue Pill + ST-Link V2Upload methodOpenOCD STLink (SWD)Что сделать с платойНичего: перемычки остаются как есть, BOOT0 в положении 0ПортНе нужен: ST-Link работает без COM-портаSTM32CubeProgrammerНе нужна: OpenOCD приходит вместе с пакетом STM32Самый надёжный способ: так прошивается почти любая Blue Pill
Upload method — пункт меню «Инструменты» (в Trema IDE — «Параметры платы»). По умолчанию там стоит STM32CubeProgrammer (SWD), поэтому без этой программы первая прошивка почти всегда заканчивается ошибкой.

STM32CubeProgrammer: нужна ли она

Четыре способа в Upload method — SWD, Serial, DFU и J-Link с приставкой STM32CubeProgrammer — вызывают одноимённую программу ST. В пакет она не входит и ставится отдельно. Если её нет, прошивка заканчивается так:

STM32CubeProgrammer not found (STM32_Programmer_CLI.exe).

С сайта ST из России её не скачать: ST закрыла загрузку своих программ для России в 2022 году. Поэтому основной способ в этой статье — ST-Link с пунктом OpenOCD STLink (SWD): программа OpenOCD входит в пакет STM32 и ставится вместе с ним. Если STM32CubeProgrammer у вас уже установлена в папку по умолчанию, ядро найдёт её само, и заработают остальные способы из меню.

ST-Link V2 — программатор размером с флешку. У нас в магазине есть и ST-Link V2, и Blue Pill на STM32F103C8T6. Программатор подключается к четырём штырькам на торце платы — к разъёму SWD. Проводов нужно три или четыре, смотря откуда плата берёт питание:

ST-Link V2в USB компьютера3.3V3.3SWDIODIOSWCLKCLKGNDGNDBlue Pill, разъём SWDПитание 3,3 В плата берёт от ST-LinkПлата больше ни от чего не питается. GND обязателен всегда.
Подписи SWDIO, SWCLK, GND и 3.3V смотрите на корпусе своего ST-Link: у разных партий выводы на десятиконтактном разъёме разведены по-разному. Рядом с 3.3V там стоят выводы 5.0V — перепутаете, и плата сгорит. У Black Pill на торце те же четыре вывода и в том же порядке.

Осторожно с питанием. На десятиконтактном разъёме ST-Link рядом с выводами 3.3V стоят выводы 5.0V. Если провод попадёт на 5.0V, пять вольт уйдут прямо в питание чипа, и плата сгорит. Подписи на корпусе у старых ST-Link бывают неверными, поэтому при сомнении прозвоните разъём мультиметром без питания: два вывода GND замкнуты между собой, по ним видно, как он разведён.

Дальше в меню:

  1. Плата — «Generic STM32F1 series» (для Black Pill — F4), Board part number — ваша плата.
  2. Upload method — OpenOCD STLink (SWD).
  3. Порт выбирать не нужно: у ST-Link COM-порта нет. Нажмите «Загрузить».

Если всё прошло удачно, в конце сообщений внизу окна будут строки ** Programming Finished ** и ** Verified OK **, после чего плата перезапустится с новой программой. Перемычки и кнопки при этом трогать не нужно.

Драйвер ST-Link в Windows

OpenOCD работает с ST-Link напрямую по USB, и для этого Windows нужен драйвер WinUSB. Если программатор подключён, а прошивка пишет libusb_open() failed, драйвера нет. Он ставится вместе с STM32CubeIDE или STM32CubeProgrammer, а без них WinUSB поставит бесплатная программа Zadig (zadig.akeo.ie):

  1. Подключите ST-Link и запустите Zadig.
  2. Выберите в списке «STM32 STLink». Если его нет, включите в меню «Options» пункт «List All Devices».
  3. Справа выберите WinUSB и нажмите «Install Driver» (если какой-то драйвер уже стоит, кнопка называется «Replace Driver»).
  4. Отключите ST-Link и подключите снова.

На школьном компьютере драйвер ставит администратор. С ST-Link V2-1, который встроен в платы Nucleo, Zadig помогает не всегда: надёжнее драйвер ST.

В Linux драйвер не нужен, но обычному пользователю нужны права на устройство. Создайте файл /etc/udev/rules.d/99-stlink.rules со строкой SUBSYSTEM=="usb", ATTR{idVendor}=="0483", ATTR{idProduct}=="3748", MODE="0666", выполните sudo udevadm control --reload-rules и переподключите ST-Link.

Через USB-UART-переходник: перемычка BOOT0

Этому способу нужна программа STM32CubeProgrammer. Если её нет, переходник всё равно пригодится: через него удобно смотреть Serial на PA9 и PA10.

В STM32F103 и F401/F411 зашит загрузчик, который принимает программу через выводы PA9 и PA10. Подойдёт переходник на CH340 или CP2102 с логикой 3,3 В: TX переходника — на PA10, RX — на PA9, GND — на G. Питание плата берёт от своего разъёма USB или от переходника — от чего-то одного. С переходника подключайте его 5V к выводу 5V платы или его 3.3V к выводу 3.3; пять вольт на вывод 3.3 не подавайте никогда.

Переставьте перемычку BOOT0 в положение 1 и нажмите RESET: плата перейдёт в загрузчик. В меню выберите Upload method «STM32CubeProgrammer (Serial)» и порт переходника. После прошивки верните BOOT0 в 0 и снова нажмите RESET — иначе плата при каждом включении будет ждать прошивку, а не запускать программу.

Перемычки BOOT0 и BOOT1: что в каком положении

У Blue Pill две жёлтые перемычки. BOOT0 — та, что ближе к краю платы с выводами G, G, 3.3; вторая — BOOT1, она подключена к PB2. Положение «1» — со стороны чипа, «0» — со стороны разъёма USB. Чип смотрит на них только в момент сброса, поэтому после перестановки нажмите RESET.

BOOT0BOOT1Что запустится
0любоеОбычная работа: запускается ваша программа. Так перемычки стоят с завода
10Загрузчик, зашитый в чип: он ждёт прошивку через PA9 и PA10 (у Black Pill — ещё и по USB)
11Запуск из оперативной памяти — в Arduino не нужен

Если после перестановки и сброса плата всё равно запускает прежнюю программу, вы переставили BOOT1. У Black Pill перемычек нет: вместо BOOT0 — кнопка, а BOOT1 на плате всегда в положении 0.

Black Pill по кабелю USB: режим DFU

Этот способ тоже работает только через STM32CubeProgrammer: другого пункта для режима DFU в пакете нет. Загрузчик в чипах F401 и F411 умеет принимать программу прямо по USB. Чтобы войти в него, держите BOOT0, нажмите и отпустите NRST, а через полсекунды отпустите BOOT0. Компьютер увидит устройство «STM32 BOOTLOADER» — COM-порта у него нет. В меню выберите «STM32CubeProgrammer (DFU)». Если программа не видит плату, а в диспетчере устройств у «STM32 BOOTLOADER» жёлтый значок, поставьте драйвер, который лежит в папке программы: Drivers\DFU_Driver, файл STM32Bootloader.bat, запуск от имени администратора.

Иногда Black Pill на F411 в режим DFU не входит. Загрузчик определяет частоту кварца по внутреннему генератору, а тот зависит от температуры и в холодной комнате может ошибиться. WeAct советует слегка согреть чип пальцем и войти в загрузчик ещё раз. Если не помогло, отключите всё от PA10: шум на этом выводе загрузчик может принять за начало связи по UART.

Blue Pill по кабелю USB: HID-загрузчик

Загрузчик в чипе F103 по USB не работает — только через PA9 и PA10. Чтобы прошивать Blue Pill одним кабелем, в неё один раз заливают сторонний загрузчик — HID Bootloader 2.2, файл hid_generic_pc13.bin из проекта Serasidis на GitHub. Драйвер ему не нужен. Дальше в меню выбирают Upload method «HID Bootloader 2.2» и включают USB support → CDC: без этого плата не сможет сама перезапуститься в загрузчик. Если она перестала уходить в него сама, переставьте перемычку BOOT1 в 1, нажмите RESET, прошейте и верните BOOT1 в 0.

Сам загрузчик — готовый файл, а не скетч, и кнопка «Загрузить» его не зальёт: нужна STM32CubeProgrammer или OpenOCD из командной строки. Поэтому способ подходит тем, кто уже освоился, и выручает, когда плата спрятана в корпус и до разъёма SWD не добраться. Учтите: на платах с неправильным резистором на линии USB (о нём ниже) Windows может не увидеть и загрузчик.

Первая программа: светодиод на PC13

Светодиод на обеих платах подключён к PC13 «наоборот»: вывод не отдаёт ток, а принимает, поэтому LOW зажигает его, а HIGH гасит. LED_BUILTIN в пакете STM32 уже указывает на PC13. Новая Blue Pill часто приходит с мигающей заводской программой, поэтому в нашем скетче светодиод коротко вспыхивает раз в секунду — так сразу видно, что прошилась ваша.

// Маячок для Blue Pill и Black Pill: светодиод на выводе PC13.
// Он подключён «наоборот»: LOW зажигает его, HIGH гасит.
// Короткая вспышка раз в секунду не похожа на заводскую программу,
// поэтому сразу видно, что прошилась именно ваша.

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);   // LED_BUILTIN — это PC13 у обеих плат
}

void loop() {
  digitalWrite(LED_BUILTIN, LOW);    // зажгли
  delay(100);
  digitalWrite(LED_BUILTIN, HIGH);   // погасили
  delay(900);
}

Для Blue Pill скетч занимает 9 332 байта — 14 % памяти. Почти всё это — само ядро: настройка тактирования и таймеров. Оно входит в любой скетч, а дальше размер растёт уже за счёт вашего кода.

Монитор порта молчит: куда уходит Serial

Самая частая жалоба на Blue Pill и Black Pill: «программа работает, светодиод мигает, а COM-порта нет». У этих плат USB делает сам чип, и включается это пунктом меню USB support, который по умолчанию стоит в None. Пока он выключен, Serial пишет на выводы PA9 и PA10, а в разъёме USB тишина.

USB support: None, смотрим порт платыSerial в программеПишет на PA9 (TX), а к нему ничего не подключеноЧто видит компьютерНичего: USB платы в этом режиме не работает, плата толькоберёт от него питаниеПорта нет: USB платы выключен в меню
Так ведут себя Blue Pill и Black Pill с пакетом STM32 3.0.0. Монитор порта через USB платы работает, только когда плата подключена своим кабелем: через ST-Link Serial не идёт.

Выберите USB support → CDC (generic 'Serial' supersede U(S)ART), прошейте плату заново и подключите её к компьютеру её собственным кабелем USB: через ST-Link монитор порта не работает. Если ST-Link остаётся подключённым, снимите провод 3.3 — питание теперь идёт от кабеля. Порт появится, как только программа запустится, ещё до setup(). Если его нет и тогда, программа не запускается вовсе — например, выбран пункт меню не для вашего чипа.

Скетч ниже сам проверяет пункт меню и не соберётся, если USB не включён, а заодно читает аналоговый вход PA0 с полной точностью:

// Монитор порта через разъём USB самой платы и аналоговый вход PA0.
// Порт появится, только если в меню «Инструменты» выбрано
// USB support: CDC (generic 'Serial' supersede U(S)ART).
// Без этого пункта Serial уходит на выводы PA9 и PA10, а не в USB.
#if !defined(USBD_USE_CDC) || defined(DISABLE_GENERIC_SERIALUSB)
#error "Выберите в меню: USB support -> CDC (generic 'Serial' supersede U(S)ART)"
#endif

const int SENSOR_PIN = PA0;   // средняя нога потенциометра; крайние — на 3.3 и G

void setup() {
  Serial.begin(115200);        // по USB скорость не важна, но пусть будет
  analogReadResolution(12);    // 0–4095 вместо 0–1023, как у Uno
}

void loop() {
  int raw = analogRead(SENSOR_PIN);
  float volts = raw * 3.3 / 4095;   // на вход — не больше 3,3 В
  Serial.print("PA0: ");
  Serial.print(raw);
  Serial.print("  = ");
  Serial.print(volts, 2);
  Serial.println(" В");
  delay(500);
}

Как настроить монитор порта и что в него выводить — в статье про монитор порта.

«USB-устройство не опознано»: резистор на Blue Pill

Если USB support включён, а Windows пишет «USB-устройство не опознано», сначала попробуйте другой кабель и другой разъём компьютера. Не помогло — виноват может быть резистор на самой плате. По стандарту USB линия D+ (PA12) подтягивается к 3,3 В через 1,5 кОм, а на многих Blue Pill там стоит 10 или 4,7 кОм. Одни компьютеры с этим работают, другие — нет. Обычно это резистор R10 возле разъёма USB; надёжнее найти его мультиметром — он стоит между PA12 и 3,3 В. Его меняют на 1,5 кОм или впаивают параллельно ему ещё один между PA12 и 3,3 В: к 10 кОм — 1,8 кОм, к 4,7 кОм — 2,2 кОм. Вместе получится около 1,5 кОм. У Black Pill такой беды нет.

Ошибки прошивки и сборки

Что пишет прошивка

СообщениеЧто это значит и что делать
STM32CubeProgrammer not found (STM32_Programmer_CLI.exe).В Upload method стоит способ через STM32CubeProgrammer — по умолчанию именно он. Есть ST-Link — выберите OpenOCD STLink (SWD). Если программа установлена, но не в папку по умолчанию, добавьте её папку bin в переменную PATH
Error: open failedСледом идёт строка «** OpenOCD init failed **»: OpenOCD не нашёл ST-Link. Программатор не подключён, кабель-удлинитель без линий данных или ST-Link занят другой программой — STM32CubeIDE, ST-Link Utility. Если выше есть строка libusb_open() failed, дело в драйвере
Error: libusb_open() failed with LIBUSB_ERROR_NOT_SUPPORTEDWindows видит ST-Link, но драйвера для OpenOCD у него нет. Поставьте WinUSB программой Zadig, как описано выше
Error: init mode failed (unable to connect to the target)ST-Link работает, а до чипа не достучался: перепутаны DIO и CLK, нет общей земли, плата без питания или прошлый скетч занял PA13 и PA14. В последнем случае поставьте BOOT0 в 1, нажмите RESET и прошейте плату, а потом верните BOOT0 в 0 и снова нажмите RESET — иначе новая программа не запустится. На Black Pill: держите BOOT0, нажмите NRST, отпустите BOOT0, прошейте и ещё раз нажмите NRST
Error: ST-Link version does not support DAP direct transportВнутренняя прошивка ST-Link старше версии V2J24. Обновляет её только утилита ST, а она с сайта ST из России не скачивается. Проще взять другой ST-Link
** Programming Failed **Связь с чипом есть, а записать программу не вышло. Две частые причины: на плате редкий клон, которого OpenOCD не знает, или программа больше 64 КБ при пункте «BluePill F103CB (or C8 with 128k)» — OpenOCD узнаёт объём памяти у самого чипа, а C8 сообщает о себе 64 КБ

Общие беды загрузки — не тот порт, кабель без линий данных, порт занят — разобраны в статье про ошибки загрузки.

Что пишет компилятор

ОшибкаЧто это значит и что делать
undefined reference to `Serial2'Serial2 в ядре упомянут, но не создан. Добавьте в начало скетча строку Uart Serial2(PA3, PA2);
conflicting declaration 'arduino::HardwareSerial Serial2'Скетч написан для ядра до версии 3.0, где порт создавали строкой HardwareSerial Serial2(PA3, PA2). Замените HardwareSerial на Uart
invalid initialization of reference of type 'arduino::HardwareSerial&' from expression of type 'USBSerial'Библиотеке нужен аппаратный порт, а Serial с пунктом USB support → CDC идёт через USB. Передайте ей Serial1 (PA9 и PA10) или Serial2, объявив его строкой Uart Serial2(PA3, PA2);
'pwmWrite' was not declared in this scopeСкетч писали под старое ядро Роджера Кларка. В официальном ядре ШИМ включают через analogWrite(), а pinMode(вывод, PWM) пишут как pinMode(вывод, OUTPUT). pwmWrite() принимал числа до 65535 — чтобы их не пересчитывать, добавьте в setup() строку analogWriteResolution(16)
invalid conversion from 'int' to 'TIM_TypeDef*'Таймер в старом ядре создавали так: HardwareTimer timer(2). Сейчас пишут HardwareTimer *timer = new HardwareTimer(TIM2);
#error "Выберите в меню: USB support -> CDC …"Сборку остановил скетч из этой статьи: монитор порта через USB работает только с этим пунктом меню. Выберите его и соберите снова

Место под программу

64 КБ у Blue Pill — вдвое больше, чем у Uno, но расходуются они быстрее: ядро STM32 тяжелее, а USB добавляет к любому скетчу 10–13 КБ. Вот сколько занимают скетчи из этой статьи (пакет 3.0.0, настройки по умолчанию):

СкетчBlue Pill, из 65 536 байтBlack Pill F411, из 524 288
Blink: светодиод на PC139 332 байта — 14 %9 820 байт — 2 %
Вывод в Serial через PA9, analogRead()13 108 байт — 20 %12 380 байт — 2 %
То же через USB (USB support → CDC)22 864 байта — 34 %21 452 байта — 4 %

Если программа для Blue Pill не влезает, сначала попробуйте пункт Optimize «Smallest (-Os) with LTO». У Black Pill места хватит и на графику, и на большие таблицы. Как читать отчёт о памяти после сборки, рассказано в статье про память Arduino.

Чем программировать

STM32 в Trema IDE

Trema IDE — русская среда, совместимая с Arduino IDE: те же скетчи .ino и тот же официальный пакет STM32. Пакет ставится из окна плат с российского зеркала вместе с компилятором и OpenOCD — без ручных ссылок и VPN. Upload method и USB support открываются кнопкой «Параметры платы», а если скетч с PA5 или PC13 собрать для Uno, среда подскажет, что он написан для STM32.

  • Пакет STM32 вместе с компилятором и OpenOCD ставится с российского зеркала
  • Upload method и USB support — кнопкой «Параметры платы»
  • Скетч с PA5 или PC13, собранный для Uno, — подсказка, что он написан для STM32
  • Ошибки сборки — с объяснением по-русски и переходом к строке

Вопросы

Частые вопросы про STM32 в Arduino IDE

Не нашли ответа? Спросите нас

Можно ли программировать STM32 в Arduino IDE?

Да. Нужен официальный пакет STMicroelectronics «STM32 MCU based boards», его ещё называют STM32duino: после установки в меню появятся Blue Pill, Black Pill, Nucleo и другие платы. Скетчи пишутся так же, как для Uno, — setup(), loop(), digitalWrite(), Serial. Не подойдут только библиотеки, которые обращаются к регистрам AVR напрямую.

Чем прошить STM32F103C8T6 (Blue Pill)?

Проще всего программатором ST-Link V2: три-четыре провода к разъёму SWD на торце платы и пункт Upload method «OpenOCD STLink (SWD)» — лишних программ не нужно. Второй путь — USB-UART-переходник на PA9 и PA10 с перемычкой BOOT0 в положении 1, но ему нужна STM32CubeProgrammer. Одним кабелем USB новую Blue Pill не прошить: загрузчик в чипе F103 по USB не работает.

Обязательно ли ставить STM32CubeProgrammer?

Нет. Она нужна только пунктам Upload method, в названии которых есть её имя. С ST-Link выбирайте «OpenOCD STLink (SWD)»: OpenOCD входит в пакет STM32 и ставится вместе с ним. Скачать STM32CubeProgrammer с сайта ST из России не получится — ST закрыла загрузку своих программ для России в 2022 году.

Почему у Blue Pill или Black Pill нет COM-порта?

USB у этих плат делает сам чип, а не отдельный мост, и по умолчанию он выключен: пункт USB support стоит в None, и Serial пишет на выводы PA9 и PA10. Выберите USB support → CDC (generic 'Serial' supersede U(S)ART), прошейте плату заново и подключите её собственным кабелем USB — порт появится, как только программа запустится. Если Windows пишет «USB-устройство не опознано», у Blue Pill виноват может быть резистор подтяжки линии D+: 10 или 4,7 кОм вместо 1,5.

Какую плату выбрать в Arduino IDE для Blue Pill?

«Generic STM32F1 series», а в пункте Board part number — «BluePill F103C8». Если на чипе написано C6T6, выберите «BluePill F103C6 (32K)»: под пунктом для C8 такая плата не запустит даже Blink.

Какую плату выбрать для Black Pill на STM32F411CEU6?

«Generic STM32F4 series», Board part number — «BlackPill F411CE», для F401 — «BlackPill F401CC» или «BlackPill F401CE». Пункты «BlackPill F103C8» и «BlackPill F103CB (or C8 with 128k)» в списке F1 — это другая, старая плата на чипе Blue Pill; для Black Pill от WeAct они не подходят.

Как подключить ST-Link V2 к Blue Pill?

К разъёму SWD на торце: SWDIO — к DIO, SWCLK — к CLK, GND — к GND, 3.3V — к 3.3. Провод 3.3V подключайте, только если плата больше ни от чего не питается — ни от USB, ни от блока питания. Подписи берите с корпуса своего ST-Link и будьте внимательны: рядом с выводами 3.3V на нём стоят выводы 5.0V, и пять вольт сожгут чип. При сомнении прозвоните разъём мультиметром.

Для чего перемычки BOOT0 и BOOT1 на Blue Pill?

Они выбирают, что запустится после сброса. BOOT0 в положении 0 — ваша программа, так перемычки стоят обычно. BOOT0 в 1 и BOOT1 в 0 — загрузчик, зашитый в чип: он ждёт прошивку через PA9 и PA10. Чип смотрит на перемычки только в момент сброса, поэтому после перестановки нажмите RESET. BOOT0 — перемычка ближе к краю платы с выводами G, G, 3.3.

Какие выводы STM32F103C8T6 выдерживают 5 В?

PA8–PA15, PB3, PB4 и PB6–PB15 — в паспорте они помечены FT. Не выдерживают PA0–PA7, PB0, PB1, PB5 и PC13–PC15. Пять вольт вывод держит только как цифровой вход без внутренней подтяжки и только пока плата включена, а сам выдаёт 3,3 В.

Как прошить Black Pill по USB без программатора?

Через загрузчик в чипе, в режиме DFU: держите BOOT0, нажмите и отпустите NRST, через полсекунды отпустите BOOT0. Компьютер увидит устройство «STM32 BOOTLOADER»; в Upload method выберите «STM32CubeProgrammer (DFU)». Этому способу нужна STM32CubeProgrammer, а без неё Black Pill шьют через ST-Link.

На плате CKS32F103 или GD32F103 вместо STM32 — она будет работать?

Обычно да: это совместимые чипы с теми же выводами, и большинство скетчей на них работает. Отличия бывают: GD32 работает до 108 МГц, у некоторых клонов капризничает USB, а редкие клоны не узнаёт OpenOCD. Что стоит на самом деле, покажет скетч из статьи: у настоящего STM32F103 номер ядра 0x411FC231 и код производителя 0x20 — STMicroelectronics.

Почему не собирается HardwareSerial Serial2(PA3, PA2)?

В ядре STM32 3.0 класс аппаратного порта переименовали в Uart. Пишите Uart Serial2(PA3, PA2); — первым идёт RX, вторым TX. Старая строка даёт ошибку «conflicting declaration 'arduino::HardwareSerial Serial2'».

STM32 или ESP32 — что выбрать?

Если нужны Wi-Fi или Bluetooth — ESP32: у Blue Pill и Black Pill радио нет. STM32 берут за таймеры для моторов и ШИМ и за точный АЦП, к тому же программу у неё не прерывает радио. Для умного дома удобнее ESP32, для станка, осциллографа или пульта — STM32.

Подойдут ли старые скетчи под ядро Роджера Кларка (libmaple)?

Без переделки — редко. Старое ядро Arduino_STM32 давно не обновляют, и в официальном нет его функций: pwmWrite(), режима PWM в pinMode(), прежней записи таймеров. Если проект целиком написан под старое ядро, проще поставить его: каталог dan.drown.org/stm32duino/package_STM32duino_index.json, плата «Generic STM32F103C series».

Сколько памяти у STM32F103C8T6 — 64 или 128 КБ?

По паспорту 64 КБ флеш-памяти и 20 КБ оперативной. У многих чипов внутри на деле 128 КБ, и для них в меню есть пункт «BluePill F103CB (or C8 with 128k)», но верхнюю половину производитель не проверяет, и на части плат она не работает. Через ST-Link и OpenOCD больше 64 КБ всё равно не записать: OpenOCD узнаёт объём памяти у самого чипа, а C8 сообщает о себе 64 КБ.

Blue Pill за вечер: от пакета до мигающего PC13

Скачайте Trema IDE, поставьте пакет STM32 с российского зеркала, подключите ST-Link и выберите OpenOCD STLink — светодиод мигнёт без сторонних программ. Дома — бесплатно навсегда.