STM32duino II. — Ovládáme GPIO

Ve druhém díle o STM32duino si ukážeme práci s digitálními vstupy a výstupy. Ukážeme si příklad pro ovládání výstupu, vstupu a přivedeme PWM signál na GPIO.

Všechny díly seriálu o STM32duino:
STM32duino I. — Jak začít s STM32 jako Arduino
STM32duino II. — Ovládáme GPIO
STM32duino III. — Komunikujeme pomocí Serial (USART)
STM32duino IV. — Čteme teplotu a vlhkost z Si7021 (I2C sběrnice)

GPIO piny na STM32

STM32 mikrokontroléry mají zpravidla více GPIO pinů než Arduino. I když STM32 pracuje s napětím typicky 3.3 V, některé GPIO jsou 5V tolerantní — na vstup/výstup tedy můžete připojit 5V zařízení bez problému. Které piny konkrétně jsou 5V tolerantní, zjistíte z datasheetu daného mikrokontroléru. Pozor: 5V tolerance na vstupu neznamená, že výstupní logická jednička bude 5 V — výstup bude stále max. 3.3 V.

Vývojové desky Nucleo-64 obsahují dva typy konektorů — Arduino Uno rev. 3 a tzv. Morpho konektory. Na Arduino konektor je vyvedeno jen několik GPIO, na Morpho konektory jsou vyvedeny všechny.

Základní dokument pro práci s Nucleo deskou (pinout, popis jumperů, schéma zapojení) najdete na stránce produktu STM32F411 Nucleo.

Piny STM32 se označují podle portu a čísla: PA0 = nultý pin portu A, PB5 = pátý pin portu B atd.

Pokud použijete Arduino knihovny od STMicroelectronics, vestavěná LED nese označení LED_BUILTIN — fyzicky je připojena na pin PA5 u Nucleo-64. U každého příkladu níže jsou vždy dvě varianty: varianta s vlastními piny a varianta s vestavěnou LED/tlačítkem na desce.

Poznámka pro BluePill/BlackPill: rozmístění pinů se od Nuclea liší. Vestavěná LED je na PC13 (logika obrácená — LOW = svítí). Vždy zkontrolujte pinout vaší konkrétní desky.

Blikání LED

LED (s rezistorem ~220 Ω) připojte mezi GPIO PC10 a GND.

Vlastní LED na pinu PC10:

void setup() {
  pinMode(PC10, OUTPUT);
}

void loop() {
  digitalWrite(PC10, HIGH);  // LED zapnout
  delay(1000);
  digitalWrite(PC10, LOW);   // LED vypnout
  delay(1000);
}

Vestavěná LED (PA5 / LED_BUILTIN):

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000);
}

Celý vzorový kód s popisem najdete na GitHubu.

Tlačítko a LED

LED připojte mezi PC10 a GND. Tlačítko připojte mezi PC11 a GND — PC11 se nachází vedle PC10 na Morpho konektoru.

Pokud tlačítko zmáčknete, LED bude blikat rychleji.

Důležité: vstup je nastaven jako INPUT_PULLUP — interní pull-up rezistor drží pin na HIGH, dokud tlačítko není zmáčknuto. Proto je logika obrácená: tlačítko zmáčknuto = LOW, uvolňováno = HIGH. Pokud byste použili jen INPUT bez pull-up nebo fyzického rezistoru, pin by byl plovoucí a LED by spínála náhodně.

Vlastní tlačítko a LED:

void setup() {
  pinMode(PC10, OUTPUT);
  pinMode(PC11, INPUT_PULLUP);  // interní pull-up, tlačítko na GND
}

void loop() {
  if (!digitalRead(PC11)) {     // zmáčknuto = LOW
    digitalWrite(PC10, HIGH);
    delay(100);
    digitalWrite(PC10, LOW);
    delay(100);
  } else {
    digitalWrite(PC10, HIGH);
    delay(500);
    digitalWrite(PC10, LOW);
    delay(500);
  }
}

Vestavěná LED (PA5) a vestavěné tlačítko (PC13, modrý kryt):

void setup() {
  pinMode(PA5, OUTPUT);
  pinMode(PC13, INPUT_PULLUP);
}

void loop() {
  if (!digitalRead(PC13)) {
    digitalWrite(PA5, HIGH);
    delay(100);
    digitalWrite(PA5, LOW);
    delay(100);
  } else {
    digitalWrite(PA5, HIGH);
    delay(500);
    digitalWrite(PA5, LOW);
    delay(500);
  }
}

Celý vzorový kód najdete na GitHubu.

PWM výstup na GPIO

LED připojte mezi pin PA0 a GND. Pomocí analogWrite budeme měnit intenzitu svitu.

analogWrite na STM32duino pracuje se stejnou 8bitovou hodnotou jako Arduino — rozsah je 0–255, kde 0 = vypnuto, 255 = plný výkon. Hodnota 50 odpovídá přibližně 20 % výkonu, 250 přibližně 98 %.

Vlastní LED na PA0:

void setup() {
  pinMode(PA0, OUTPUT);
}

void loop() {
  analogWrite(PA0, 250);  // téměř plný jas
  delay(500);
  analogWrite(PA0, 50);   // přibližně 20 % jasu
  delay(500);
}

Vestavěná LED (PA5 / LED_BUILTIN):

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  analogWrite(LED_BUILTIN, 250);
  delay(500);
  analogWrite(LED_BUILTIN, 50);
  delay(500);
}

Celý vzorový kód najdete na GitHubu.

Poznámka pro pokročilé: analogWrite / digitalWrite jsou pohodlné, ale pomalejší než přímý zápis do GPIO registrů. Pro časově kritické aplikace (bit-banging, vysokofrekvenční signály) použijte přímý přístup přes GPIOA->ODR nebo STM32 HAL funkce.

A to je v tomto díle o STM32duino vše. Pokud se vám díl líbil, budu rád, když jej budete sdílet s hashtagem #STM32duino.

Sdílejte článek:
Ukaž světu,
že jsi Maker!
Koupit tričko
Kafe pro Chiptrona
Dodej energii dalšímu článku

Související články

Ve čtvrtém díle našeho seriálu o STM32duino se konečně podíváme na slibovanou I2C sběrnici.

Arduino je velmi populární platforma s rozsáhlou komunitní podporou.

Ve třetím díle si ukážeme použití snad nejpopulárnější sběrnice – USART, v Arduino světě je nazývána jako Serial.

Další články o STM32(F7): Tutorial: STM32F746 (STM32F7 Discovery) – Tlačítkem rozsvítit/zhasnout LED Tutorial: STM32F746 (STM32F7 Discovery) – jak zapnout LED (ovládání GPIO) STM32F746 discovery a IDE AC6 (System Workbench for STM32) Jak začít s moderními mikrokontroléry a proč – STM32…

Tento první článek ze série Tutoriál: STM32F746 (STM32F7 Discovery) bych chtěl věnovat rozsvícení LED resp.

Další pokračování tutoriálu pro STM32 (v tomto případě STM32F746).

Trendy