STM32Butterfly2: obsługa wyświetlacza z Nokii 3310

 Nieodłącznym elementem większości typowych projektów jest prezentacja danych użytkownikowi. Stosować do tego celu można diody LED, wyświetlacze segmentowe i różnego rodzaju wyświetlacze ciekłokrystaliczne. Poniższy projekt przedstawia obsługę wyświetlacza ciekłokrystalicznego bazującego na sterowniku PCD8544 (lub zgodnego), montowanego w telefonach Nokia 3310. Ze względu na łatwość obsługi zyskał on dużą popularność wśród elektroników w realizowanych przez nich projektach. Wyświetlacz oparty o sterownik PCD8544 charakteryzuje się matrycą o rozdzielczości 84×44 piksele, transmisja odbywa się z wykorzystaniem magistrali SPI. Poniższy opis nie będzie zawierał dokładnej zasady komunikacji i działania wyświetlacza opartego na sterowniku, w celu zapoznania się z nią polecić mogę dokumentację do sterownika (zamieszczoną poniżej) oraz artykuł „Wyświetlacz graficzny do Nokii 3310. Stary wyświetlacz, nowe problemy…” zamieszczony w Elektronice Praktycznej 12/2009.  
Projekt został przygotowany dla zestawu ewaluacyjnego STM32Butterfly2 oraz STM32Butterfly, ze względu na pewne różnice w budowie obu zestawów projekt wymaga oddzielnej kompilacji. W przypadku przygotowywania projektu dla płytki STM32Butterfly operacje make należy wykonać z dodatkowym argumentem – BOARD=1. Wywołanie takie spowoduje stworzenie przez preprocesor definicji określających linie, do których podłączony jest joystick. W przypadku otwarcia zbioru projektów w TrueStudio można dokonać edycji pliku Makefile w katalogu głównym dodając dodatkowy argument BOARD=1. Projekt wykorzystuje moduł KAmodLCD1, bazujący na wyświetlaczu opartym o sterownik PCD8544. Połączenie modułu z płytką zostało przedstawione na rysunku 1.

Rys. 1. Sposób połączenia płytki STM32Butterfly2 z wyświetlaczem z Nokii 3310

Rys. 1. Sposób połączenia płytki STM32Butterfly2 z wyświetlaczem z Nokii 3310

 

Stworzona aplikacja ma za zadanie wyświetlać na wyświetlaczu kierunek w jakim został odchylony joystick umieszczony na płytce ewaluacyjnej. W komunikacji wykorzystaną sprzętową komunikację SPI. Dodatkowo zaimplementowana została prosta eliminacja drgań styków joysticka. Poniżej przedstawiono program główny aplikacji.

 

W pierwszym kroku mamy ustawiany bit odpowiedzialny za włączenie zegara dla GPIO, do którego podłączony jest joystick. Kolejne dwie funkcje odpowiadają za konfigurację linii, do których podłączony jest joystick. Pierwsza funkcja konfiguruje linie jako wejściowe. Funkcja io_config_ext wymaga podania czterech parametrów: pierwszy określa port, drugi określa linie, trzeci i czwarty określa tryb działania. Druga funkcja powoduje podciągnięcie linii do potencjału dodatniego. Funkcja io_set_clr_mask jako pierwszy parametr przyjmuje nazwę portu, dugi określa ustawiane i zerowane bity, natomiast ostatni parametr jest maską blokującą zmianę stanu na pozostałych liniach. Następnie wywoływana jest funkcja time_init(), odpowiedzialna jest ona za skonfigurowanie licznika SysTick. Listing funkcji jest następujący:

 

