STM32 Ethernet – pierwsze uruchomienie

W ostatnim czasie miałem okazję pracować nad pewnym projektem wykorzystującym mikrokontroler STM32 oraz interfejs Ethernet. Zapewne podobnie jak inne osoby podejmujące się tego tematu natknąłem się na pewien problem – brak „prostych” poradników. We większości dostępnych źródeł łączenie interfejsu Ethernet i układów STM32 opisane jest dość zagmatwanie i według mnie brakuje instrukcji opisujących jak skonfigurować tę funkcjonalność w najprostszy możliwy sposób, bez zbędnego zgłębiania aspektów sieciowych. Dlatego postanowiłem przygotować ten oraz powiązane z nim materiały poruszające temat Ethernetu na STM32. Na pierwszy ogień pokaże wam jak przeprowadzić wstępną konfigurację, tak aby mikrokontroler był widoczny w sieci.

W projektach korzystam z płytki Nucleo F767ZI, kody dostępne są do pobrania na moim profilu GitHub.

Ostrzeżenie o nowej wersji firmware

Okno powiadomienia o nowej wersji firmware.

Przygotowując kody do tego poradnika, korzystałem z CubeMX V6.12.1. Jeśli ktoś będzie chciał skorzystać z gotowego projektu, który udostępniam na moim profilu GitHub, prawdopodobnie spotka się z ostrzeżeniem o nowej wersji firmwaru. W takim przypadku zalecam kontynuowanie i korzystanie z wersji 6.12.1.

Konfiguracja ETH i LWIP

Okno konfiguracji ETH.

Pierwszym krokiem jest aktywacja interfejsu ETH w zakładce Connectivity oraz wybór konfiguracji RMII. Wszystkie pozostałe parametry powinny zostać w domyślnej wersji, nie trzeba w nich nic zmieniać.

Opcje Platform Settings.

W zakładce Middleware odszukujemy i aktywujemy LWIP. Aby korzystać z interfejsu Ethernet, należy również wybrać Driver_PHY w zakładce Platform Settings. Jest to nic innego jak chip wlutowany na płytce Nucleo obsługujący interfejs sieciowy. Z dostępnej listy w obu miejscach wybieramy LAN8742.

Ustawienia adresu IP.

Kolejnym krokiem jest ustawienie adresu IP. Zazwyczaj podłączane do sieci urządzenia korzystają z tak zwanego DHCP, czyli otrzymują swój własny unikatowy adres automatycznie. Jednak w przypadku początkowej zabawy z siecią i STM32 lepiej jest skorzystać z ustawionego na stałe adresu. W tym celu przełączamy opcję LWIP_DHCP (DHCP Module) na Disabled, a w opcjach IP Addres Settings ustawiamy odpowiednie adresy IP.

  • IP_ADDRESS – to adres, który otrzyma płytka Nucleo, należy wpisać tutaj ciąg cyfr dostępny w sieci, do której chcemy się podłączyć,
  • NETMASK_ADDRESS – maska podsieci, standardowo jest to 255.255.255.000,
  • GATEWAY_ADDRESS – adres routera, domyślnie jest to pierwszy adres w sieci.

Tak przygotowany projekt można wygenerować.

Kod programu

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
extern struct netif gnetif;
/* USER CODE END 0 */

W pliku main.c, który zawiera główny, wykonywany przez STM32 program umieszczamy deklarację struktury netif o nazwie gnetif. Jest to podstawowa struktura zdefiniowana we wbudowanej bibliotece LwIP (Lightweight IP) obsługującej stos sieciowy.

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	  ethernetif_input(&gnetif);
	  sys_check_timeouts();
  }

W głównej pętli while umieszczamy instrukcje ethernetif_input(&gnetif); oraz sys_check_timeouts();. Ich zadaniem jest kolejno odebrać wszystkie dane z portu Ethernet i przypisać je do stosu sieciowego, innymi słowy przekazać je do struktury gnetif, do której wskaźnik umieszczony jest w argumencie. Drugie polecenie sprawdza i obsługuje wszystkie timeouty związane ze stosem LwIP.

Tak przygotowany program należy zapisać w pamięci mikrokontrolera, pamiętając, aby wcześniej podłączyć do płytki przewód Ethernet. Choć robiąc to później, nie stanie się nic złego.

Uruchomienie

Okno wiersza poleceń.

Po uruchomieniu, aby sprawdzić, czy program działa prawidłowo, należy otworzyć wiersz poleceń. Na początek można skorzystać z komendy arp a-, która zwróci nam dostępne w sieci adresy. Jak widać, jednym z nich jest 192.168.8.200, czyli ten przypisany do płytki Nucleo, oznacza to, że ta widoczna jest w sieci. Następnie korzystamy z polecenia ping dopisując adres IP płytki STM32. Po kliknięciu klawisza enter powinniście uzyskać efekt, tak jak na grafice powyżej. Komputer wysłał cztery pakiety danych, które zostały poprawnie odebrane.

Jak widać, podstawowe uruchomienie interfejsu sieciowego dla STM32 jest dość proste. W kolejnych materiałach opiszę podstawową komunikację poprzez UDP i TCP.

Chcesz być na bieżąco?
Dołącz do newslettera

Otrzymywać będziesz powiadomienia o nowych artykułach oraz informacje o projektach, nad którymi pracuję.

Leave a Comment

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Przewiń do góry