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

List. 2. Kod zawarty w pliku main.c

 

List. 3. Kod zawarty w pliku gps.h

 

List. 4. Kod zawarty w pliku gps.c

 

 

Rys. 11. Drzewo plików i katalogów po dodaniu plików nowej biblioteki w programie System Workbench for STM32
  1. Po dokonaniu modyfikacji, zapisujemy zmiany w plikach, kompilujemy, wgrywamy i uruchamiamy program na mikrokontrolerze – klikamy ikony młotka i robaka, znajdujące się na pasku narzędziowym. Gdy program zostanie już uruchomiony, włączamy program PuTTY, wybieramy w jego ustawianiach typ połączenia – “Serial”, jego szybkość – 115200 kb/s, nazwę portu szeregowego – tą możemy sprawdzić w Menadżerze Urządzeń bądź dmesg-u i klikamy przycisk OK.
Rys. 12. Konfiguracja programu PuTTY do odbioru danych z modułu GPS
Rys. 13. Wykorzystanie oprogramowanie PuTTY do odbioru danych z modułu GPS

Do pliku main.c dodaliśmy zmienną “volatile uint8_t recv_char” oraz funkcję “void HAL_UART_RxCpltCallback(UART_HandleTypeDef * uart)”, a na samym początku sekcji “USER CODE 2”, wywołujemy funkcję “HAL_UART_Receive_IT(&huart1, &recv_char, 1)”. Powoduje to włączenie obsługi przerwania interfejsu UART. Po odebraniu pojedynczego znaku od modułu GPS, znak ten trafia do zmiennej recv_char, a następnie, wywoływana jest funkcja obsługi przerwania – HAL_UART_RxCpltCallback(). W funkcji tej wywołujemy funkcję “gps_recv_char(&gps_handle, recv_char);”, zapisującą kolejne znaki do bufora biblioteki gps.h/gps.c.

Zmienna “volatile struct gps_state gps_handle” przechowuje bufory i liczniki znaków, a także aktualne dane odebrane z GPS. Implementuje ona strukturę danych “struct gps_state” z pliku gps.h. Jest tworzona i wypełniana zerowymi wartościami przez funkcję gps_init() z gps.c, wywoływaną na początku sekcji “USER CODE 2”.

Funkcja gps_recv_char() z biblioteki gps.h/gps.c oczekuje na odebranie znaku “$”, następnie, wszystkie kolejne znaki, aż do odebrania znaku nowej linii – “\n” lub “\r”, zapisuje na kolejnych pozycjach bufora “line_buffer” i inkrementuje licznik “writer_position”. Po odebraniu znaku “\n” lub “\r”, wywoływana jest funkcja gps_process_line(), która korzystając z funkcji pomocniczej gps_read_field(), odczytującej pola do znaku przecinka lub końca ciągu (“\0”), odczytując typ ramki danych i wywołuje odpowiednią funkcję ją przetwarzającą – gps_process_gprmc(), gps_process_gpvtg(), gps_process_gpgga() lub gps_process_gpgsa(). Funkcje te odczytują kolejne pola, parsuje ich zawartość przy pomocy funkcji scanf() i zapisuje ją do zmiennych w strukturze “gps_state”.

Aleksander Kurczyk

 

Do pobrania

Autor: