Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Computer ControlsComputer Controls
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

STM32 - Opis Libopencm3 + 2.2" 240*320 SPI TFT LCD Module Display ILI9341

06 Apr 2014 15:52 6777 6
  • Level 14  
    Witam
    Jak że jest to mój pierwszy wpis tego typu to proszę o wyrozumiałość.

    Słowem wstępu.
    Chciał bym się z wami podzielić kilkoma moimi doświadczeniami w programowaniu mikrokontrolarów STM32F103 i STM32L152 (STMDISCOVERY) za pomocą otwartej biblioteki libopencm3 ( http://www.libopencm3.org ). Ja pracuję tylko na Ubuntu 64bit. Jako toolchain używam Summon ARM (link do instalacji : http://gnuarmeclipse.livius.net/wiki/Summon_ARM_toolchain_installation_on_Linux) , w wgrywam za pomocą SWD z STM32Ldiscovery.

    Cytuję za stroną „Projekt libopencm3 ma na celu stworzenie wolnej, otwartej (LGPL v3) biblioteki oprogramowania dla różnych mikrokontrolerów ARM opartych o rdzenie: Cortex-M0(+)/M3/M4 takich jak: ST STM32, Ti Tiva and Stellaris, NXP LPC 11xx, 13xx, 15xx, 17xx parts, Atmel SAM3, Energy Micro EFM32 i innych.”
    Projekt libopencm3 nie jest systemem operacyjnym. Jest biblioteką która ma podobne zadanie jak STM32F10x_StdPeriph_Lib. Nie uwalnia nas czytania datasheet czy manual, nie posiada sterowników wyższego poziomu (ale posiada bardzo przyjemne wsparcie USB dla STM32F103 i STM32L152 co przetestowałem osobiście).


    Instalacja libopencm3 jest bardzo prosta (o ile mamy poprawnie zainstalowany toolchain).
    Ponieważ korzystam z różnych kompilatorów na różne platformy to aby mieć porządek stworzyłem sobie prosty skrypt .sh:
    Code: bash
    Log in, to see the code

    następnie w terminalu przed kompilacją biblioteki (jak i przykładów) ustawienia wczytuję poleceniem:
    Code: bash
    Log in, to see the code

    Następnie pobieramy źródła biblioteki:
    Code:

    git clone git://github.com/libopencm3/libopencm3.git

    wchodzimy do katalogu
    Code:

    cd libopencm3

    i kompilujemy:
    Code:

    make

    I w zasadzie jeśli chodzi o bibliotekę to to już wszystko.

    Teraz wypadało by jakiś miganie diodami przetestować.

    Programiści libopencm3 mają osobne repozytoriom GIT dla przykładów: libopencm3-examples.
    Otwieramy nowy terminal.
    Tradycyjnie wczytujemy skrypt z ustawieniami.
    Pobieramy źródła przykładowych kodów:
    Code:

    git clone git://github.com/libopencm3/libopencm3-examples.git

    Teraz jest bardzo ważne. Należy w katalogu z przykładami (tam gdzie jest plik Makefile i README) stworzyć dowiązanie symboliczne do katalogu libopencm3 (usunąć istniejące).
    Potem już zwyczajnie wystarczy
    Code:
    make

    Jeśli wszystko przebiegło poprawnie to mamy zrobione gotowe przekłady kodów na wiele platform.
    Są tam również przykłady obsługi USB. Minusem przykładowych kodów z repozytorum jest to że każdy przekład „mieści” się w jednym pliku źródłowym. Do testowanie jest to może i OK ale dla poważniejszych zastosowań to już nie wystarczy, dlatego przerobiłem plik Makefile tak że kompiluję sobie kod z kilku plików źródłowych. Przerobiłem go już dosyć dawno i nie pamiętam ja czyich plikach się opierałem.
    Gdyby ktoś potrzebował to załączam te pliki.

    O ile przebrnęliście do tego miejsca i wszystko wam działa to super.
    Przykładowo ja wgrywam firmware za pomocą openocd poprzez stm32ldiscovery:
    Code:

    sudo openocd -f interface/stlink-v2.cfg -f target/stm32f1x_stlink.cfg  -c "init" -c "reset halt" -c "flash write_image erase SPI_ILI9341.elf" -c "reset run" -c "shutdown"


    Tyle na temat opisu biblioteki libopencm3i przykładów.

    Wyświetlacz

    Na Ebayu można kupić bardzo tanio kolorowe wyświetlacze 2.2" 240*320 SPI TFT LCD Module Display ILI9341 ( http://www.ebay.pl/itm/2-2-inch-240-320-SPI-T...LI9341-For-51-AVR-STM32-ARM-PIC-/321150097254 ) STM32 - Opis Libopencm3 + 2.2" 240*320 SPI TFT LCD Module Display ILI9341 STM32 - Opis Libopencm3 + 2.2" 240*320 SPI TFT LCD Module Display ILI9341
    Na zdjęciu widać programator STM32LDISCOVERY, płytkę prototypową z STM32F103, wyświetlacz ILI9341 oraz podpięty analizator logiczny bez którego bym tego nie uruchomił.

    Mi udało się przeportować kod z dla arduino na bibliotekę libopencm3. Opierałem się głównie na kodach gmtii/ili9341-arduino ( link: https://github.com/gmtii/ili9341-arduino ), przeniosłem tylko to co mi było potrzebne więc nie ma jeszcze wszystkich funkcji ale wyświetlacz ładnie działa.

    Niestety pomimo wielu godzin spędzonych próbując uruchomić ten wyświetlacz na STM32LDISCOVERY nie udało się mi odczytać poprawnej odpowiedzi tego wyświetlacza, natomiast gdy przeniosłem kod na STM32F103 na moją płytkę prototypową to praktycznie ruszyło do razu.

    Gdyby ktoś potrzebował to dołączam również kod to sterowania ILI9341.
    W pliku SPI_ILI9341 mam również obsługę UART wraz z stdio więc działa funkcje printf ale za to kod ma około 32kb :-(
    Do you have a problem with Arduino? Ask question. Visit our forum Arduino.
  • Computer ControlsComputer Controls
  • Level 27  
    Mi do tej pory nie udało się uruchomić transmisji zwrotnej - od wyświetlacza do procesora. Mimo użycia SPI programowego i sprzętowego, nie mam komunikacji. Też miałeś z tym problem? Masz teraz komunikację w obie strony? Ja nie używałem żadnych bibliotek, wszystko od zera robiłem sam, znalazłem tylko gdzieś w internecie i użyłem sekwencji inicjalizacyjnej. Ogólnie bardzo ładnie działa i dość szybko jak na SPI.
  • Computer ControlsComputer Controls
  • Level 14  
    Komunikacja działa w obie strony ale dla STM32F103 , w STM32L152 chyba na 5 sposobów doczytywałem rejestr DR ale zawsze był pusty pomimo tego że na analizatorze widziałem że ILI9341 odpowiedział poprawnym kodem.
    SPI jest sprzętowe.

    Tak jak napisałem - bez analizatora bym tego nie uruchomił.

    dziechu jeki uC używasz ?
  • Level 27  
    STM32F103RE. Nie wiem dlaczego nie mam zwrotnej komunikacji, muszę to jeszcze raz sprawdzić, choć nie jest ona niezbędna.

    Dodano po 3 [minuty]:

    Mi właściwie ruszył od pierwszego uruchomienia, najpierw na programowym SPI (nie było szukania dlaczego nie działa - czy problem z konfiguracją SPI czy inny). Potem jak ruszył, przełączyłem na sprzętowy SPI. Jaką masz prędkość? Mi cały ekran (np. wypełnianie ekranu kolorem) przeładowuje ok. 0.2 sek.
  • Level 14  
    Procek działa na 72MHz:
    Code: c
    Log in, to see the code


    Moja inicjacja SPI:
    Code: c
    Log in, to see the code

    Jak widać:
    spi_set_baudrate_prescaler(SPI2, SPI_CR1_BR_FPCLK_DIV_2);
    Czyli SPI działa z szybkością 36MHz !!!

    Dołączam film oraz kod demonstrujący wypełnienie ekranu:
    Code: c
    Log in, to see the code




    PS.
    Jak widać w bibliotece libopencm3 są przejrzyste i od razu wiadomo co mają zrobić.

    Pozdrawiam
  • Level 27  
    No to podobnie prędko jak u mnie, tylko ja mam procesor taktowany 64MHz - bo jest kwarc 4MHz a max. wartość mnożnika petli PLL to 16. Dałem taki kwarc ze względu na pobór mocy (zasilanie bateryjne). Procesor wchodzi na 64MHz tylko w trakcie transmisji do wyświetlacza i obliczeń pewnych wartości do wyświetlenia, poza tym czasem wyłączam PLL i pozostaje taktowanie 4MHz. Procesor pobiera wtedy ok. 3.5mA, przy 8MHz pobiera ponad 6. Ponieważ nie używam zadnych bibliotek, u mnie inicjalizacja wygląda bardzo prosto:

    Code: c
    Log in, to see the code


    np. baud rate nie ustawiam, bo domyślnie po resecie ma wartość 000, czyli fPCLK/2.

    No i oczywiście odpowiednia inicjalizacja portów, oraz PWM dla podświetlenia (na TIM1). Możesz wszystkie linie w Twojej inicjalizacji, po konfiguracji GPIO, zastąpić tymi dwoma linijkami i będzie to samo.

    Dodano po 11 [minuty]:

    Przesadziłem z tym 0.2sek - po pomiarach wychodzi mi ok. 0.08sek.
  • Level 14  
    dziechu wrote:

    np. baud rate nie ustawiam, bo domyślnie po resecie ma wartość 000, czyli fPCLK/2.

    U mnie też tak było do czasu aż skomplikowałem moją "pajęczynę" wtedy wyświetlacz miał tendencję do "zawieszenia się". prawdopodobnie to była za duża częstotliwość żeby sobie tak kabelkami 20cm "latać". Wystarczyło że częstotliwość zmniejszyłem i od razu ruszyło.

    Przy okazji zamieszczam procedury obsługi I2C. Wiem że niektórzy mają problem z uruchomieniem sprawnie działającego I2C. Mi też to sporo zajęło ale w sieci znalazłem "gotowca".
    Przerobiłem go tak że procek nie zawiesza się w oczekiwaniu na odpowiedź układu I2C.
    Sprawdziłem i procedury działają z pamięcią EEPROM oraz z cyfrowym kompasem HMC5883L.
    i2c.h:
    Code: c
    Log in, to see the code
    i2c.c:
    Code: c
    Log in, to see the code

    Przykładowe użycie (wycięte z mojego kodu):
    Code: c
    Log in, to see the code

    Na szelki wypadek zamieszczam też pliki.

    Pozdrawiam
    Tomek