[7] STM32CUBE w przykładach (obsługa GPS)

Tworzymy projekt

Spróbujemy teraz utworzyć prosty projekt odbierający od modułu GPS dane dotyczące:

  • aktualnej daty i godziny,
  • współrzędnych geograficznych,
  • wysokości nad poziomem morza,
  • prędkości poruszania się, w węzłach oraz kilometrach na godzinę,
  • liczby satelitów z których odbierane są dane,
  • oraz dokładności z jaką ustalone zostało położenie.

W przykładowym projekcie, utworzymy uniwersalną bibliotekę współpracującą z modułami GPS różnych firm, odbierzemy przy jej pomocy w/w dane, a następnie wyślemy je poprzez drugi interfejs UART (przyłączony do wbudowanego programatora) do komputera, w czytelnej dla człowieka formie. Biblioteka ta może zostać wykorzystana w urządzeniu logującym swoje pozycje na karcie pamięci lub w pamięci EEPROM, czy Flash, trackerze GPS, przesyłającym informacje o położeniu dane poprzez radio lub sieć komórkową na serwer, czy też w roli zegara czasu rzeczywistego, zsynchronizowanego z zegarem atomowym znajdującym się na orbicie.

  1. Uruchamiamy program STM32CubeMX i tworzymy w nim nowy projekt. W kreatorze wyboru mikrokontrolera, wybieramy posiadany przez nas układ. Dla przypomnienia – na używanej podczas tworzenia kursy płytce rozwojowej Kamami KA-NUCLEO-F411, znajduje się układ STM32F411CEU6.
  2. Na pierwszej planszy generatora konfiguracji STM32CubeMX definiujemy interfejsy i piny z jakich będzie korzystał nasz program.

Jeśli do posiadanego przez nas układu podłączony jest zewnętrzny oscylator kwarcowy, tak jak na płytce Kamami KA-NUCLEO-F411, z listy po lewej stronie okna rozwijamy zakładkę RCC i z pola “High Speed Clock (HSE)” wybieramy pozycję “Crystal/Ceramic Resonator”.

Układ STM32F411CEU6 posiada 3 interfejsy UART – USART1, USART2 i USART3, które możemy uruchomić na wyprowadzeniach procesora o identyfikatorach: peryferial USART1 – PA10 (pin RX) / PA9 (pin TX), PB7/PB6 lub PB3/PA15, USART2 – PA3/PA2 oraz USART6 – PA12/PA11. W omawianym przykładzie, na potrzeby komunikacji z modułem GPS wybrany został peryferial USART1, na pinach PA10/PA9, odpowiedzialnych wyprowadzeniom kompatybilnym z Arduino – D2/D8. Do tych wyprowadzeń podłączamy nasz moduł GPS – do pinu D2 (odbiorczego po stronie mikrokontrolera), przyłączamy pin nadawczy (TX) modułu, do pinu nadawczego, ze strony mikrokontrolera (TX), możemy opcjonalnie podłączyć pin odbiorczy odbiornika GPS (w przedstawionym przykładzie, nie potrzebujemy transmitować do modułu żadnych danych). Nie możemy też oczywiście zapomnieć o zasileniu modułu GPS – pin VCC (zasilanie układu) przyłączamy do pinu 3V3 płytki KA-NUCLEO-F411, a GND (masę) do pinu GND po stronie płytki.

Rys. 2. Schemat ideowy przyłączenie wyprowadzeń procesora do pinów kompatybilnych z Arduino, na płytce KA-NUCLEO-F411 (źródło: dokumentacja płytki KA-NUCLEO-F411)

Po podłączeniu modułu GPS, włączamy wybrany powyżej interfejs UART. W tym celu, z listy po lewej stronie, rozwijamy pozycję “USART2” i z pola Mode, wybieramy pozycję “Asynchronous”. Dokładny opis konfiguracji i działania interfejsu UART zawarty został w czwartej części tego kursu.

W projekcie skorzystamy także z interfejsu UART, przyłączonego na płytce KA-NUCLEO (poprzez wyprowadzenia układu – PA2 (TX) i PA3 (RX)), do programatora, który umożliwi nam przekazania odczytów do komputera. Interfejs ten uruchamiany w sposób identyczny jak opisany powyżej.

Rys. 3. Konfiguracja wyprowadzeń w programie STM32CubeMX
  1. Po skonfigurowaniu wyprowadzeń, przechodzimy do zakładki “Clock Configuration” i w identyczny sposób, jak w poprzednich częściach, konfigurujemy sygnał taktujący rozchodzący się po układzie. Jeśli do układu mikrokontrolera podłączony jest zewnętrzny oscylator kwarcowy, z pola “PLL Source MUX”, wybieramy pozycję “HSE” i w polu “Input frequency” wpisujemy częstotliwość (w MHz) sygnału generowanego przez oscylator (na płytce Kamami KA-Nucleo, jest to wartość 8 MHz). Dalej, w polu “System Clock MUX”, wybieramy pozycję “PLLCLK”. Następnie, w polu “HCLK (MHz)”, wpisujemy pożądaną częstotliwość taktowania całego układu, po przejściu przez pętlę PLL. Wpisujemy tutaj maksymalną dozwoloną wartość – 100 MHz. Opis znaczenia tych parametrów, zawarty został w pierwszej części niniejszego kursu.
Rys. 4. Konfiguracja sygnału zegarowego w programie STM32CubeMX
  1. Teraz możemy już przejść do trzeciej zakładki – Configuration i ustawić parametry pracy obu wykorzystywanych peryferiali. W tym celu, klikamy kolejno na przyciski USART1 i po zakończeniu konfiguracji pierwszego peryferialu – USART2. W przypadku interfejsu przyłączonego do modułu GSM, w pole Baud Rate, wpisujemy wartość 9600 Bits/s, pozostałych wartości nie zmieniamy. Dla interfejsu przyłączonego do komputera, szybkość transmisji powinna wynosić 115200 b/s. Konfiguracja obu interfejsów została przedstawiona na rysunkach 5 i 6.
Rys. 5. Konfiguracja interfejsu USART1 w programie STM32CubeMX
Rys. 6. Konfiguracja interfejsu USART2 w programie STM32CubeMX
  1. Dla interfejsu przyłączonego do odbiornika GPS, potrzebujemy jeszcze włączyć przerwanie wywoływane w momencie otrzymania od GPS nowych danych. W tym celu, ponownie przechodzimy do konfiguracji interfejsu USART1, tym razem jednak, z paska na górze okna konfiguracyjnego, wybieramy zakładkę NVIC Settings i zaznaczamy tam jedyną opcję – “USART1 global interrupt”.
Rys. 7. Włączanie obsługi przerwania w opcjach interfejsu USART1 w programie STM32CubeMX

 

Rys. 8. Włączanie obsługi przerwania w opcjach interfejsu USART2 w programie STM32CubeMX
  1. Nie pozostaje nam już nic innego, jak wygenerować projekt i zaimportować go w środowisku IDE. Będąc jeszcze w programie STM32CubeMX, klikamy ikonę zębatki znajdującą się na pasku narzędziowym. W nowym oknie wybieramy nazwę projektu (pole “Project Name”), ścieżkę dostępu do miejsca w którym ma on zostać zapisany (“Project Location”), z pola “Toolchain / IDE”, wybieramy używane przez nas środowisko – “SW4STM32”, w zakładce “Code Generation”, zaznaczamy opcję “Generate peripheral initialization as a pair of ‘.c/.h’ files per pepipheral” i klikamy przycisk “OK”.
Rys. 9. Eksport projektu z programu STM32CubeMX do programu System Workbench for STM32
  1. Uruchamiamy program System Workbench for STM32, zamykamy planszę powitalną, w ramce „Project Explorer” klikamy prawym przyciskiem myszy i z menu kontekstowego wybieramy kolejno: „Import” -> „Existing Projects into Workspace”, podajemy ścieżkę dostępu, wybieramy nowo utworzony projekt i zatwierdzamy import przyciskiem „Finish”.
  2. Aby możliwe było korzystanie z wartości zmiennoprzecinkowych, w funkcjach printf(), sprintf(), scanf() oraz sscanf(), konieczne jest dodanie parametrów „-u _printf_float” oraz „-u _scanf_float” do linii polecenia linkera. Robimy to, klikając prawym przyciskiem myszy na nazwę nowego projektu, z menu kontekstowego, wybierając pozycję „Properties” oraz nawigując do „C/C++ Build” -> „Settings” -> „Miscellaneous” i dopisując do pola „Linker flags” wartość: „ -u _printf_float -u _scanf_float”.
Rys. 10. Zmiana parametrów wywołania linkera w opcjach projektu programu System Workbench for STM32
  1. Modyfikujemy kod źródłowy pliku „Src/main.c” zgodnie z listingiem nr 2 oraz tworzymy dwa nowe pliki – “gps.h”, w podfolderze “Inc” oraz “gps.c”, w “Src”, wypełniając je zawartością listingów nr 3 i 4. Aby to zrobić, w panelu Project Explorer, znajdującym się z lewej strony głównego okna środowiska, klikamy prawym przyciskiem myszy na nazwę podfolderu (“Inc” i “Src”), a następnie, z menu kontekstowego wybieramy kolejno: “New” -> “File”, podajemy jego nazwę i zatwierdzamy klikając “Finish”.

Do pobrania

Autor: