[5] STM32CUBE w przykładach (obsługa monochromatycznego wyświetlacza graficznego LCD)

Liczby heksadecymalne

Polecenia sterujące były przedstawiane w postaci ośmiocyfrowych liczb binarnych oraz dwucyfrowych liczb heksadecymalnych. Zapisy te są równoznaczne. Każda cyfra/znak heksadecymalny koduje 4 cyfry binarne – bity. Do konwersji liczb między tymi zapisami przydatna może być tabela 2.

Tab. 2. Cyfry heksadecymalne

W kodzie języka C, chcąc zapisać liczbę heksadecymalną, musimy poprzedzić ją symbolami „0x”, liczby binarne poprzedzamy natomiast symbolem „0b”. Zapis heksadecymalny jest bardzo wygodny. Dzięki niemu nie zużywamy tyle miejsca, co na zapisanie pełnej liczby binarnej, wciąż jednak jest to system liczbowy bazujący na podstawie, będącej potęgą liczby 2, co umożliwia nam łatwą zamianę zapisów.

Pierwszy projekt – szachownica

Po wyjaśnieniu teorii działania i sterowania wyświetlaczem, przejdźmy do części praktycznej i spróbujemy wyświetlić na nim jakiś obraz – szachownice.

Uruchamiamy narzędzie STM32CubeMX i w kreatorze wyboru mikrokontrolera. wybieramy posiadany przez nas układ. Dla przypomnienia, na używanej przeze mnie, podczas tworzenia tego kursu, płytce rozwojowej KA–NUCLEO–F411CE, znajduje się mikrokontroler STM32F411CEU6.

Rys. 5. Konfiguracja wyprowadzeń w STM32CubeMX

Następnie, na pierwszej planszy kreatora, zdecydować musimy jakie wyprowadzenia procesora połączone zostaną z jakimi wyprowadzeniami modułu wyświetlacza. Potrzebujemy także uruchomić interfejs SPI oraz zdefiniować, typ zastosowanego źródła częstotliwości taktowania układu. Nie możemy też oczywiście zapomnieć o podłączeniu modułu wyświetlacza do mikroprocesora.

Na fotografii 6 przedstawiono wyprowadzenia modułu wyświetlacza. Ich funkcje zostały wyjaśnione już wcześniej. Teraz pamiętać potrzebujemy jedynie, że wyprowadzenia procesora, przyłączone do pinów BL, CE, RST i DC powinny być skonfigurowane jako zwykłe wyprowadzenia wyjściowe ogólnego przeznaczenia – piny „GPIO Output”. Piny DIN i CLK to wyprowadzenia interfejsu SPI – odpowiednio MISO oraz SCK.

Fot. 6. Wyprowadzenia modułu wyświetlacza (źródło: sklep internetowy Kamami)

Aby ustawić wyprowadzenie procesora w tryb pracy „GPIO Output”, klikamy prawym przyciskiem na jego rysunek i z listy wybieramy stosowną pozycję. Polecam, przy okazji nadać pinom nazwy, takie jak te na rysunku 5. Ułatwi to ich późniejszą identyfikację oraz użycie w kodzie programu. Interfejs SPI konfigurujemy, rozwijając dowolny interfejs „SPIx” na liście po lewej stronie okna programu i z listy rozwijanej „Mode”, wybierając opcję „Transmit Only Master”. Dokładne znaczenie tej opcji przedstawione zostało w poprzedniej części serii. Jeśli nasza płytka rozwojowa lub prototypowa posiada oscylator kwarcowy (tak jak KA–NUCLEO–F411CE), włączamy jego użycie poprzez rozwinięcie, na liście po lewej stronie okna, pozycji „RCC” i ustawienie, w polu „High Speed Clock (HSE)”, wartości „Crystal/Ceramic Resonator”.

Przedstawiony na fotografii 6 moduł, posiada inne oznaczenia pinów, niż posiadany przeze mnie – moduły te występują w wielu różnych wersjach, produkowanych przez różnych producentów. Pin BL został oznaczony jako LCD, CE – SCE, a CLK, jako SCLK.

Jeśli korzystamy z płytki rozwojowej KA–NUCLEO, możemy użyć tych samych wyprowadzeń procesora, które przedstawione zostały na rysunku 5 oraz tego sam interfejs SPI1. Należy wtedy połączyć piny modułu wyświetlacza: RST, CE, DC, DIN, CLK, VCC, BL, GND, odpowiednio do pinów płytki: D5, D4, D3, D11, D13, 3.3V, D2, GND.

Na kolejnej planszy kreatora – „Clock Configuration”, podobnie jak w poprzednich częściach, konfigurujemy rozchodzenie się po układzie mikrokontrolera sygnału taktującego. Dokładny opis schematu przedstawiony został w pierwszej części kursu. Jeśli wykorzystywana przez nas płytka ewaluacyjna posiada oscylator kwarcowy, ustawiamy jego częstotliwość oraz wybieramy go jako źródło sygnału częstotliwości – w polu „Input frequency” podajemy jego częstotliwość (na płytce KA–NUCLEO jest to 8 MHz), w polu „PLL Source Mux” wybieramy opcję „HSE”, a w polu „System Clock Mux” – „PLLCLK”. W pole „HCLK”, wpisujemy natomiast maksymalną dozwoloną wartość.

Dalej, przechodzimy do zakładki „Configuration” i z pola „Connectivity”, wybieramy pozycję „SPIx”. Opcja która nas tutaj interesuje to „Prescaler”. Musimy dobrać go tak, aby wartość w polu „Baud Rate”, była możliwie wysoka, ale nie przekraczała 4 Mb/s – maksymalnej częstotliwości obsługiwanej przez kontroler wyświetlacza.

Rys. 7. Konfiguracja szybkości pracy interfejsu SPI

Teraz już możemy wygenerować kod projektu i zaimportować go w środowisku IDE. Klikamy w ikonę zębatki – podajemy nazwę projektu i ścieżkę dostępu do miejsca gdzie ma on zostać zapisany, z pola „Toolchain/IDE”, wybieramy pozycję „SW4STM32”, w zakładce „Code Generator” zaznaczamy opcję „Generate peripherial initialization as pair of ‘.c/.h’…” i klikamy „OK”. Otwieramy środowisko System Workbench for STM32, zamykamy w nim planszę powitalną i w panelu po lewej stronie okna, klikamy prawym przyciskiem myszy, z menu kontekstowego wybieramy opcję „Import…” –> „Existing Projects into Workspace” –> „Browse…”, nawigujemy do folderu projektu i klikamy „Finish”.

Dodajemy do nowego projektu 2 pliki – do folderu „Inc”: „display.h” oraz do folderu „Src”: „display.c”. Aby to zrobić, klikamy PPM na folder nadrzędny i z menu wybieramy opcje: „New” –> „File”, podajemy nazwę tworzonego pliku oraz klikamy przycisk „Finish”. Następnie, oba pliki wypełniamy zawartością, odpowiednio z listingów 1 i 2, modyfikujemy plik main.c zgodnie z listingiem 3 oraz kompilujemy kod i uruchamiamy go na mikrokontrolerze – ikony młotka i robaka, na pasku narzędziowym.

List. 1. Zawartość pliku display.h

List. 2. Zawartość pliku display.c

List. 3. Zawartość pliku main.c

Podobnie jak w poprzedniej części, funkcje służące do obsługi wyświetlacza wydzielone zostały do osobnych plików. Plik „.h” jest plikiem nagłówkowym – przechowuje on definicje typów danych i struktur, a także prototypy funkcji. Zawartość funkcji umieszczona jest pliku „.c”. Struktura display_config przechowuje informacje na temat używanych pinów i ich portów oraz interfejsu SPI. Musimy ją utworzyć i wypełnić przed wykorzystaniem jakiejkolwiek funkcji „display_…()”. Utworzenie i wypełnienie struktury ma miejsce w pliku „main.c”, w sekcji „USER CODE 2”. Następnie, wywoływane są funkcje display_setup() i display_set_dxy(). Pierwsza z nich, konfiguruje sterownik do pracy, zgodnie z sekwencją przedstawioną powyżej. Druga ustala kierunek rysowania oraz pozycje „kursora”. Dalej, w pętli, rysowany jest wzór szachownicy, poprzez umieszczanie w pamięci RAM wyświetlacza: czterech pionowych pasków „11110000” (hex 0xF0), na przemian z czterema paskami „00001111” (hex 0x0F). W podobny sposób możliwe było by wyświetlenie pliku graficznego – należało by zamienić go na postać 1–bitowej bitmapy o wymiarach 84 x 48 pikseli i przy pomocy darmowego programu LCDAssistant, zamienić na postać tablicy bajtów pionowych pasków, następnie można by przekopiować w pętli całą tablicę do pamięci RAM wyświetlacza, korzystając z funkcji display_write_data().

Autor: admin

Admin