Na początku określany jest priorytet przerwania pochodzącego od licznika SysTick. W kolejnym kroku do rejestru SysTick->LOAD zapisywana jest wartość, która określa z jaką częstotliwością będzie wywoływane przerwanie. Kolejne polecenia włącza generowanie przerwania, ostanie uruchamia licznik.
Kolejnym poleceniem w programie głównym jest funkcja nlcd_init(). Odpowiada ona za inicjalizację podłączonego wyświetlacza, bazującego na sterowniku PCD8544. Inicjalizacja polega na skonfigurowaniu linii GPIO podłączonych do wyświetlacza i SPI oraz wysłaniu danych inicjalizujących. Opis zostanie ograniczony do tych najważniejszych elementów, czyli funkcji konfigurującej linii GPIO i SPI oraz funkcji wysyłania danych przez SPI.
Poniżej przedstawiono listing funkcji odpowiedzialnej za konfigurację komunikacji z wyświetlaczem.

 

Pierwsze polecenie odpowiada za włączenie zegarów dla używanych GPIO oraz SPI1. W kolejnym kroku realizowana jest konfiguracja linii GPIO, ustawiane są one do pracy alternatywnej jako linie magistrali SPI. Funkcje dc_pin(), sel_pin() oraz res_pin() odpowiadają za ustawianie odpowiedniego stanu na liniach D/C, SCE oraz RES.
Konfiguracja magistrali SPI sprowadza się do ustawienia odpowiednich bitów w rejestrze SPI1->CR1. W przypadku przedstawionego projektu ustawiane są bity:

  • SPI_Direction_1Line_Tx – transmisja z wykorzystaniem tylko jednej linii nadającej sygnał (ustawiane są dwa bity),
  • SPI_Mode_Master – działanie w trybie Master,
  • SPI_DataSize_8b – ramka długości 8 bitów,
  • SPI_CPOL_Low i SPI_CPHA_1Edge – ustawienie konkretnego trybu działania magistrali SPI,
  • SPI_BaudRatePrescaler_16 – dzielnik zegara ustawiony na 16 (ustawiane są trzy bity),
  • SPI_FirstBit_MSB – pierwszy transmitowany jest najbardziej znaczący bit,
  • SPI_NSS_Soft – linia NSS kontrolowana jest programowo.

Ustawienie bitu CR1_SPE_Set w rejestrze SPI1->CR1 powoduje uruchomienie magistrali SPI. Wysyłanie sprowadza się do zapisania danych do rejestru SPI1->DR, jednak podczas przeprowadzania tej operacji należy pamiętać o sprawdzeniu dwóch flag informujących o działaniu magistrali SPI. Pierwszą flagą jaka jest sprawdzane przed zapisem danych jest flaga TXE, informuje ona czy aktualnie bufor jest wolny. Natomiast druga flaga – BSY – informuje o aktualnie przeprowadzanym wysyłaniu danych bądź zajętości SPI. Listing funkcji wysyłającej dane do wyświetlacza przedstawiono poniżej.

 

Po przeprowadzeniu inicjalizacji kolejną czynnością wykonywaną w programie głównym jest wyświetlenie wiadomości powitalnej na wyświetlaczu. Realizuje to funkcja , która przyjmuje trzy parametry: pierwszym jest ciąg tekstu do wyświetlenia, drugi i trzeci parametr określa położenie tekstu na wyświetlaczu.
Po wyświetleniu komunikatu program przechodzi do nieskończonej pętli, w czasie której pobierany jest stan pozycji joysticka. Odczyt wykonywany jest dwukrotnie z pewnym opóźnieniem które służy eliminacji drgań styków. W przypadku jednakowego odczytu na wyświetlaczu prezentowana jest informacja o położeniu joysticka.
Odczyt położenia joysticka realizowany jest przez funkcję joy_keys(), Listing jej został przedstawiony poniżej.

 

Funkcja ogranicza się do odczytania stanu linii przy wykorzystaniu funkcji io_get_mask, która jako pierwszy parametr przyjmuje nazwę portu, natomiast jako drugi maskę ograniczającą odczyt do wskazanych linii. Zwracana wartość jest odpowiednio przetwarzana tak aby zmiana położenia joysticka powodowała ustawienie odpowiedniego bitu.

Autor projektu: Lucjan Bryndza
Redakcja i przygotowanie: Mariusz Dziębowski

Do pobrania

Autor: