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
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.
int main(void) { //JOY pin configuration input pullup VCC RCC->APB2ENR |= JOY_PORT_APB2; io_config_ext(JOY_PORT, JOY_BITS, GPIO_MODE_INPUT, GPIO_CNF_IN_PULLUP ); io_set_clr_mask( JOY_PORT, JOY_BITS, JOY_BITS ); //Initialize system timer time_init(); //Initialize nokia display nlcd_init(); //Display welcome message nlcd_put_string("www.boff.pl",0,0); nlcd_put_string("Joy state:",0,1); //Main loop for(;;) { //Read joy state int jstate1 = joy_keys(); wait_ms(KBD_DEBOUNCE_TIME); int jstate2 = joy_keys(); if(jstate1 && jstate1==jstate2) { //Display text based on the key switch(jstate1) { case JOY_L: nlcd_put_string("** KEY LEFT **",0,2); break; case JOY_R: nlcd_put_string("** KEY RIGHT *",0,2); break; case JOY_U: nlcd_put_string("** KEY UP ** ",0,2); break; case JOY_D: nlcd_put_string("** KEY DOWN **",0,2); break; case JOY_OK: nlcd_put_string("** KEY OK ** ",0,2); break; } } } return 0; }
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:
void time_init(void) { //Set Lowest timer Interrupt priority nvic_set_priority(SysTick_IRQn,TIME_SYSTICK_PRIORITY,TIME_SYSTICK_SUBPRIO); SysTick->LOAD = HZ * (CONFIG_HCLK_HZ/(8*MHZ)); SysTick->CTRL |= CTRL_TICKINT_Set; //System counter enable SysTick->CTRL |= SysTick_Counter_Enable; }