1. Ідентифікація та підготовка плати
STM32F103C8T6 (також відома як "Blue Pill") - потужна плата розробника на базі 32-бітного мікроконтролера ARM Cortex-M3. Перед початком роботи ознайомтесь з основними компонентами плати та їх призначенням.
flowchart TD
subgraph BLUEPILL["STM32F103C8T6 (Blue Pill)"]
direction TB
subgraph PINOUT["Контакти"]
direction LR
PA["PA0-PA15
Піни порту A"]
PB["PB0-PB15
Піни порту B"]
PC["PC13-PC15
Піни порту C"]
end
subgraph JUMPERS["Перемички (Jumpers)"]
BOOT0["BOOT0
Перемичка"]
BOOT1["BOOT1
Перемичка"]
end
subgraph CONNECTORS["Інтерфейси"]
USB["Micro USB
порт"]
SWD["SWD
програматор"]
end
LED["Вбудований
LED (PC13)"]
RESET["Кнопка
RESET"]
PINOUT --- JUMPERS
PINOUT --- CONNECTORS
PINOUT --- LED
PINOUT --- RESET
end
classDef pins fill:#f96,stroke:#333,stroke-width:2px
class PA,PB,PC pins
classDef components fill:#9ef,stroke:#333,stroke-width:2px
class BOOT0,BOOT1,USB,SWD,LED,RESET components
1.1 Ключові елементи плати
- Перемички BOOT0 та BOOT1 - визначають режим завантаження мікроконтролера
- Вбудований світлодіод - підключений до піна PC13, зручний для демонстрації роботи програм
- Micro USB порт - для живлення та програмування (після встановлення завантажувача)
- SWD роз'єм - для програмування та налагодження через ST-Link V2
- Кнопка Reset - для перезавантаження мікроконтролера
STM32F103C8T6 працює на логічних рівнях 3.3В, а НЕ 5В! Підключення 5В-логіки безпосередньо до входів мікроконтролера може пошкодити його. При роботі з 5В пристроями (наприклад, Arduino) використовуйте логічні конвертери рівнів.
2. Необхідні інструменти та компоненти
Для початку роботи з STM32F103C8T6 вам знадобляться:
2.1 Апаратне забезпечення
- Плата STM32F103C8T6 (Blue Pill)
- USB-to-TTL конвертер з підтримкою 3.3В логіки (для завантаження bootloader)
- ST-Link V2 програматор (альтернативний та більш швидкий метод прошивки)
- Кабель Micro-USB для підключення до комп'ютера
- З'єднувальні дроти типу Dupont "мама-мама" та "тато-мама"
2.2 Програмне забезпечення
Якщо ви плануєте використовувати лише ST-Link V2 для програмування, можна пропустити встановлення Flash Loader Demonstrator та завантаження bootloader. Однак наявність bootloader дає більше гнучкості при розробці.
3. Підготовка та прошивка завантажувача (bootloader)
Щоб мати можливість програмувати STM32 через Arduino IDE та USB, необхідно спочатку встановити спеціальний завантажувач. Цей процес виконується один раз.
3.1 Налаштування перемичок для режиму прошивки
flowchart LR
subgraph NORMAL["Звичайний режим
(для роботи програм)"]
BOOT0_0["BOOT0 = 0"]
BOOT1_0["BOOT1 = 0"]
end
subgraph BOOTLOADER["Режим прошивки bootloader
(через USB-TTL)"]
BOOT0_1["BOOT0 = 1"]
BOOT1_X["BOOT1 = 0"]
end
subgraph FLASH["Режим програмування Flash
(через ST-Link)"]
BOOT0_0F["BOOT0 = 0"]
BOOT1_0F["BOOT1 = 0"]
end
- Знайдіть на платі перемички BOOT0 та BOOT1 (зазвичай вони жовтого кольору)
- Для прошивки завантажувача встановіть такі положення:
- BOOT0 = 1 (перемичка ближче до кнопки Reset)
- BOOT1 = 0 (перемичка ближче до USB-порту)
3.2 Підключення USB-to-TTL конвертера
flowchart LR
subgraph USBTTY["USB-to-TTL конвертер"]
TTY_GND["GND"]
TTY_5V["5V/3.3V"]
TTY_TX["TX"]
TTY_RX["RX"]
end
subgraph STM32["STM32F103C8T6"]
STM_GND["GND"]
STM_3V3["3.3V"]
STM_SWCLK["SWCLK"]
STM_SWDIO["SWDIO"]
end
ST_GND --> STM_GND
ST_3V3 --> STM_3V3
ST_SWCLK --> STM_SWCLK
ST_SWDIO --> STM_SWDIO
- Підключіть USB-to-TTL конвертер до STM32 за такою схемою:
- GND (конвертер) → GND (STM32)
- 5V або 3.3V (конвертер) → 5V (STM32)
- TX (конвертер) → A10/RX1 (STM32)
- RX (конвертер) → A9/TX1 (STM32)
- Підключіть USB-to-TTL конвертер до USB порту комп'ютера
Переконайтеся, що ваш USB-to-TTL конвертер працює на рівнях 3.3В, або використовуйте логічний конвертер для RX/TX ліній! Підключення 5В-логіки до пінів STM32 може пошкодити мікроконтролер.
3.3 Визначення COM-порту
- Відкрийте Диспетчер пристроїв Windows:
- Натисніть правою кнопкою миші на "Цей ПК" → "Керування" → "Диспетчер пристроїв"
- Розкрийте розділ "Порти (COM та LPT)"
- Знайдіть пристрій, що відповідає вашому USB-to-TTL конвертеру (наприклад, "USB Serial Port (COM3)")
- Запам'ятайте номер COM-порту (наприклад, COM3)
Якщо ви не впевнені, який саме COM-порт відповідає вашому конвертеру, відключіть його, перевірте список портів, потім підключіть знову і подивіться, який порт з'явився.
3.4 Прошивка завантажувача (bootloader)
- Завантажте та встановіть програму STM32 Flash Loader Demonstrator
- Завантажте архів з bootloader з GitHub (rogerclarkmelbourne/STM32duino-bootloader) та розпакуйте його
- Запустіть програму Flash Loader Demonstrator та виконайте такі кроки:
- Виберіть COM-порт вашого USB-to-TTL конвертера
- Натисніть "Next"
- Програма має підключитися до мікроконтролера (повинен з'явитися зелений індикатор)
- Натисніть "Next" → виберіть тип мікроконтролера "STM32F1_Medium-density_64K"
- Натисніть "Next" → виберіть опцію "Download to device"
- Натисніть "..." поруч із полем шляху
- Перейдіть до розпакованої папки з bootloader, потім у підпапку "binaries"
- Виберіть файл "generic_boot20_pc13.bin" (важливо вибрати правильний файл!)
- Переконайтеся, що встановлені прапорці "Erase necessary pages" та "Verify after download"
- Натисніть "Next" і дочекайтеся завершення процесу прошивки
- Після успішного завершення закрийте програму
4. Налаштування Arduino IDE
Після встановлення завантажувача необхідно налаштувати Arduino IDE для роботи з платою STM32.
4.1 Встановлення пакета плат STM32
- Завантажте архів з GitHub (rogerclarkmelbourne/Arduino_STM32) та розпакуйте його
- Перейдіть до папки ваших скетчів Arduino (зазвичай Документи\Arduino)
- Створіть у ній папку "hardware" (якщо її ще немає)
- Скопіюйте розпаковану папку Arduino_STM32-master в папку hardware
- Перезапустіть Arduino IDE, щоб зміни вступили в силу
4.2 Вибір плати в Arduino IDE
- Відкрийте Arduino IDE
- Перейдіть до меню Інструменти → Плата
- Знайдіть новий розділ "STM32F1 Boards (Arduino_STM32)"
- Виберіть "Generic STM32F103C series"
5. Програмування плати через USB-to-TTL (з bootloader)
Тепер, коли завантажувач встановлено, ви можете програмувати плату через USB-to-TTL конвертер.
5.1 Налаштування перемичок для звичайного режиму
Важливо змінити положення перемичок після встановлення завантажувача!
- Встановіть перемички в такі положення:
- BOOT0 = 0 (перемичка ближче до USB-порту)
- BOOT1 = 0 (перемичка ближче до USB-порту)
5.2 Налаштування методу завантаження в Arduino IDE
- Перейдіть до меню Інструменти → Upload method
- Виберіть "Serial"
- Перейдіть до меню Інструменти → Порт
- Виберіть COM-порт, що відповідає вашому USB-to-TTL конвертеру
5.3 Створення та завантаження першого скетчу (приклад Blink)
- Перейдіть до меню Файл → Приклади → Basics → Blink (або A_STM32_Examples → Digital → Blink)
- Змініть пін світлодіода на PC13 (стандартний пін для вбудованого світлодіода на Blue Pill):
const int ledPin = PC13;
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}
- Натисніть кнопку "Завантажити" (стрілка вправо) в Arduino IDE
- Після успішного завантаження вбудований світлодіод на платі повинен почати блимати
Вбудований LED на платі STM32 підключений до PC13 з інверсною логікою: LOW вмикає світлодіод, а HIGH вимикає його, що протилежно звичній логіці в Arduino.
6. Програмування плати через ST-Link V2
Альтернативний та швидший метод програмування через SWD інтерфейс за допомогою ST-Link V2.
6.1 Підключення ST-Link V2
flowchart LR
subgraph STLINK["ST-Link V2"]
ST_GND["GND"]
ST_3V3["3.3V"]
ST_SWCLK["SWCLK"]
ST_SWDIO["SWDIO"]
end
subgraph STM
32["STM32F103C8T6"]
STM_GND["GND"]
STM_5V["5V"]
STM_A9["A9 (TX1)"]
STM_A10["A10 (RX1)"]
end
TTY_GND --> STM_GND
TTY_5V --> STM_5V
TTY_TX --> STM_A10
TTY_RX --> STM_A9
- Підключіть ST-Link V2 до STM32 за такою схемою:
- GND (ST-Link) → GND (STM32)
- 3.3V (ST-Link) → 3.3V (STM32)
- SWCLK (ST-Link) → SWCLK (STM32)
- SWDIO (ST-Link) → SWDIO (STM32)
- Підключіть ST-Link V2 до USB порту комп'ютера
Живлення можна подавати як від ST-Link (через 3.3V), так і від USB-порту плати. Для стабільної роботи рекомендується використовувати одне джерело живлення.
6.2 Налаштування перемичок для ST-Link
- Встановіть перемички в такі положення:
- BOOT0 = 0 (перемичка ближче до USB-порту)
- BOOT1 = 0 (перемичка ближче до USB-порту)
Програмування через ST-Link працює незалежно від положення перемичок, але для правильного запуску програми після програмування рекомендується встановити їх у стандартне положення (BOOT0=0, BOOT1=0).
6.3 Налаштування методу завантаження в Arduino IDE
- Перейдіть до меню Інструменти → Upload method
- Виберіть "STLink"
6.4 Завантаження скетчу через ST-Link
- Відкрийте або створіть скетч для завантаження
- Натисніть кнопку "Завантажити" (стрілка вправо) в Arduino IDE
- Після успішного завантаження програма почне виконуватися автоматично
Прошивка через ST-Link значно швидша порівняно з методом Serial. Крім того, вона дозволяє використовувати функції налагодження (debug) для більш ефективної розробки.
7. Робота з периферією та інтерфейсами
STM32F103C8T6 має багатий набір периферії та інтерфейсів для різноманітних проектів.
7.1 Цифрові входи/виходи
Робота з цифровими пінами аналогічна Arduino, але використовуються інші позначення пінів (PA0, PB1, PC13 тощо):
const int buttonPin = PA0; // Підключаємо кнопку до піна PA0
const int ledPin = PC13; // Вбудований світлодіод на PC13
void setup() {
pinMode(buttonPin, INPUT_PULLUP); // Вхід з підтягуючим резистором
pinMode(ledPin, OUTPUT); // Вихід для світлодіода
}
void loop() {
if (digitalRead(buttonPin) == LOW) { // Якщо кнопка натиснута
digitalWrite(ledPin, LOW); // Вмикаємо світлодіод
} else {
digitalWrite(ledPin, HIGH); // Вимикаємо світлодіод
}
}
7.2 Аналогові входи
STM32F103C8T6 має кілька аналогових входів з роздільною здатністю 12 біт (0-4095) порівняно з 10 біт (0-1023) в Arduino:
const int analogPin = PA0; // Аналоговий вхід на піні PA0
void setup() {
Serial.begin(9600); // Ініціалізація серійного порту
}
void loop() {
int adcValue = analogRead(analogPin); // Зчитуємо аналогове значення (0-4095)
float voltage = adcValue * (3.3 / 4095.0); // Перетворюємо у напругу
Serial.print("ADC: ");
Serial.print(adcValue);
Serial.print(", Voltage: ");
Serial.println(voltage);
delay(500);
}
7.3 I2C інтерфейс
STM32F103C8T6 має два I2C інтерфейси. Для роботи з I2C використовуйте бібліотеку Wire:
#include <Wire.h>
void setup() {
Wire.begin(); // Ініціалізація I2C як майстер
Serial.begin(9600); // Ініціалізація серійного порту
Wire.beginTransmission(0x68); // I2C адреса MPU6050
Wire.write(0x6B); // Регістр PWR_MGMT_1
Wire.write(0); // Вимикаємо сплячий режим
Wire.endTransmission(true);
}
void loop() {
Wire.beginTransmission(0x68);
Wire.write(0x3B); // Починаємо з регістра ACCEL_XOUT_H
Wire.endTransmission(false);
Wire.requestFrom(0x68, 6, true); // Запитуємо 6 байтів
int16_t accelX = Wire.read() << 8 | Wire.read();
int16_t accelY = Wire.read() << 8 | Wire.read();
int16_t accelZ = Wire.read() << 8 | Wire.read();
Serial.print("Accel: X=");
Serial.print(accelX);
Serial.print(", Y=");
Serial.print(accelY);
Serial.print(", Z=");
Serial.println(accelZ);
delay(500);
}
За замовчуванням I2C піни на STM32F103C8T6: PB6 (SCL) та PB7 (SDA) для I2C1.
7.4 SPI інтерфейс
Для роботи з SPI використовуйте бібліотеку SPI:
#include <SPI.h>
const int csPin = PA4; // Пін CS (Chip Select)
void setup() {
pinMode(csPin, OUTPUT);
digitalWrite(csPin, HIGH); // Деактивуємо CS
SPI.begin();
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE0);
SPI.setClockDivider(SPI_CLOCK_DIV8); // 72MHz/8 = 9MHz
}
void loop() {
digitalWrite(csPin, LOW); // Активуємо CS
SPI.transfer(0x55); // Надсилаємо байт даних
digitalWrite(csPin, HIGH); // Деактивуємо CS
delay(1000);
}
За замовчуванням SPI піни на STM32F103C8T6: PA5 (SCK), PA6 (MISO), PA7 (MOSI) для SPI1.
8. Усунення несправностей
Проблема |
Можлива причина |
Рішення |
Плата не визначається при підключенні |
Відсутні або некоректні драйвери |
Встановіть правильні драйвери для USB-to-TTL конвертера або ST-Link |
Помилка прошивки через USB-TTL |
Неправильні налаштування перемичок, проблеми з підключенням |
Перевірте положення перемичок BOOT0=1, BOOT1=0 для прошивки bootloader |
Програма не запускається після прошивки |
Неправильні перемички в режимі запуску |
Встановіть BOOT0=0, BOOT1=0 для звичайного режиму роботи |
Помилка програмування через ST-Link |
Неправильне підключення, проблеми з живленням |
Перевірте підключення SWDIO, SWCLK, GND, 3.3V |
Вбудований світлодіод не працює |
Використовується неправильний пін або логіка |
Використовуйте PC13 з інверсною логікою (LOW для увімкнення) |
При виникненні помилок зв'яжіться з COM-порт STM32 через послідовний монітор Arduino IDE (9600 бод) і додайте в код виведення діагностичних повідомлень для налагодження.
9. Корисні посилання
STM32F103C8T6 має значно більшу обчислювальну потужність і функціональність порівняно з Arduino, що робить її ідеальним вибором для більш складних проектів IoT, робототехніки та керування.
Важливе зауваження: Ми доклали зусиль, щоб ця інструкція була точною та корисною. Однак, ця інструкція надається як довідковий матеріал. Електронні компоненти можуть мати варіації, а схеми підключення залежать від конкретних умов та вашого обладнання. Ця інформація надається "як є", без гарантій повноти чи безпомилковості. Наполегливо рекомендуємо перевіряти специфікації вашого модуля (datasheet), звірятися з іншими джерелами та, за найменших сумнівів, звертатися до кваліфікованих фахівців, особливо при роботі з напругою 220В.