Digilent Pmod i STM32 (cz. 4) – PmodOLED, PmodGPS i Pmod8LD
W czwartej odsłonie cyklu poświęconego modułom Pmod zostaną opisane moduły PmodOLED, PmodGPS oraz Pmod8LD. Przykłady dla wymienionych modułów przygotowano dla środowiska Atollic TrueSTUDIO i zestawu uruchomieniowego KAmeleon (www.kameleonboard.org) z wykorzystaniem biblioteki STM32Cube_FW_L4.
PmodOLED
Moduł PmodOLED zawiera monochromatyczny wyświetlacz graficzny typu OLED o rozdzielczości 128×32 pikseli. Wyświetlacz jest sterowany za pomocą kontrolera SSD1306 z wewnętrzną pamięcią RAM o rozmiarze 1 kB. Dzięki temu może on obsługiwać wyświetlacze o maksymalnym rozmiarze 128×64 pikseli. Pamięć RAM kontrolera podzielono na 8 stron. Dostęp do nich jest możliwy za pośrednictwem interfejsów SPI, I2C, a także interfejsu równoległego z 8-bitową szyną danych.
Połączenie z KAmeleonem
PmodOLED wyposażono w 12-pinowe złącze Pmod SPI typu 2A zawierające oprócz sygnałów SPI cztery sygnały sterujące pracą wyświetlacza. Ze względu na liczbę sygnałów niezbędnych do obsługi modułu nie może on być podłączony do złącza Pmod-SPI KAmeleona, dlatego na potrzeby przykładu wykorzystano złącze Arduino. Lista wszystkich sygnałów oraz sposób ich podłączenia do zestawu KAmeleon znajduje się w tabeli 1.
Tabela 1. Podłączenie modułu PmodOLED do złącza ARDUINO zestawu KAmeleon
Sygnał | Numer pinu PmodOLED | Numer pinu KAmeleon ARDUINO CONNECTOR | Pin mikrokontrolera |
CS | 1 | D10 | PB12 |
MOSI | 2 | D11 | PB15 |
MISO | 3 | D12 | PB14 |
SCLK | 4 | D13 | PB10 |
GND | 5 | GND | – |
VCC | 6 | +3,3 | – |
D/C | 7 | D9 | PB13 |
Reset | 8 | D8 | PD11 |
VBATC | 9 | D7 | PB11 |
VDDC | 10 | D6 | PD10 |
GND | 11 | – | – |
VCC | 12 | – | – |
Kod projektu
Do obsługi wyświetlacza wykorzystano bibliotekę pobraną z oficjalnej strony modułu PmodOLED i przeznaczoną dla środowiska MPIDE: https://reference.digilentinc.com/pmod/pmod/oled/example_code.
Znajdujący się w niej plik sterownika (Drivers/OLED/OledDriver.cpp) zmodyfikowano tak, aby korzystał z biblioteki do obsługi interfejsu SPI, a także linii GPIO STM32Cube_FW_L4. Bibliotekę napisano w języku C++, dlatego projekt przykładu również skonfigurowano dla tego języka.
Obsługa wyświetlacza rozpoczyna się od utworzenia obiektu klasy OledClass, a następnie wywołania metody OledClass::begin(). Jest ona odpowiedzialna za konfigurację interfejsów SPI i GPIO, inicjalizację wewnętrznych pól sterownika, przeprowadzenie procedury inicjalizacji wyświetlacza, a także wyzerowanie wewnętrznego bufora danych oraz pamięci kontrolera SSD1306. Fragment kodu, realizujący konfigurację SPI przedstawiono na listingu 1. Ustawia on polaryzację i fazę zegara w trybie 3. (CPOL=1, CPHA=1), rozmiar danych na 8 bitów i programową kontrolę sygnału CS (NSS).
Listing 1: Konfiguracja inerfejsu SPI dla PmodOLED
pmodOledSpi.Instance = SPI2; pmodOledSpi.Init.Mode = SPI_MODE_MASTER; pmodOledSpi.Init.Direction = SPI_DIRECTION_2LINES; pmodOledSpi.Init.DataSize = SPI_DATASIZE_8BIT; pmodOledSpi.Init.CLKPolarity = SPI_POLARITY_HIGH; pmodOledSpi.Init.CLKPhase = SPI_PHASE_2EDGE; pmodOledSpi.Init.NSS = SPI_NSS_SOFT; pmodOledSpi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128; pmodOledSpi.Init.FirstBit = SPI_FIRSTBIT_MSB; pmodOledSpi.Init.TIMode = SPI_TIMODE_DISABLE; pmodOledSpi.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; pmodOledSpi.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; HAL_SPI_Init(&pmodOledSpi);
Pełna procedura inicjalizacji wyświetlacza opisano w dokumentacji modułu dostępnej na stronie: https://reference.digilentinc.com/reference/pmod/pmodoled/reference-manual.
Funkcje rysowania i pisania
Operacje rysowania i pisania są dostępne poprzez API biblioteki OLED, którego najważniejsze metody wymienono w tabeli 2. Ze względu na obecność wewnętrznego bufora obrazu w bibliotece OLED wszystkie operacje wykonują się w pamięci mikrokontrolera. Natomiast wyświetlacz aktualizuje się na żądanie. Jest to optymalizacja mająca na celu ograniczenie liczby transferów SPI i umożliwienie nakładania na siebie wyświetlanych elementów. W przypadku tekstu można włączyć lub wyłączyć opcję buforowania. W drugim przypadku napisy są wysyłane bezpośrednia do pamięci kontrolera wyświetlacza. Na uwagę zasługują także dwa tryby pisania. Pierwszy z nich (metody OledClass::drawChar i OledClass::drawString) umieszcza znaki w dowolnym miejscu wyświetlacza ustawianym metodą OledClass::moveTo. W drugim trybie, obsługiwanym przez metody OledClass::putChar i OledClass::putString, wyświetlacz można podzielić na 4 linie i 16 kolumn. Napis jest do nich wyrównywany. Linia i kolumna wybierana jest za pomocą metody OledClass::setCursor.
Tabela 2. Wybrane metody klasy OledClass
Metoda | Opis |
OledClass::begin | Włączenie zasilania kontrolera i inicjalizacja wyświetlacza |
OledClass::end | Wyłączenie zasilania kontrolera i wyświetlacza |
OledClass::displayOn | Włączenie wyświetlania |
OledClass::displayOff | Wyłączenie wyświetlania bez utraty stanu pamięci obrazu |
OledClass::clear | Czyszczenie wewnętrznego bufora biblioteki i pamięci kontrolera |
OledClass::clearBuffer | Czyszczenie wewnętrznego bufora biblioteki |
OledClass::updateDisplay | Wysłanie bufora obrazu do pamięci kontrolera |
OledClass::setDrawColor | Ustawienie koloru do rysowania piksela i linii (0 lub 1) |
OledClass::setDrawMode | Ustawienie trybu nakładania (nadpisanie, AND, OR, XOR) |
OledClass::setFillPattern | Ustawienie wzorca wypełnienia |
OledClass::getStdPattern | Pobranie wskaźnika na jeden ze wzorców wypełnienia (0-7) |
OledClass::moveTo | Ustawienie punktu początkowego do rysowania |
OledClass::drawPixel | Rysowanie piksela |
OledClass::drawLine | Rysowanie linii |
OledClass::drawRect | Rysowanie niewypełnionego prostokąta |
OledClass::drawFillRect | Rysowanie prostokąta wypełnionego wybranym wzorcem |
OledClass::putBmp | Rysowanie bitmapy |
OledClass::drawChar | Rysowanie znaku |
OledClass::drawString | Rysowanie napisu |
OledClass::setCursor | Ustawienie kursora do pisania z wyrównaniem do linii i kolumny |
OledClass::setCharUpdate | Włączenie lub wyłączenie buforowania znaków i napisów |
OledClass::putChar | Rysowanie znaku z wyrównaniem do linii i kolumny |
OledClass::putString | Rysowanie napisu z wyrównaniem do linii i kolumny |
Przykład obsługi modułu PmodOLED
W opisywanym przykładzie wykonywana jest inicjalizacja, a następnie cały wyświetlacz jest pokrywany wybranym wzorcem. Na środku umieszczane są dwa napisy: „Hello PmodOLED” i „KAmeleon board”. Efekt działania programu przedstawiono na fotografii 2.