W pierwszym artykule z serii traktującej o wyświetlaczu LCD, zdecydowałem, iż na początku wykorzystamy do komunikacji z nim zwykłe piny GPIO. Wymagały one co prawda ręcznego sterowania, ale dzięki temu bardzo szybko udało się uruchomić panel. Zaznaczyłem, że w przyszłości rozważymy przejście na interfejs szeregowy SPI bądź równoległy, z wykorzystaniem kontrolera FSMC (ang. Flexible Static Memory Controller). przyszłość stała się teraźniejszością!
Wraz ze zwiększaniem się ilości elementów graficznych, znacząco spadła szybkość odświeżania ekranu. Wprowadzenie tła wymusiło konieczność “rysowania” ogromnej liczby pikseli w krótkim czasie tak, aby uniknąć migotania obrazu. Cóż… GPIO osiągnęło kres swoich możliwości 🙁
Przesiadka na FSMC wcale nie okazała się taka trywialna. Oczywiście przepięcie przewodów na płytce prototypowej i skonfigurowanie FSMC było dość proste, jednak okazało się, że obraz nie jest wyświetlany stabilnie….
Dlaczego?
Otóż okazało się, że FSMC pracujące ze znacznie większą prędkością niż zwykłe piny GPIO jest bardziej czułe na niewielkie szpilki, pojawiające się na liniach zasilających układów cyfrowych. Aby rozwiązać problem musiałem dolutować kilka kondensatorów ceramicznych, idealnie tłumiących wszelkie niepożądane zakłócenia. Nieco więcej na ten temat opowiem w przyszłości, w odrębnym artykule o zasilaniu.
Połączenie wygląda więc następująco:
Liczba zajętych pinów nie uległa zmianie, jedynie ich położenie musiało zostać dopasowane do wymagań stawianych przez interfejs FSMC. Nie jest on w stanie multipleksować sygnałów wyjściowych na różne piny, stąd mapping jest sztywny i nie mamy możliwości “żonglowania”. To jedna z najpoważniejszych wad tego rozwiązania.
Hmmm.. a zalety?
Nie musimy mozolnie przełączać ręcznie stanu pinów wyjściowych, wpisywać danych na magistralę, itp. Od tej chwili cała operacja zapisu obsługiwana jest wewnętrznie przez FSMC. Od strony oprogramowania niczym nie odróżnia się ona od wpisania wartości pod konkretny adres pamięci. Około 6-krotnemu skróceniu uległ dzięki temu czas potrzebny na ustawienie pojedynczego piksela.
Dodatkowo, gdyby w przyszłości wciąż brakowało nam mocy obliczeniowej, możemy wykorzystać transfer DMA, który będzie w stanie “automatycznie” wypełniać większe fragmenty obrazu bez konieczności ingerencji procesora.