Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[stm32f107][C] - Adaptacja bibliotek obsługi wyświetlacza Keil

mwtyczek 25 Sty 2015 16:05 558 7
  • #1 25 Sty 2015 16:05
    mwtyczek
    Poziom 9  

    Witam:)
    Na wstępie zaznaczę, że nie mam zbytniego doświadczenia we wpisywaniu wartości hex do rejestrów, jednak cały czas próbuję to pojąć, tak by nie łapać się więcej na takich parterach :)
    Biblioteka napisana do obsługi 4 bitowego wyświetlacza na płytce MCBSTM32.
    Chciałbym zaadaptować ją do obsługi identycznego, który mam podłączony do swojej ZL29ARM. Różnica polega zmianie deklaracji portu i numeru pinów do obsługi wyświetlacza.

    W oryginale:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Na mojej płytce listing pinów wygląda następująco:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    src:
    [stm32f107][C] - Adaptacja bibliotek obsługi wyświetlacza Keil

    W kodzie zamieniłem wszystkie odniesienia do GPIOC na GPIOE oraz definicje pinów. Zmieniłem również zegar, by uruchamiał tenże port. Problemem jest to, że nie miem wpisać do rejestrów CRL oraz CRH portu E odpowiednich wartości, tak by ustawić je na wyjścia, ponieważ w przypadku wejść ustawia się OK (wg mnie).
    Umiem przeliczać hex->bin, jednak mam problem z ustawianiem bitów.
    Wiem, że to piaskownica, jednak męczę się z tym już chwilę, a forum podobno jest po to by pytać, więc proszę o pomoc :)
    Dołączam zmodyfikowaną przeze mnie część kodu, oryginalne pliki biblioteki, zrzuty z mojego datasheet. Pozdrawiam :)

    Mój kod:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Pin conf/mode:
    [stm32f107][C] - Adaptacja bibliotek obsługi wyświetlacza Keil

    CRH:
    [stm32f107][C] - Adaptacja bibliotek obsługi wyświetlacza Keil





    CRL:
    [stm32f107][C] - Adaptacja bibliotek obsługi wyświetlacza Keil

    ODR:
    [stm32f107][C] - Adaptacja bibliotek obsługi wyświetlacza Keil

    IDR:
    [stm32f107][C] - Adaptacja bibliotek obsługi wyświetlacza Keil

    Może bardziej czytelna mapa:
    [stm32f107][C] - Adaptacja bibliotek obsługi wyświetlacza Keil

    0 7
  • #2 25 Sty 2015 17:26
    el2010tmp
    Poziom 25  

    mwtyczek napisał:
    nie mam zbytniego doświadczenia we wpisywaniu wartości hex do rejestrów

    Każdy istotny bit ma swoją nazwę a użycie kodów szesnastkowych sprawia że nikomu się nie chce tego czytać :)
    Np. zamiast:
    RCC->APB2ENR |= (1 << 6)
    można wpisać:
    RCC->APB2ENR |= RCC_APB2ENR_IOPEEN

    To jest na pewno źle:
    mwtyczek napisał:
    /* Setting all pins to output mode */
    #define LCD_ALL_DIR_OUT GPIOE->CRL = (GPIOE->CRL & 0xFFFF0000) | 0x00003333; \
    GPIOE->CRH = (GPIOE->CRH & 0xFFF000FF) | 0x00033300;

    dalej mi się nie chce.
    Podstaw właściwe "magiczne hexy" (RM opis rej. CRL,CRH) albo skorzystaj z symboli.
    Patrz plik stm32f10x_lib.h lub stm32f10x.h

    0
  • #3 25 Sty 2015 18:25
    mwtyczek
    Poziom 9  

    @el2010tmp Dokładnie o to właściwe podstawienie mi się tu rozchodzi... nie potrafię tego rozgryźć na tym etapie (co wpisać).

    0
  • #4 25 Sty 2015 19:58
    tadzik85
    Poziom 38  

    mwtyczek napisał:
    @el2010tmp Dokładnie o to właściwe podstawienie mi się tu rozchodzi... nie potrafię tego rozgryźć na tym etapie (co wpisać)


    Reguła jest prosta:

    Makro składa się z 3 części oddzielonych podkreśleniem.
    1: nazwa układu peryferyjnego
    2. nazwa rejestru
    3. nazwa bitu

    Makra, które stworzyłeś mają sens, może na AVRku, Na STM są totalnie nieoptymalne.

    0
  • #5 25 Sty 2015 20:52
    mwtyczek
    Poziom 9  

    Ja próbuję tylko przerobić biblioteki od Keila, nie tworzyłem tych makr. Powtórzę w czym leży problem - ustawienie odpowiednich pinów na wyjścia/wejścia przez wpisanie wartości do rejestrów - tego nie potrafię póki co uczynić. Co do makr w stmf10x.h to fakt są z odniesieniami na interesujące mnie bity, jednak nie wiem za bardzo jak ich użyć (czyt. za pomocą jakich komend wpisać do nich wartości, które mnie interesują)

    0
  • Pomocny post
    #6 26 Sty 2015 16:55
    el2010tmp
    Poziom 25  

    mwtyczek napisał:
    #define LCD_DATA_DIR_IN GPIOC->CRL = (GPIOC->CRL & 0xFFFF0000) | 0x00004444;

    (GPIOC->CRL & 0xFFFF0000)
    Liczba hex 0 binarnie 0000 łącznie z operatorem & - iloczyn binarny, kasuje bity odpowiedzialne za konfiguracje danych pinów:
    0 & 0 = 0
    1 & 0 = 0

    W trym przypadku PC0, PC1, PC2 i PC3.
    Liczna hex F binarnie 1111 łącznie z operatorem & - iloczyn binarny pozostawia bity bez zmian:
    0 & 1 = 0
    1 & 1 = 1

    W tym przypadku PC4, PC5, PC6, PC7

    | 0x00004444
    Liczba hex 4 binarnie 0100 łącznie z operatorem | - suma binarna, ustawia stosowne bity.
    Zgodnie z tabelką z DS którą zamieściłeś daje to CNF 01 MODE 00 dla PC0, PC1, PC2 i PC3 czyli tryb Floating input.

    Liczba hex 3 binarnie 0011 ustawia CNF 00 MODE 11 czyli General purpose output push-pull, Output mode, max speed 50 MHz.

    Twoim zadaniem jest powstawianie odpowiednich liczb ( F, 0, 3, 4) w porcie GPIOE->CRH i GPIOE->CRL zgodnie z Twoim połączeniem lub skorzystanie z nazw symbolicznych.
    Np. dla PE4
    input floating:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    output push-pull 50MHz:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #7 26 Sty 2015 17:10
    mwtyczek
    Poziom 9  

    @el2010tmp Pierwszą część Twojej wypowiedzi zdążyłem ogarnąć własnymi siłami, ogólnie problem już rozwiązany. Nie chwaliłem się tym jednak tutaj :P
    Co do drugiej części, o takie wyjaśnienie mi chodziło :) Dzięki wielkie za wszystkie odpowiedzi , temat uważam za zamknięty :)

    PS. uje, się nie kreskóje. Pozdrawiam :)

    0
  • #8 26 Sty 2015 17:18
    el2010tmp
    Poziom 25  

    mwtyczek napisał:
    PS. uje, się nie kreskóje. Pozdrawiam :)

    :D
    Już poprawiam :D

    0