Płytka prototypowa z mikrokontrolerem STM32U5

Płytka prototypowa z mikrokontrolerem STM32U5

W poprzednim wydaniu Elektroniki Praktycznej (EP7/21) zaprezentowaliśmy układy STM32 serii Ultra-Low Power (ULP), w których duży nacisk położono na możliwość realizowania zadań aplikacji z możliwie minimalnym zużyciem energii. Przy rozpoczęciu prac z nowymi układami i opracowywaniu pierwszych projektów systemów elektronicznych niezwykle przydatna staje się płytka uruchomieniowa, nawet taka, która składa się z kilku płytek połączonych ze sobą za pomocą przewodów. Tego typu rozwiązanie, gdzie centralną część stanowi płytka z mikrokontrolerem z rodziny STM32U5, jest przedmiotem niniejszego artykułu.

Artykuł został przygotowany w taki sposób, aby każdy wątek dotyczący projektu płytki znalazł się w osobnym rozdziale. Tym samym oddzielnie opisany został wątek dotyczący zasilania mikrokontrolera, układu resetu (zerowania), sygnału zegarowego, konfiguracji BOOT oraz interfejsu programowania i debugowania. Dzięki temu jest to nie tylko opis płytki, ale również praktyczny poradnik ze wskazówkami jak w warstwie sprzętowej projektować systemy z mikrokontrolerami STM32U5.

Mikrokontroler

STM32U5 to najnowsza propozycja firmy STMicroelectronics w rodzinie STM32. Seria ta rozszerza ofertę mikrokontrolerów w kategorii Ultra-Low Power (niskomocowych lub inaczej energooszczędnych). Układy STM32U5 zostały stworzone z myślą o umiejętnym połączeniu czterech bardzo istotnych z punktu widzenia aplikacji cech: niskiego poboru prądu, wysokiej mocy obliczeniowej, bogatego zestawu zintegrowanych peryferiów oraz zaawansowanych funkcji bezpieczeństwa. Tym samym STM32U5 można określić nie tylko mianem mikrokontrolerów niskomocowych, przeznaczonych dla systemów zasilanych z baterii, ale również mianem mikrokontrolerów ogólnego przeznaczenia, mogących znaleźć zastosowanie w szerokiej gamie urządzeń konsumenckich oraz przemysłowych. Schemat blokowy mikrokontrolera z rodziny STM32U5 pokazano na rysunku 1.

Rysunek 1. Schemat blokowy mikrokontrolerów z rodziny STM32U5

Zastosowany na płytce mikrokontroler to model oznaczony jako STM32U585VIT6. Jego szczegółowe parametry zestawiono w tabeli 1.

Zasilanie

W mikrokontrolerach z rodziny STM32U5 wydzielone zostały różne domeny zasilania. Jest ich łącznie sześć. Niemal wszystkie z nich (dokładnie pięć) są od siebie niezależne. Dzięki temu na etapie projektu można zdecydować, czy korzystniej będzie doprowadzić napięcie zasilania osobno do każdej z sześciu domen, czy jednak połączyć część z nich lub nawet wszystkie wspólnym napięciem zasilania.

W pierwszej domenie znajdują się porty wejścia/wyjścia, układ resetu (zerowania), wewnętrzne źródła sygnału zegarowego, czujnik temperatury, wybrane elementy zarządzania trybami pracy oraz wbudowany regulator napięcia LDO. Napięcie do tej domeny dostarczane jest poprzez grupę wyprowadzeń o nazwie VDD. Napięcie wyjściowe wbudowanego regulatora (VCORE) służy do zasilania drugiej domeny. Tworzą ją: rdzeń Cortex-M33, pamięć SRAM oraz peryferia cyfrowe. Pamięć Flash jest zasilana zarówno napięciem VCORE, jak też VDD. Trzecia domena to większość peryferiów analogowych. Są wśród nich przetworniki A/C, przetworniki C/A, komparatory, wzmacniacze operacyjne oraz źródło napięcia referencyjnego. Pin, przez który napięcie dostarczane jest do tej domeny, oznaczony jest jako VDDA. Z tą domeną związany jest również pin VREF+ dostarczający napięcie referencyjne dla przetworników A/C i C/A. Czwarta domena jest jednoelementowa. Jest nią kontroler USB, który zasilany jest z wyprowadzenia VDDUSB. W przypadku mikrokontrolerów z większą liczbą wyprowadzeń (obudowy LQFP144, UFBGA132 oraz UFBGA169) piny portu wejścia/wyjścia G (GPIO G) są oddzielną domeną. Zasilanie realizowane jest przez wyprowadzenie VDDIO2. Ostatnia domena wydzielona została dla zegara czasu rzeczywistego, zewnętrznego źródła sygnału zegarowego LSE (oscylator 32 kHz) oraz rejestrów backup. Napięcie zasilania do tej domeny doprowadzane jest przez pin VBAT.

