Bluepill (STM32F103C8T6) to ekstremalnie tania wersja STM32, płytkę można kupić za ok 10 zł.


Mocny mikrokontroler STM32 może być wykorzystany do tanich, małych projektów dzięki temu układowi. Jednak nie posiada on wbudowanego programatora (jak w przypadku Nucleo), ale można wykorzystać

  1. ST-LINK z SWD z innej płytki Nucleo
  2. zewnętrzny, tani konwerter USB-UART o nazwie FTDI

Wariant pierwszy FTDI

Podłączenia:
FTDI -> STM32

RX -> A9
TX -> A10
VCC -> 5V
GND -> G (GND)

CTS i DTR niepodłączone.
Złącza VCC i GND dostarczają zasilanie do STM32.
Zasilamy całość z portu USB komputera -> FTDI -> STM32 (VCC).

Zworki

FTDI – 5V (a nie 3,3V – nie działa programowanie wtedy)
STM32 – górną zworkę (bliżej pinów G, G, 3,3V, R, …) należy przestawić w pozycję 1 (w prawo), dolna zostaje w pozycji 0, jak na zdjęciu, wg poradnika.

Programowanie i projekt ArduinoIDE odpalamy wg instrukcji:
https://www.electronicshub.org/getting-started-with-stm32f103c8t6-blue-pill/

Ustawienia w ArduinoIDE

Muszą zgadzać się z konfiguracją, zwłaszcza:

  1. Narzędzia – Upload method: SERIAL (!)
  2. Płytka: Generic STM32F103C series
  3. Variant – 64k
  4. Port (tu należy odczytać Win+X -> n -> Porty (COM, LPT))
  5. W Plik->Preferencje->Dodatkowe adresy URL do menadżera płytek wklejamy adres: http://dan.drown.org/stm32duino/package_STM32duino_index.json

Przykłady

Plik -> przykłady ->A_STM32_Examples -> Stubs -> Hello World

1
2
3
4
5
6
7
8
void setup() {
        Serial.begin(115200); // Ignored by Maple. But needed by boards using hardware serial via a USB to Serial adaptor
}

void loop() {
    Serial.println("Hello World!");
        delay(1000);
}

UWAGA! Nasz port COM (u mnie COM7) do FTDI stanie się teraz też konsolą UART STM32! Program kompilujemy, wgrywamy na urządzenie ikoną (->), łączymy konsolą Putty jako SERIAL z prędkością 115200 i np. portem COM odczytanym z menadżera urządzeń np. COM7. Możemy teraz widzieć „Hello World” w konsoli.

Wariant drugi – ST-LINK SWD

Jeśli posiadamy inną płytkę STM32 z programatorem ST-LINK, np. moja to Nucleo F103RB, możemy wykorzystać złącze SWD do programowania zewnętrznego urządzenia STM32. Zyskujemy łatwą komunikację np. ze środowiskiem uVision i MDK.

Hardware

  1. Usuwamy 2 zworki oznaczone ST-LINK z programatora (np. w płytce Nucleo F103RB), powodują one, że programator działa dla zewnętrznej płytki STM32
  2. Łączymy złącze CN4 z programatora ST-LINK (Nucleo F103RB) ze złączem programatora BluePill
    • Nucleo F103RB ST-LINK (od góry) SWD <-> STM32F103C8T6 BluePill
    • PIN1 VDD_TARGET – niepodłączony
    • PIN2 SWCLOCK -> SWCLK (BluePill pin obok GND)
    • PIN3 GND -> GND (BluePill skrajny)
    • PIN4 SWDIO -> SWD (BluePill pin obok 3,3V)
    • PIN5 NRST -> R (Reset pin na złączu 20)
    • PIN6 niepodłączony
    • 3,3V wyjście nie z ST-LINK tylko ze złącz F103RB -> 3,3V BluePill złącze programatora
  3. W środowisku ARDUINO IDE zaznacz: Narzędzia – Upload Method – ST-Link
  4. To wszystko. Nie mamy tylko konsoli UART zajętej przez Nucleo.

    FTDI i SWD razem

    Możnana zechcieć korzystać z ST-LINK SWD (do flashowania) oraz FTDI do terminala COM (przez USB). W tym celu podłączymy nasz układ przez 2 porty USB!. Zasada 1 – podłączamy jedno napięcie – w naszym przypadku 5V z portu FTDI do linii 5V STM32.

    1. Podłączamy SWD jak wyżej w poprzednim punkcie Z WYJĄTKIEM LINII 3,3 ze złącz F103 RB (sam ST-LINK nie posiada linii zasilania!), zatem podłączamy linie:
      SWD ST-LINK (Nucleo) => STM32 BluePill
      SWDCLOCK -> SWCLK,
      GND -> GND,
      SWDIO -> SWD
      NRST -> R (reset)
      3,3V – NIEPODŁĄCZONA!!!
    2. Podłączamy FTDI:
      FTDI => STM32 BluePill
      VCC(FTDI)->5V(STM32),
      GND(FTDI) -> GND(STM32),
      RX(FTDI)-> PB10 (TX UART3, Serial3),
      TX->PB11 (RX UART3, Serial3).

    Z jakiegoś powodu, jeśli korzystamy z SWD nie działa komunikacja z UART1 (dopiero po odłączeniu SWD rusza). Z kolei port UART2 nie jest 5V tolerant, zostaje UART3.
    Kod ArduinoIDE, program BLINK, po wykonaniu cyklu wyrzuca na UART3 komunikat:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void setup() {
      // initialize digital pin PB1 as an output.
      pinMode(PC13, OUTPUT);
      Serial3.begin(115200);
    }

    // the loop function runs over and over again forever
    void loop() {
      digitalWrite(PC13, HIGH);   // turn the LED on (HIGH is the voltage level)
      delay(2000);              // wait for a second
      digitalWrite(PC13, LOW);    // turn the LED off by making the voltage LOW
      delay(2000);              // wait for a second
      Serial3.println("Hello3 World!");
    }

    Wady: 2 przewody USB do komputera. Zalety: Szybkość flashowania, dostępność ST-LINK z programów STM32CubeIDE, Keil uVision (w przypadku korzystania tylko z FTDI musimy flashować przez zewnętrzny program).

C, STM32