W 2018 roku popularna rodzina układów STM32 oparta na architekturze ARM Cortex-M została rozszerzona o kategorię produktową o nazwie Wireless. Tym samym do bogatej oferty mikrokontrolerów dołączyły układy typu SoC (System on Chip), łączące mikrokontroler i układ komunikacji radiowej. Pierwszym rozwiązaniem tego typu jest seria STM32WB przeznaczona do komunikacji bezprzewodowej w paśmie 2,4 GHz, która wspiera trzy standardy komunikacji: BLE (Bluetooth Low Energy), ZigBee oraz Thread.
W przypadku chęci użycia STM32WB do wyboru pozostają dwie różne koncepcje projektowe. Każda ma swoje zalety i wady. Pierwsza koncepcja zakłada użycie rozwiązania układowego. Kierując się wymaganiami aplikacji konstruktor wskazuje najlepiej pasującą grupę układów (WB55, WB50, WB35, WB30, WB15 lub WB10), następnie wybiera wariant obudowy (QFN48, QFN68, WLCSP100, lub BGA129) i na końcu określa potrzebną pojemność pamięci Flash (256 kB...1 MB). W ten sposób wybrany zostaje najwłaściwszy model STM32WB. Następnie następuje faza projektowania płytki PCB, która obejmuje dołączenie do układu komponentów zewnętrznych takich jak źródła sygnału zegarowego, elementy zasilania oraz elementy toru radiowego. Finalnie zaprojektowany system wymaga wykonania certyfikacji pod kątem radiowym. Podsumowując tą koncepcję, za jej zaletę należy uznać minimalizację ceny (wybór optymalnego układu) i pełną elastyczność pod kątem projektowania płytki PCB. Jej wadą jest natomiast czas potrzebny na proces projektowania płytki PCB od zera (co szczególnie może być problemem w przypadku małej wiedzy w dziedzinie radiowej) oraz również czas, a dodatkowo też koszt realizacji certyfikacji.
Druga koncepcja przewiduje wykorzystanie rozwiązania modułowego. Moduł zawiera układ STM32WB oraz wszystkie wymagane do jego poprawnej pracy komponenty, ponadto jest rozwiązaniem certyfikowanym. W tym przypadku nie ma możliwości wyboru modułu, gdyż dostępny jest tylko jeden model – STM32WB5MMG. Dokonując bilansu tej koncepcji jako zaletę należy podkreślić znacznie uproszczony proces projektowania płytki PCB oraz brak konieczności wykonywania certyfikacji. Obie te korzyści przekładają się na znacząco krótszy czas tworzenia produktu (tzw. time to market). Jednocześnie należy mieć świadomość wad w postaci nieoptymalnej ceny oraz mniejszej elastyczności w przypadku projektowania płytki PCB.
Specyfikacja modułu STM32WB5MMG
Elementem centralnym modułu jest naturalnie układ SoC z rodziny STM32WB. Jest to konkretnie model STM32WB55VGY6. Wybór ten nie powinien dziwić, gdyż wskazany układ łączy bardzo małe gabaryty (obudowa WLCSP100 o wymiarach 4,390×4,371 mm) oraz maksymalną pojemność pamięci (1 MB Flash, 256 kB SRAM).
Układ STM32WB połączony jest w module z grupą podzespołów otaczających. Sygnał zegarowy zapewniają dwa kwarce: pierwszy o częstotliwości 32 MHz (źródło zegara o nazwie HSE – High Speed External) i drugi o częstotliwości 32,768 kHz (źródło zegara o nazwie LSE – Low Speed External). Są one niezbędne do właściwej pracy części radiowej STM32WB, a dodatkowo można ich użyć do taktowania innych zasobów (rdzenia, pamięci, zegara RTC itp.). Przewidziano też kilka elementów pasywnych takich jak kondensatory i cewka, które umożliwiają przełączenie bloku zasilania STM32WB z regulatora napięcia LDO na przetwornicę napięcia SMPS, tym samym zmniejszając wartość pobieranego prądu. W końcu ostatnia grupa podzespołów to elementy radiowe: układ IPD (Integrated Passive Device) oraz antena.
Moduł cechuje się małymi gabarytami: 7,3×11 mm. Obudowa to wariant LGA z 86 wyprowadzeniami, spośród których 68 może realizować funkcje linii I/O (schemat ideowy i układ wyprowadzeń pokazano na rysunku 1). Maksymalna moc nadawania to +6 dBM, co w połączeniu z zastosowaną anteną daje możliwość uzyskania zasięgu transmisji do 75 metrów. Istotną zaletą modułu jest nie tylko zintegrowanie wszystkich niezbędnych elementów sprzętowych, ale też certyfikacja. Lista uzyskanych certyfikatów obejmuje: CE, FCC, IC, JRF, SRRC, RoHS, REACH, GOST, KC, NCC.
Moduł ma charakter otwarty, co oznacza że umieszczony w nim układ STM32WB wykonuje zarówno aplikację stosu radiowego (BLE, ZigBee lub Thread), jak również aplikację użytkownika. Aplikacje te wykonywane są równolegle, co umożliwia dwu-rdzeniowa architektura STM32WB: Cortex-M0+ – stos radiowy, Cortex-M4 – aplikacja użytkownika. W tabeli 1 wypisano wszystkie peryferia, z jakich korzystać może aplikacja użytkownika.
Firma STMicroelectronics przygotowała platformę sprzętową pozwalającą na łatwe rozpoczęcie pracy z modułem STM32WB5MMG. Jest to płytka o nazwie STM32WB5MM-DK. Wyposażenie obejmuje nie tylko moduł z układem STM32WB, ale też czujniki MEMS, pamięć z interfejsem Quad-SPI, wyświetlacz OLED, przycisk pojemnościowy, przyciski mechaniczne, diodę podczerwoną, diodę RGB, gniazdo USB, programator/debuger ST-Link oraz złącza sygnałowe. Zdjęcie płytki STM32WB5MM-DK zaprezentowano na rysunku 2.
Projektowanie systemu BLE w warstwie sprzętowej
Podstawową czynnością podczas projektowania elektroniki jest zapewnienie podzespołom napięcia zasilania. Nie inaczej jest w przypadku modułu STM32WB5MMG. Za zasilanie odpowiada szereg wyprowadzeń. Można je podzielić na dwie grupy pod względem potencjału zasilania. Potencjał dodatni o wartości z zakresu 1,8...3,6 V (typowo 3,3 V) należy doprowadzić do pinów VERF+, VDDA, VBAT, VDDSMPS oraz VDD_USB. Analogicznie potencjał ujemny należy podpiąć do pinów VSSSMPS, VSS_1, VSS_2, VSS_3, VSS_4, VSS_5 i VSS_9.
Kolejnym wyprowadzeniem wymagającym uwagi jest BOOT0. Poziom napięcia na tym pinie określa jaka pamięć zostanie wybrana do bootowania (Flash – aplikacja, pamięć systemowa – fabryczny bootloader, SRAM – aplikacja). Projektant ma do dyspozycji połączenie BOOT0 do ujemnego lub dodatniego potencjału zasilania.
Następne wyprowadzenie, którym należy się zająć to NRST, które poprzez podanie ujemnego potencjału zasilania wprowadzi układ w stan resetu. Wymagane jest tu zastosowanie kondensatora o pojemności 100 nF, wpiętego pomiędzy linię NRST i ujemny potencjał zasilania. Opcjonalnie chcąc mieć możliwość ręcznego resetowania układu można zastosować przycisk, również wpięty między linię NRST i ujemny potencjał zasilania.
Dostępne są trzy wyprowadzenia związane z anteną. Piny ANT_IN oraz RF_OUT należy połączyć z ujemnym potencjałem zasilania. Z kolei pin ANT_NC należy zostawić niepodłączony.
W przypadku korzystania z interfejsu USB należy nie tylko zadbać o prawidłowe podłączenie pinu VDD_USB (opisane to zostało w sekcji dotyczącej zasilania), ale również wysoce wskazane jest zastosowanie obwodu zabezpieczenia, który chronić będzie linie komunikacji USB_N oraz USB_P. Do tego celu można użyć np. układu USBLC6-2P6. Moduł zawiera trzy wyprowadzenia I/O, które są wrażliwe na zakłócenia: PB10, PB11 oraz PC5. Firma STMicroelectronics rekomenduje, aby między każdą z tych linii i ujemny potencjał zasilania wpiąć kondensator o pojemności 3 nF.
Schemat elektryczny biorący pod uwagę wszystkie opisane wskazówki przedstawiono na rysunku 3. Jest to projekt referencyjny zaczerpnięty z noty katalogowej modułu STM32WB5MMG. Warto też zapoznać się ze wskazówkami dotyczącymi projektowania layoutu płytki PCB. Zilustrowano je na rysunku 4. Przede wszystkim warto zwrócić uwagę na umiejscowienie modułu. Zaleca się aby STM32WB5MMG znalazł się w lewym górnym rogu płytki, co zapewni optymalne parametry pracy dla anteny. Drugie zalecenie dotyczy rozprowadzania ścieżek na płytce.
Sugerowane jest unikanie przestrzeni po prawej stronie od modułu. Najkorzystniejszym wariantem jest poprowadzenie ścieżek po stronie przeciwległej do miejsca usytuowania anteny.
Wspomniana wcześniej przestrzeń po prawej stronie modułu powinna zostać przeznaczona na poligon masy wraz z przelotkami (odległość 2 mm między przelotkami).
Projektowanie systemu BLE w warstwie programowej
Najlepszym sposobem na zademonstrowanie jak pracować z modułem STM32WB5MMG w warstwie programowej jest pokazanie krok po kroku jak od zera stworzyć prosty system realizujący komunikację BLE. W tym celu zostanie zrealizowany scenariusz komunikacji P2P (Point to Point) między aplikacją działającą na module i aplikacją działającą na smartfonie.
Smartfon wcieli się w rolę urządzenia wysyłającego na żądanie użytkownika jeden z dwóch komunikatów. Moduł odegra rolę odbiornika, który po otrzymaniu komunikatu będzie go interpretował i włączał lub wyłączał diodę LED.
Jako platforma sprzętowa użyta zostanie płytka STM32WB5MM-DK. Umieszczony na niej moduł STM32WB5MMG jest w pełni przygotowany do pracy tzn. ma zapewnione zasilanie, jest podłączony do programatora/debugera ST-Link oraz dysponuje już wcześniej wgranym stosem BLE. Jedyną konieczną modyfikacją jest podłączenie diody LED. W tym celu użyto gniazda sygnałowego STMOD+ (dioda LED podłączona została do portu PB8).
Do obsługi komunikacji BLE po stronie smartfona należy użyć bezpłatnej aplikacji ST BLE Sensor. Udostępnia ona interfejs do połączenia się z urządzeniem BLE i do wysyłania komunikatów. Aplikacja dla modułu może zostać stworzona przy użyciu ekosystemu narzędzi programowych STM32Cube. Potrzebne w tym celu będą trzy jego elementy: środowisko programistyczne STM32CubeIDE, konfigurator graficzny układu i generator kodu STM32CubeMX (jest on integralną częścią STM32CubeIDE) oraz pakiet STM32CubeWB zawierający firmware: biblioteki do peryferiów, stosy radiowe i przykładowe aplikacje.
Przystępując do pracy należy uruchomić środowisko programistyczne STM32CubeIDE. Pierwszym krokiem jest utworzenie nowego projektu.
- Z menu głównego należy wybrać kolejno File, New, STM32 Project. W efekcie wywołany zostanie kreator nowego projektu korzystającego z narzędzia STM32CubeMX;
- W polu Part Number należy wpisać nazwę modułu tzn. STM32WB5MMG. Lista dostępnych układów zawęzi się do jednej pozycji. Należy ją zaznaczyć i kliknąć przycisk Next;
- Jest to właściwy moment na zadeklarowanie nazwy projektu. Po wpisaniu jej w pole Project Name pozostaje kliknąć przycisk Finish, który zamknie kreator;
W konsekwencji tych działań zostanie utworzony nowy projekt (opisane kroki zilustrowano na rysunku 5). Warto podkreślić, że projekt w takiej formie jest kompletny tzn. zawiera plik projektowy STM32CubeMX, plik main.c oraz komplet bibliotek. Nie ma zatem potrzeby ręcznego uzupełniania projektu lub jego manualnej konfiguracji.
Drugi krok polega na poprawnym skonfigurowaniu układu STM32WB. Pomocny w tym zadaniu będzie plik projektowy STM32CubeMX, konkretnie zakładka Pinout & Configuration, gdzie w sposób graficzny można wyklikać właściwe ustawienia. Czynności do wykonania jest szereg, więc najwygodniej będzie pokazać je w postaci listy (zilustrowano je na rysunku 6):
- Aktywowanie interfejsu programowania/debugowania SWD: w oknie z listą peryferiów należy odszukać blok System Core, kliknąć na element SYS i w polu Debug wybrać Serial Wire;
- Aktywowanie dwóch źródeł sygnału zegarowego HSE i LSE: w oknie z listą peryferiów należy oszukać blok System Core, kliknąć na element RCC i zaznaczyć pola High Speed Clock oraz Low Speed Clock;
- Aktywowanie sprzętowego semafora: w oknie z listą peryferiów należy odszukać blok System Core, kliknąć na element HSEM i zaznaczyć pole Activated;
- Aktywowanie zegara Real Time Clock: w oknie z listą peryferiów należy odszukać blok Timers, kliknąć na element RTC i zaznaczyć pole Activate Clock Source;
- Aktywowanie bloku radiowego: w oknie z listą peryferiów należy odszukać blok Connectivity, kliknąć na element RF i zaznaczyć pole Activate RF;
- Aktywowanie stosu BLE: w oknie z listą peryferiów należy odszukać blok Middleware, kliknąć na element STM32_WPAN i zaznaczyć pole BLE. Szczegółowa konfiguracja dostępna jest w podzakładce BLE Applications and Services, natomiast domyślnie ustawienia są odpowiednie i jedyną opcjonalną zmianą jest wpisanie identyfikatora urządzenia w polu LOCAL_NAME np. może być to słowo STM32WB;
- Konfiguracja portu I/O do sterowania diodą LED: w oknie z układem wyprowadzeń należy odszukać pin PB8, kliknąć na niego i wybrać z menu kontekstowego opcję GPIO_Output;
Dalsza praca z plikiem projektowym polega na skonfigurowaniu drzewa zegarowego. W tym celu konieczna jest zmiana zakładki Pinout & Configuration na zakładkę Clock Configuration. Po jej otworzeniu STM32CubeMX poprosi o możliwość wykonania automatycznej konfiguracji. Należy wyrazić na to zgodę. Dodatkowo potrzebne są następujące zmiany (zilustrowano je na rysunku 7):
- Użycie LSE jako źródła sygnału zegarowego dla RTC: w multiplekserze RTC/LCD Source Mux należy zmienić zaznaczone pole z LSI na LSE;
- Użycie HSE jako źródła sygnału zegarowego dla SYSCLK: w multiplekserze System Clock Muxnależy zmienić zaznaczone pole z MSI na HSE_SYS;
- Użycie LSE jako źródła sygnału zegarowego dla mechanizmu wybudzania radia: w multiplekserze RFWKP Clock Mux należy zmienić zaznaczone pole z HSE na LSE;
W tym momencie wszystkie potrzebne ustawienia zostały wprowadzone do STM32CubeMX. Czynnością kończącą ten etap jest wygenerowanie kodu. W tym celu należy z menu wybrać Project, a następnie Generate Code.
W ten sposób przechodzimy do trzeciego, ostatniego kroku pracy nad aplikacją. Polega on na dodaniu kilku fragmentów kodu, które pozwolą na implementację założonej na początku funkcjonalności (zaznaczono je na rysunku 8).
- Pierwszy plik który należy poddać edycji to stm32wbxx_it.c. Na samym końcu pliku należy dodać funkcje do obsługi przerwań dla RTC oraz IPCC;
- Drugi plik który wymaga edycji to main.c. W sekcji początkowej pliku należy wstawić dyrektywę #include wskazującą potrzebę użycia pliku sekwencera. Z kolei w dalszej części tego samego pliku, mianowicie w funkcji main, a konkretnie w pętli while(1) należy wywołać funkcję UTIL_SEQ_Run(), która zarejestruje w sekwencerze nowe zadanie;
- Trzeci plik kwalifikujący się do edycji nosi nazwę p2p_server_app.c. Wewnątrz funkcji P2PS_STM_App_Notification() reagującej na zdarzenia zgłaszane przez stos BLE, dokładniej w instrukcji wielokrotnego wyboru switch – case dla warunku P2PS_STM_WRITE_EVT należy sprawdzić zawartość pól struktury pNotification pod kątem odebranych danych. W zależności od wartości tych danych należy poprzez funkcję HAL_GPIO_WritePin() wystawić odpowiednią wartość na port I/O PB8 sterujący diodą LED.
Na tym etapie praca nad aplikacją jest zakończona. Pozostaje zatem skompilować kod (poprzez wybranie z menu Project, a potem Build All), a następnie wgrać plik wynikowy do pamięci układu STM32WB umieszczonego w module (poprzez wybranie z menu Run i ponownie Run). Na fotografii 1 pokazano zdjęcie działającego systemu: smartfona wysyłającego poprzez aplikację ST BLE Sensor na żądanie użytkownika komunikaty o diodzie LED i płytkę STM32WB5MM-DK, na której aplikacja działająca na module odbiera komunikaty i steruje diodą LED w odpowiedni sposób.
Podsumowanie
STM32WB5MMG to rozwiązanie, z którym dotychczasowi użytkownicy STM32 będą mogli sprawnie rozpocząć pracę. Wynika to z tego, że moduł oparty jest na układzie STM32WB, który jest blisko spokrewniony z mikrokontrolerami STM32 i używa tego samego ekosystemu narzędzi programowych. Zasadniczą nowością jest tu dodatkowy element w postaci bloku radiowego 2,4 GHz (BLE, ZigBee, Thread). STM32WB5MMG to moduł radiowy. Wybierając go użytkownik nie musi samodzielnie projektować od zera pytki PCB, gdyż moduł zawiera już układ STM32WB, dwa kwarce, elementy zasilania, układ IPD i antenę. Dodatkowo użytkownik nie musi realizować kosztownych i czasochłonnych certyfikacji, gdyż producent modułu już o nie zadbał.
W artykule zademonstrowano jak w warstwie sprzętowej i programowej rozpocząć pracę z modułem STM32WB5MMG. Osoby chcące poznać tą tematykę bardziej szczegółowo autor zachęca do zapoznania się z materiałem szkoleniowym dostępnym pod adresem: https://bit.ly/3qlXEgD.
Szymon Panecki
szymon.panecki@st.com
STMicroelectronics