Rysunek 2. Domeny zasilania w mikrokontrolerach z rodziny STM32U5

Domeny zasilania w mikrokontrolerach z rodziny STM32U5 zostały pokazane w sposób graficzny na rysunku 2.

Dopuszczalne zakresy napięć zasilających te domeny wypisano w tabeli 2.

Układ resetu

Blok zerowania odpowiada za wytwarzanie sygnału, który restaruje mikrokontroler, co rozumieć należy jako ustawienie wartości domyślnych w rejestrach, a w efekcie też rozpoczęcie wykonywania aplikacji od początku. Linia resetu wewnątrz mikrokontrolera połączona jest przez rezystor z dodatnim potencjałem napięcia zasilania, co powoduje, że sygnał resetu ma domyślnie poziom wysoki. Taki stan nie ingeruje w żaden sposób w działanie mikrokontrolera. Gdy jednak sygnał zmieni poziom na niski, wtedy nastapi restart mikrokontrolera. Poziom ten może zostać wygenerowany wewnętrznie lub zewnętrznie. W przypadku pierwszego wariantu mogą to być: peryferia (watchdog), zmiana w obszarze Option Bytes, reset programowy (z poziomu aplikacji), Power On Reset (pojawienie się napięcia zasilania) lub wybudzenie z trybu uśpienia. Drugi wariant przewiduje podanie sygnału z zewnątrz, poprzez wyprowadzenie NRST. Schemat bloku zerowania pokazano na rysunku 3.

Rysunek 3. Schemat układu zerowania w mikrokontrolerach z rodziny STM32U5

Projektant może podejść do układu resetu mikrokontrolera na kilka sposobów. Popularny wariant to zapewnienie możliwości ręcznego restartowania mikrokontrolera. W takim scenariuszu między linię NRST i masę należy podłączyć przycisk oraz kondensator o pojemności 100 nF. Wciśnięcie przycisku wyzeruje mikrokontroler. Najprostszy możliwy wariant to pozostawienie wyprowadzenia NRST niepodłączonego do żadnego zewnętrznego komponentu zmieniającego poziom sygnału, co oznacza brak możliwości wygenerowania resetu zewnętrznie. W tym przypadku należy jedynie pamiętać o kondensatorze 100 nF wpiętym między pin NRST i masę.

Sygnał zegarowy

Zasoby wewnętrzne mikrokontrolerów z rodziny STM32U5 mogą być taktowane z jednego z czterech typów źródeł sygnału zegarowego o wysokiej częstotliwości: HSE, HSI, MSI lub PLL (rysunek 4). HSE (High Speed External) to zewnętrzne źródło sygnału zegarowego. Może mieć ono dwie formy. Pierwszą jest generator sygnału zegarowego, dołączony do wyprowadzenia OSC_IN. Drugim, bardziej popularnym rozwiązaniem jest oscylator kwarcowy, dołączony do wyprowadzeń RCC_OSC_IN oraz RCC_OSC_OUT i jednocześnie połączony przez kondensatory do masy. HSE może wytwarzać sygnał zegarowy z przedziału 4...50 MHz.

Rysunek 4. Fragment drzewa sygnałów zegarowych w mikrokontrolerach z rodziny STM32U5

Drugi typ źródła sygnału zegarowego to HSI (High Speed Internal). Są to trzy zintegrowane w mikrokontrolerze rezonatory RC: HSI 16 MHz, HSI 48 MHz orz SHSI 16 MHz. Trzecim typem źródła sygnału zegarowego jest MSI (Multi Speed Internal). Podobnie jak HSI, MSI to również zintegrowany w mikrokontrolerze rezonator RC. Przy pomocy MSI możliwe jest uzyskanie jednej z dwunastu częstotliwości sygnału zegarowego, w zakresie od 100 kHz do 48 MHz. Dostępne są dwa MSI: MSIS oraz MSIK. Ostatnim źródłem sygnału zegarowego jest pętla sprzężenia fazowego PLL (Phase Locked Loop). Wykorzystując na wejściu sygnał wygenerowany przez HSE, HSI lub MSIS oraz używając mnożników i dzielników, PLL może wytwarzać sygnał o częstotliwości do 160 MHz włącznie.

Oprócz czterech źródeł sygnału zegarowego wysokiej częstotliwości, mikrokontrolery z rodziny STM32U5 mogą korzystać też z dwóch źródeł sygnału zegarowego o niskiej częstotliwości. Są to LSE oraz LSI. LSE (Low Speed External) jest zewnętrznym źródłem sygnału zegarowego. LSE może mieć postać albo generatora sygnału, podłączonego do wyprowadzenia RCC_OSC32_IN, albo oscylatora kwarcowego, wpiętego między wyprowadzenia RCC_OSC32_IN i RCC_OSC32_OUT oraz dodatkowo połączonego przez kondensatory do masy. LSE może generować sygnał o częstotliwości 1...1000 kHz (typowo jest to 32,768 kHz) i służy do taktowania zegara czasu rzeczywistego (RTC) i timera Watchdog.

Źródło zegarowe LSI (Low Speed Internal) jest zintegrowanym w mikrokontrolerze oscylatorem RC o częstotliwości 32 kHz. Pełni on tą samą funkcję co LSE, co w praktyce oznacza że użytkownik albo decyduje się na rozwiązanie z LSI gdyż jest ono tańsze i nie wymaga dodatkowego miejsca na PCB lub alternatywnie wybiera LSE i korzysta z dużo lepszej dokładności sygnału zegarowego.

Proces bootowania

Mikrokontrolery z rodziny STM32U5 mogą wykonywać aplikację umiejscowioną w pamięci programu (Flash), w pamięci danych (SRAM), w pamięci systemowej (aplikacja fabrycznego bootloadera zaprogramowanego przez producenta) lub w obszarze pamięci Flash zwanym Secure Information Block (aplikacja RSS (Root Secure Services), również zaprogramowana przez producenta). O tym jaka pamięć i jaki adres tej pamięci są w danym momencie wybrane, decydują ustawienia konfiguracyjne, na które składają się: sygnał na wyprowadzeniu BOOT0, wartość bitów w sekcji Option Bytes oraz ustawienia TrustZone.

W sytuacji gdy TrustZone jest wyłączony (bit TZEN w sekcji Option Bytes ma wartość 0), aplikacja może być wykonywana albo z pamięci Flash, abo z pamięci systemowej (bootloader). Domyślnie decyduje o tym wartość logiczna sygnału na wyprowadzeniu BOOT0. W przypadku stanu niskiego jest to pamięć Flash, w przypadku stanu wysokiego jest to bootloader. Chcąc wykorzystać BOOT0 jako pin GPIO (PH3), wybór pamięci bootowania można przenieść na ustawienia programowe. Następuje to po zmianie bitu nSWBOOT0 w sekcji Option Bytes z 1 na 0. W tej sytuacji to bit nBOOT0 decyduje o wyborze pamięci: 1...Flash, 0...bootloader. Zestawienie opcji bootowania z wyłączonym TrustZone pokazano w tabeli 3.

Dodatkowe opcje bootowania dostępne są gdy TrustZone jest włączony (bit TZEN w sekcji Option Bytes ma wartość 1). W tym przypadku aplikacja może być wykonywana z pamięci Flash lub SRAM (w obu przypadkach adres jest konfigurowalny) lub z obszaru Secure Information Block (aplikacja RSS). Decydują o tym wspomniane wcześniej elementy konfiguracji (sygnał na wyprowadzeniu BOOT0, bity nBOOT0 oraz nSWBOOT0 w sekcji Option Bytes) oraz dodatkowo bity BOOT_LOCK oraz RSS. Zestawienie opcji bootowania z włączonym TrustZone pokazano w tabeli 4.

Interfejs programowania/debugowania

Moduł programowania/debugowania w mikrokontrolerach z rodziny STM32U5 określany jest mianem SWJ-DP. Skrót ten łączy w sobie nazwy dwóch interfejsów: SW-DP (Serial Wire Debug Port) oraz JTAG-DP (JTAG Debug Port). Oba oferują taką samą funkcjonalność. To, co jednak je różni, to liczba pinów, z których korzystają. Interfejs JTAG-DP używa łącznie do pięciu wyprowadzeń. Są to linie sygnałowe o nazwie JTMS, JTCK, JTDI, JTDO oraz JTRST. Interfejs SW-DP wymaga natomiast tylko dwóch wyprowadzeń. Są to linie sygnałowe SWDIO i SWCLK.

Dodatkowo każdy z interfejsów oferuje opcjonalną funkcję Trace. W przypadku interfejsu JTAG-DP funkcja ta nosi nazwę ETM (Embedded Trace Macrocell). W trakcie działania aplikacji ETM zbiera informacje na temat wykonywanych przez mikrokontroler instrukcji oraz przetwarzanych danych i wysyła je poprzez odpowiednie piny. Są to linie sygnałowe TRACECLK oraz TRACED0/1/2/3. W przypadku interfejsu SW-DP funkcja na nosi nazwę SWO (Serial Wire Output). SWO działa jak interfejs szeregowy, pozwalający użytkownikowi na wysyłanie danych do środowiska programistycznego w trakcie działania aplikacji. Odbywa się to z udziałem jednego wyprowadzenia (pin SWO).

Finalnie użytkownik ma do wyboru aż siedem różnych wariantów. Zostały one pokazane w tabeli 5.

Schemat elektryczny płytki

Projektując schemat elektryczny płytki z mikrokontrolerem STM32U5 autor wziął pod uwagę wytyczne do projektowania opisane w poprzednich częściach artykułu dotyczące zasilania, układu resetu, źródeł sygnału zegarowego, konfiguracji boot, oraz interfejsu do debugowania i programowania.

Na płytce przewidziano jedno napięcie zasilania dla mikrokontrolera STM32U585VIT6. Ma ono wartość 3,3 V i zostało doprowadzone do wszystkich domen zasilania układu, a tym samym nóżek zasilania: VDDA/VREF+, VDDUSB, VDD, VBAT. Oprócz samego napięcia zasilania potrzebne są dodatkowo kondensatory. Pomiędzy każdym z wyprowadzeń zasilania i masą wpięto po jednym kondensatorze o pojemności 100 nF. Dodatkowo pomiędzy wyjście regulatora napięcia (pin VCAP) i masą umieszczono kondensator o pojemności 4,7 μF.

Na płytce zastosowano minimalną implementację układu resetu. Wyprowadzenie NRST połączono przez kondensator 100 nF do masy. Jednocześnie linia zerowania podpięta została do gniazda programatora/debugera. Dzięki temu w sytuacji gdy programator/debuger jest podłączony do płytki, ma on dostęp do linii NRST. Bywa to przydatne w sytuacji gdy aplikacja zmienia domyślną konfigurację pinów odpowiadających za interfejs programowania/debugowania. W stanie resetu domyślna konfiguracja zostaje przywrócona.

Mikrokontroler STM32U5 dysponuje dwoma źródłami sygnału zegarowego o wysokiej częstotliwości, które mogą taktować rdzeń, pamięć i peryferia (HSI i MSI). Z tego powodu autor nie zdecydował się na zastosowanie ich zewnętrznego odpowiednika (HSE). Natomiast inaczej postąpiono w przypadku źródła sygnału zegarowego o niskiej częstotliwości. Wbudowany oscylator RC o częstotliwości 32 kHz (LSI) ma dość niską dokładność, a jego zewnętrzny odpowiednik (LSE) jest tani, więc zdecydowano się go użyć. Jest on dołączony do dedykowanych wyprowadzeń mikrokontrolera (RCC_OSC32_IN, RCC_OSC32_OUT), jak również jednocześnie połączony jest z masą przez kondensatory o pojemności 15 pF.

Na płytce wyprowadzenie BOOT0 zostało podłączone do masy. W konsekwencji mikrokontroler domyślnie wykonuje aplikację znajdującą się w pamięci Flash pod adresem 0x08000000. Nie wyklucza to jednak możliwości użycia innej pamięci (SRAM, bootloader, RSS) i innego adresu (konfigurowalna wartość), które można aktywować programowo, poprzez właściwe ustawienie bitów w sekcji Option Bytes. Na płytce zastosowano interfejs SW-DP, który jest bardziej ergonomiczny niż JTAG. Obie linie tego interfejsu, a więc z sygnałem danych (SWDIO) oraz z sygnałem zegarowym (SWCLK) podłączono do złącza. Ponadto do tego samego złącza doprowadzono linie, z których dodatkowo korzysta programator/debuger: linie zasilające (dodatni i ujemny potencjał) oraz linię z sygnałem resetu. Żadne z wymienionych linii nie wymagają zastosowania dodatkowych rezystorów szeregowych, czy podciągających do napięcia zasilania.

Ostatni blok funkcjonalny na płytce to interfejs użytkownika. Interfejs wyjściowy tworzą dwie diody LED i połączone z nimi szeregowo rezystory 1 kΩ. Jeden komplet dioda + rezystor połączony jest między napięciem 3,3 V i masą sygnalizując obecność napięcia zasilania. Drugi, taki sam komplet połączony jest między pin wejścia/wyjścia PA5 i masą, co pozwala włączać i wyłączać diodę programowo. Interfejsem wejściowym jest przycisk wraz kondensatorem 100 nF typu pull-down i rezystorem 10 kΩ typu pull-up. Tak skonstruowany obwód połączony jest z pinem wejścia/wyjścia PC13, pozwalając na programowy odczyt stanu przycisku.

Rysunek 5. Schemat elektryczny płytki

Finalnie warto wspomnieć o trzech złączach: SV2 do zasilania mikrokontrolera, SV1 do pomiaru prądu mikrokontrolera i SV3 do programowania i debugowania mikrokontrolera. Kompletny schemat elektryczny uwzględniający wszystkie opisane wcześniej wątki dotyczące projektowania systemów z mikrokontrolerem STM32U5 został pokazany na rysunku 5.

Pełny spis podzespołów płytki zaprezentowano w tabeli 6.

Wykonanie i montaż płytki

Projekt płytki jest na tyle prosty, że z powodzeniem można pokusić się o samodzielne jej wykonanie i montaż w warunkach domowych. W tym celu należy zapatrzeć się we wszystkie elementy wymienione w tabeli 5 (spis podzespołów płytki) oraz dodatkowo potrzebna będzie uniwersalna płytka z polami lutowniczymi do montażu przewlekanego, jak również adapter LQFP100 z rastrem 0,5 mm. W warstwie narzędzi niezbędna będzie lutownica, pęseta, topnik i plecionka lutownicza.

Montaż należy rozpocząć od przytwierdzenia mikrokontrolera do adaptera. Kluczowe dla pomyślnego zrealizowania tej czynności jest precyzyjne umieszczenie układu na płytce. Dotyczy to wyprowadzeń mikrokontrolera, które muszą znaleźć się na dedykowanych im padach. Z racji dużej liczby wyprowadzeń i stosunkowo małego rastru, obudowa LQFP może stanowić pewne wyzwanie pod tym względem, dlatego zalecane jest użycie pęsety. W celu łatwiejszego przylutowania pinów mikrokontrolera do padów płytki wskazane jest wcześniejsze nawilżenie tych drugich topnikiem. Może zdarzyć się, że spoiwo lutownicze połączy dwa lub więcej sąsiednich wyprowadzeń.

W takim przypadku nadmiar cyny można usunąć przy użyciu plecionki lutowniczej. Kolejnym etapem jest przylutowanie do adaptera pozostałych elementów. Są to złącza szpilkowe oraz kondensatory związane z zasilaniem. Adapter w takiej formie można następnie osadzić na płytce uniwersalnej.

Teraz nadszedł czas na przylutowanie do płytki uniwersalnej elementów peryferyjnych. Są to rezystory, diody LED, kwarc wraz z dedykowanymi mu kondensatorami, przycisk i złącza szpilkowe do podłączenia zasilania oraz programatora/debugera. W ostatnim kroku należy użyć kynaru w celu połączenia ze sobą elementów zgodnie ze schematem elektrycznym.

Fotografia 1. Zdjęcia wykonanej płytki (widok z góry i z dołu)

Finalny efekt tak wykonanej platformy sprzętowej pokazano na fotografii 1.

Przygotowanie stanowiska pracy

Przygotowanie stanowiska pracy obejmuje czynności związane zarówno ze sprzętem, jak i oprogramowaniem. Ze sprzętowego punktu widzenia niezbędne jest doprowadzenie do płytki napięcia zasilania. Dodatkowo konieczne jest dołączenie do płytki programatora/debugera. Do zrealizowania obu zadań z powodzeniem można wykorzystać dowolną płytkę Nucleo będącą tanią platformą sprzętową dla mikrokontrolerów STM32. Każda płytka STM32 Nucleo dysponuje gniazdami sygnałowymi o nazwie Arduino i Morpho. To drugie jest typu męskiego i udostępnia potencjał masy jak też 3,3 V. Dzięki temu łącząc odpowiednie wyprowadzenia gniazda Morpho ze złączem zasilania płytki STM32U5 zapewnimy tej drugiej platformie odpowiednie napięcie zasilania. Na każdej płytce STM32 Nucleo dostępny jest zintegrowany programator/debuger ST-Link. Domyślnie służy on do obsługiwania znajdującego się na płytce układu STM32. Co jednak bardzo cenne, ST-Link może również programować i debugować układy poza płytką Nucleo. Wystarczy odłączyć linie interfejsu SW-DP od mikrokontrolera poprzez wyjęcie obu zworek ze złącza CN4 i podłączyć je przez złącze CN11 do płytki z STM32U5. Sprzętowe stanowisko pracy prezentujące opisaną konfigurację z użyciem płytki Nucleo pokazano na fotografii 2.

Fotografia 2. Wygląd płytki STM32U5 podłączonej do zestawu STM32 Nucleo

Z programowego punktu widzenia konieczne jest zainstalowanie odpowiedniego pakietu oprogramowania, który pozwoli na pracę z mikrokontrolerem STM32U5 i tworzenie dla niego aplikacji. Producent w tym celu przygotował pakiet Cube: graficzny konfigurator mikrokontrolera i generator kodu STM32CubeMX, oparte na Eclipse i GCC środowisko programistyczne STM32CubeIDE, pakiet bibliotek i przykładów STM32CubeU5 oraz programator STM32CubeProgrammer. Narzędzia te są bezpłatne i dostępne do pobrania ze strony producenta www.st.com.

Podsumowanie

Układy STM32U5 to najnowsza grupa układów w rodzinie mikrokontrolerów STM32. Z pewnością warto zwrócić na nie uwagę, gdyż dzięki połączeniu czterech ważnych cech, jakimi są bardzo niski pobór prądu, wysoka moc obliczeniowa, pokaźny zestaw zasobów (peryferia, pamięć) oraz zaawansowane funkcje bezpieczeństwa, mogą one być rozwiązaniem atrakcyjnym dla bardzo różnych zastosowań, w tym tak popularnych w ostatnich latach systemów Internet of Things.

Zaprezentowany w tym artykule projekt stanowi dobre źródło wiedzy o tym, jak projektować systemy oparte na mikrokontrolerach STM32U5. Pokazano tu krok po kroku kolejne aspekty dotyczące projektu systemu w warstwie sprzętowej. Opisana płytka jest prostą do wykonania i tanią platformą uruchomieniową dla mikrokontrolerów STM32U5. Może ona posłużyć do poznawania w praktyce nowych mikrokontrolerów firmy STMicroelectronics, jak też do budowania autorskich systemów prototypowych.

Szymon Panecki
szymon.panecki@st.com
STMicroelectronics

Artykuł ukazał się w
Elektronika Praktyczna
sierpień 2021

Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik maj 2022

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio maj - czerwiec 2022

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka Podzespoły Aplikacje kwiecień 2022

Automatyka Podzespoły Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna maj 2022

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich maj 2022

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów