Komunikace po dvou vodičích

Úspěšně jsme rozblikali LED diodu. To je sice pěkný vizuální start, ale pro seriózní vývoj potřebujeme vědět, co se uvnitř čipu děje. Potřebujeme výpis proměnných, chybová hlášení nebo prostě jen potvrzení, že program doběhl k určitému bodu.

K tomu nám poslouží UART (Universal Asynchronous Receiver-Transmitter) – jednoduchá a léty prověřená sériová komunikace „po dvou drátech“.

Toto rozhraní nám kromě primitivního debuggingu také umožní jednoduše komunikovat s různými užitečnými periferiemi. Z nich lze uvést například moduly HC-12 a HC-14 pro bezdrátovou komunikaci nebo různé GPS moduly, které přes UART posílají NMEA kódy.

Co je to UART a proč nás zajímá?

UART je asynchronní protokol, což znamená, že nepotřebuje sdílený hodinový signál. Stačí nám dva vodiče:

  • TX (Transmit): Tudy data odcházejí.
  • RX (Receive): Tudy data přicházejí.

U desek Nucleo máme obrovskou výhodu. Programátor ST-LINK, který je součástí desky, funguje jako tzv. Virtual COM Port (VCP). To znamená, že TX a RX piny mikrokontroléru jsou vnitřně propojeny s USB kabelem, a my tak nepotřebujeme žádný externí převodník.

Krok 1: Konfigurace v CubeMX

Otevřete svůj projekt (nebo vytvořte nový pro Nucleo) a přejděte do souboru .ioc.

  1. V levém panelu pod kategorií Connectivity vyberte USART2 (u většiny desek Nucleo je právě tento kanál propojen s USB).
  2. V roletce Mode zvolte Asynchronous.
  3. Dole v záložce Parameter Settings zkontrolujte nastavení:
  • Baud Rate: 115200 Bits/s (standardní rychlost).
  • Word Length: 8 Bits.
  • Parity: None.
  • Stop Bits: 1.
  1. Uložte projekt (Ctrl + S) a nechte vygenerovat kód.

Krok 2: Posíláme první zprávu

Přejděte do main.c. CubeMX pro nás připravil instanci huart2. Teď už ji jen stačí použít. Do smyčky while (1) přidejte následující blok kódu:

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
      // deklarujeme a definujeme string se zpravou ktera se bude posilat
      char msg[] = "Hello world\r\n";
      // Odesleme data přes UART2
      // Parametry: (instance, data, délka, timeout v ms)
      HAL_UART_Transmit(&huart2, (uint8_t*)msg, strlen(msg), 100);
      // Blikneme LED pro kontrolu
      HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
      // zpozdeni jedna sekunda
      HAL_Delay(1000);
    /* USER CODE END WHILE */
  }

Poznámka: Aby fungovala funkce strlen(), nezapomeňte na začátek souboru do sekce /* USER CODE BEGIN Includes */ přidat #include <string.h>.

Krok 3: Jak zprávu přečíst v PC?

Váš STM32 teď každou sekundu vysílá data. Abychom je viděli, potřebujeme v počítači terminál.

  1. Integrovaný terminál v STM32CubeIDE: V dolní části klikněte na kartu Console, stiskněte ikonku monitoru s „+“ a vyberte Command Shell Console. Jako Connection Type zvolte Serial Port a nastavte správný COM port a rychlost 115200.
  2. Externí programy: Skvěle poslouží Tera Term, PuTTY nebo YAT.

Po připojení byste měli vidět text, který se každou sekundu vypíše na novou řádku.

Pár tipů z praxe

  • Proč nevidím nic? Zkontrolujte, zda máte správně nastavenou rychlost (Baud Rate) v terminálu i v kódu. Pokud se neshodují, uvidíte jen náhodné „rozsypaný čaj“.
  • Formátování (printf): Pokud chcete používat pohodlné printf(„Teplota je: %d“, teplota);, musíte provést tzv. „retargeting“ standardního výstupu na UART. To si ukážeme v některém z příštích pokročilejších dílů.
  • Timeout: Čtvrtý parametr u HAL_UART_Transmit (v našem případě 100) určuje, jak dlouho má čip čekat na dokončení přenosu, než se pohne dál. Pro krátké zprávy je to víc než dost.

Co dál?

Nyní mikroprocesor posílá lidsky čitelná data do našeho počítače, zakódovaná pomocí ASCII. Dalším krokem bude příjem dat, a jiné formátování posílaných dat. V praxi totiž zjistíme, že posílat data v ASCII není příliš efektivní, a mnohdy není nutné aby data byla lidsky čitelná.

Ukážeme si také, jak pracovat s periferiemi na GPIO, UARTu a i na dalších rozhraních tak, aby v případě problémů nedošlo k zablokování programu, a také tak aby byl efektivně využíván čas procesoru.

Kategorie