Dziś nareszcie zajmiemy się najistotniejszym elementem układanki – kolorowym wyświetlaczem LCD 🙂 Na początek przyjrzyjmy się możliwościom naszego STM32F407 w zakresie sterowania taką matrycą.
Metody sterowania wyświetlaczem
Istnieje cała gama przeróżnych, dedykowanych interfejsów dla wyświetlaczy LCD. Najogólniej można je podzielić na dwie grupy: szeregowe oraz równoległe. Pierwsze z nich do przesyłu obrazu wykorzystują zaledwie kilka linii – odbywa się to jednak kosztem szybkości odświeżania. Interfejsy równoległe wymagają znacznie większej liczby pinów (często powyżej 20), co jednak przekłada się na znacznie szybszy przesył danych. Pomijam tu celowo różnicowe interfejsy szeregowe LVDS, ponieważ nie są obsługiwane przez nasz mikrokontroler i zazwyczaj trafiają do matryc o wysokiej rozdzielczości (powyżej VGA – 640×480).
Co potrafi nasz mikrokontroler?
Szeregowy interfejs SPI najwygodniej obsłużyć, korzystając z jednego z kontrolerów magistrali SPI w jakie został wyposażony układ STM32F407. Połączenie wymaga użycia jedynie czterech linii: /CS, MISO, MOSI oraz CLK.
Jeśli chodzi o interfejsy równoległe (zarówno typu 8080, jak i 6800), do sterowania możemy wykorzystać zwykłe piny I/O, którymi będziemy ręcznie sterować. Jest to rozwiązanie niezwykle elastyczne pod względem routowania płytki drukowanej. Można bowiem prowadzić ścieżki niemalże dowolnie, ponieważ do komunikacji może zostać użyte praktycznie każde wyprowadzenie mikrokontrolera.
Nieco mniej elastycznym, za to bardziej eleganckim i wydajnym sposobem jest użycie kontrolera pamięci (FSMC – ang. Flexible Static Memory Controller), w jaki wyposażono układ STM32F407. Zazwyczaj służy on do podłączenia zewnętrznych banków pamięci, jednak może zostać użyty również jako interfejs dla LCD. Wówczas każda operacja odczytu lub zapisu danych do wyświetlacza jest realizowany jak zwykły dostęp do pamięci. Nie są wymagane dodatkowe operacje, np. ręczne sterowanie pinami, jak to miało miejsce w poprzedniej metodzie.
Podsumowanie
Spróbujmy porównać opisane metody sterowania.
Interfejs szeregowy SPI
Zalety:
- wymaga jedynie czterech linii sygnałowych,
- możliwość użycia sprzętowego kontrolera SPI,
Wady:
- niższa prędkość odświeżania,
- ograniczona dostępność matryc LCD obsługujących interfejs SPI,
Interfejs równoległy – sterowanie GPIO
Zalety:
- możliwość użycia dowolnych wyjść GPIO mikrokontrolera,
- niezwykle prosta konfiguracja,
Wady:
- niższa prędkość odświeżania niż przy użyciu FSMC,
- wymaga użycia około 20 pinów procesora,
- konieczność ręcznego obsługiwania I/O,
Interfejs równoległy – sterowanie FSMC
Zalety:
- największa szybkość odświeżania,
- prosty i wygodny interfejs od strony programowej (identyczny z zapisem/odczytem zwykłej pamięci),
Wady:
- sztywny mapping pinów FSMC,
- wymaga użycia około 20 pinów procesora,
Na chwilę obecną zdecydowałem się wykorzystać najprostsze w realizacji sterowanie GPIO. Pozwoli ono relatywnie szybko uruchomić wyświetlacz i zapewni swobodę przy mapowaniu pinów. W przyszłości natomiast, w miarę potrzeb przejdziemy na interfejs SPI (jeśli okaże się wystarczająco szybki) lub wykorzystamy sterownik FSMC, aby poprawić wydajność i uprościć sterowanie.
Gwiazda wieczoru!
Niedawno w moje ręce trafiły dwa, podobne moduły wyświetlaczy LCD. Oba mają rozdzielczość 320×480 pikseli, przekątną 3.2 cala oraz posiadają równoległy interfejs typu 8080. Jeden z nich wyposażony jest w dedykowane złącze pasujące do popularnych zestawów Arduino.
W celu sprawdzenia, podłączyłem jeden z nich do płytki prototypowej i spróbowałem wypełnić cały obszar wyświetlacza jednym kolorem – oto efekt! 😀
Jutro druga część – próba stworzenia biblioteki graficznej. Zapraszam!