Wygląd zestawu STM32L0538-DISCO pokazano na fotografii 1. Zastosowano w nim mikrokontroler STM32L053, który jest wyposażony w rdzeń Cortex-M0+, ponadto 64 kB pamięci Flash i 8 kB RAM. Jednostka centralna mikrokontrolera może być taktowania sygnałem zegarowym do 32 MHz, średnia prędkość wykonywania programów wynosi 0,95 DMIPS/MHz. Użyty w zestawie wyświetlacz ma przekątną 2,04" przy rozdzielczości matrycy 172×72 piksele. Jak każdy z zestawów Discovery, także STM32L0538-DISCO ma wbudowany programator-debugger ST-Link/v2-1.
Przygotowanie środowiska ARM-MDK przebiega krok-po-kroku w następujący sposób:
- Pobieramy oraz instalujemy środowisko MDK-ARM Keil w wersji 5.15 lub nowszej https://goo.gl/QhzLcn.
- Pobieramy oraz instalujemy sterowniki ST-LINK/V2 https://goo.gl/hYW7nU.
- Podłączamy mikrokontroler poprzez złącze USB komputera i złącze USB Mini-B mikrokontrolera USB ST-LINK.
- Otwieramy środowisko MDK-ARM Keil i otwieramy Pack Installer za pomocą ikony na pasku.
- Instalujemy najnowsze biblioteki w Pack Installer poprzez znalezienie w zakładce Packs bibliotek Keil: STM32L0xx_DFP i kliknięcie przycisku Install obok nazwy. Po zakończeniu procesu (wyświetla się tekst Up to date) zamykamy okno Pack Installer. Po instalacji należy zaktualizować lub zainstalować biblioteki ARM::CMSIS w taki sam sposób.
- Wybieramy opcję New µVision Project z zakładki Projects.
- Zapisujemy nowy projekt w wybranym folderze i wpisujemy nazwę projektu, np. New_project. uvprojx.
- Wybieramy z listy mikrokontroler, który powinien się pojawić po zainstalowaniu odpowiednich bibliotek poprzez Pack Installer (STMicroelectronics → STM32L0 Series → STM32L053 → STM32L053C8). Po podświetleniu nazwy klikamy przycisk OK.
- Zostanie wyświetlone okno Manage Run-Time Environment. Klikamy przycisk OK i zakończenie tworzenia nowego projektu.
- Otwieramy folder w którym został zapisany projekt, powinien zawierać pliki nazwa_projektu. uvprojx i nazwa_projektu. uvoptx oraz dwa foldery - Listings i Objects. Tworzymy dwa nowe foldery i nazywamy je Inc oraz Src.
- Pobieramy paczkę bibliotek STM32CubeL0 ( http://goo.gl/632jKy).
- Kopiujemy folder Drivers z paczki STM32CubeL0 do folderu z projektem.
- Przechodzimy do ekranu głównego środowiska MDK-ARM Keil. Prawym przyciskiem myszy klikamy na Target 1 w oknie Project i wybieramy Manage Project Items.
- W oknie Manage Project Items można zmienić domyślną nazwę folderu Source Group 1, Target 1 oraz dodać inne foldery w oknie Groups. Tworzymy kilka grup, np. User, HAL Drivers, CMSIS, BSP, Components oraz dodajemy do odpowiednich folderów wcześniej skopiowanych plików bibliotek za pomocą przycisku Add files.
- Kopiujemy pliki z katalogów Inc i Src z paczki STM32CubeL0 z folderu Projects/STM32L053C8-Discovery/Templates z do tak samo nazwanych folderów w katalogu naszego projektu. (main.h, stm32l0xx_hal_conf.h, stm32l0xx_it.h, main.c, stm32l0_hal_msp.c, stm32l0xx_it.c). Pliki z rozszerzeniem .c dołączamy do grupy User. Następnie dołączamy wszystkie pliki z folderu Drivers/STM32L0xx_HAL_Driver/Src do grupy HAL Drivers.
- Znajdujemy plik system_stm32l0xx.c w katalogu Drivers/CMSIS/Device/ST/STM32L0xx/Source/Templates oraz startup_stm32l053xx.s w katalogu Drivers/CMSIS/Device/ST/STM32L0xx/Source/Templates/arm i dodajemy te pliki do grupy CMSIS.
- Znajdujemy pliki stm32l0538_discovery.c i stm32l0538_discovery_epd.c w katalogu Drivers/BSP/STM32L0538-Discovery i dodajemy ten plik do grupy BSP.
- Znajdujemy plik gde021a1.c w katalogu Drivers/BSP/Components/gde021a1 i dodajemy ten plik do grupy Components.
- Tworzymy nowy plik klikając na zakładkę File oraz New... i kopiujemy do niego kod, jak na listingu 1. Zapisujemy utworzony plik pod nazwą bsp.c klikając File oraz Save as... i dodajemy ten plik do grupy User. Zamykamy okno Manage Projects Items za pomocą przycisku OK.
- Otwieramy okno konfiguracji projektu przyciskiem Options for Target ‘nazwa’ (domyślnie Target 1) lub wybieramy z zakładki Project polecenie Options for Target.
- Dodajemy w zakładce C/C++ w polu Define w ramce Preprocessor Symbols następującą definicję: USE_HAL_DRIVER,STM32L053xx,USE_STM32L0538_DISCO. Za pomocą przycisku po prawej stronie pola Include Paths dodajemy ścieżki do następujących folderów:
- .Inc
- .DriversSTM32L0xx_HAL_DriverInc
- .DriversCMSISDeviceSTSTM32L0xxInclude
- .DriversBSPSTM32L0538-Discovery
- .DriversBSPComponentsgde021a1
- Wybranie w zakładce Debug opcji Use i ST-Link Debugger.
- Następnie wejście w ustawienia za pomocą przycisku Settings, wybranie w zakładce Debug portu SW oraz konfiguracja pamięci Flash w zakładce Flash Download na STM32L0 64KB Flash. Zamknięcie okna ustawień debugowania oraz ustawień Target przyciskiem OK.
- Kompilacja stworzonego projektu za pomocą opcji Rebuild all target files w zakładce Project lub wciśnięcie odpowiadającego tej opcji przycisku na ekranie głównym.
- Jeśli kompilacja przebiegła bezbłędnie, można uruchomić tryb debugowania za pomocą opcji Start/Stop Debugging Session w zakładce Debug oraz wgrać do pamięci mikrokontrolera i uruchomić program za pomocą opcji Run w zakładce Debug lub za pomocą przycisków na ekranie głównym. Jeśli program został uruchomiony poprawnie, dioda kontrolna w zestawie zamiga i zaświeci się na zielono.
Wyświetlenie bitmapy na wyświetlaczu e-paper
Wbudowany w zestaw STM32L0538-DISCO wyświetlacz GDE021A1 wyświetla obrazy monochromatyczne o wymiarach 172×72 pikseli. Aby wyświetlić bitmapę na wyświetlaczu, należy odpowiednio sformatować obraz i skonwertować go na kod możliwy do przesłania do pamięci RAM mikrokontrolera.
Wstępną edycję obrazu możemy dokonać w dowolnym programie graficznym. Programem, który umożliwi konwersję bitmapy na kod oraz edycję zapewniającą dobrą jakość wyświetlonego obrazu jest darmowy XnView. Rozmiar obrazu nie może przekroczyć rozdzielczości wyświetlacza, czyli 172x72 pikseli, możemy tego dokonać wybierając opcję Zmień rozmiar... z zakładki Obraz.
![]() |
Następnym krokiem jest zapisanie obrazu w czarno-białej skali barw, w zależności od obrazu wybieramy rodzaj konwersji zapewniający najlepszy efekt z zakładki Obraz i Konwertuj do czarno-białego.
![]() |
Po konwersji część detali może zniknąć, możemy w tym momencie zapisać plik i dokonać jego edycji w dowolnym programie graficznym, np. Paint. Aby otrzymać obraz na wyświetlaczu odpowiadający naszej bitmapie, musimy obrócić go o 90° zgodnie ze wskazówkami zegara (jego rozmiar zmieni się ze 172×72 na 72×172 pikseli).
![]() |
Ostatnią częścią przygotowania obrazu jest zapisanie go w formacie XBM-X11 korzystając z opcji Zapisz jako... i wybraniu formatu z listy.
W utworzonym wcześniej projekcie w środowisku ARM-MDK otwieramy bitmapę zapisaną w formacie .xbm.
![]() |
Kopiujemy cały kod oprócz definicji rozmiarów (możemy je skopiować i skomentować, aby pamiętać o rozmiarze) do main.c jako prywatną funkcję, zmieniając static char x_bits[] = na static uint8_t x_bits[] =. W miejscu x_bits wpisujemy nazwę naszej funkcji, np. static uint8_t Logo[] =.
W funkcji main() deklarujemy użycie wyświetlacza za pomocą funkcji BSP_EPD_Init(); a następnie używamy następujących funkcji, aby wyświetlić obraz na wyświetlaczu:
BSP_EPD_Clear(EPD_COLOR_WHITE);
BSP_EPD_DrawImage(uint16_t Xpos, uint16_t Ypos, uint16_t Xsize, uint16_t Ysize, uint8_t *pdata);
BSP_EPD_RefreshDisplay();
Funkcja BSP_EPD_Clear(EPD_COLOR_WHITE); zmienia wszystkie piksele wyświetlacza na białe pozwalając na wyświetlenie nowego obrazu.
Funkcja BSP_EPD_DrawImage(uint16_t Xpos, uint16_t Ypos, uint16_t Xsize, uint16_t Ysize, uint8_t *pdata); służy do przesłania danych naszego obrazu do wyświetlacza. Parametry uint16_t Xpos, uint16_t Ypos określają gdzie zostanie wyświetlony obraz. Aby obraz został wyświetlony poprawnie wartość parametru Ypos musi być podzielna przez 4. Parametry uint16_t Xsize, uint16_t Ysize określają rozmiar wyświetlanego obrazu, muszą być zgodne z rozmiarami naszego obrazu (maksymalnie uint16_t Xsize = 72 i uint16_t Ysize = 172). Parametr uint8_t *pdata wskazuje na dane o naszym obrazie, więc należy to wpisać nazwę funkcji pod jaką znajdują się dane skopiowane z pliku .xbm. Przykładowe wywołanie funkcji ma postać: BSP_EPD_DrawImage(0, 3, 48, 172, Logo);.
Funkcja BSP_EPD_RefreshDisplay(); odświeża wyświetlacz i wyświetla nasz obraz po załadowaniu jego danych do pamięci RAM mikrokontrolera.
Jakub Górnicki