logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Mapowanie rejestrów GPIO w STM32 za pomocą struktur i unii - jak to działa?

toch88 28 Sty 2017 23:17 1473 12
REKLAMA
  • #1 16236088
    toch88
    Poziom 11  
    Posty: 74
    Pomógł: 1
    Cześć jakiś czas temu spotkałem się z takim zapisem mapowania rejestrów:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Potem można go używać tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    lub klasycznie
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    czy tak stosowane pola bitowe są zbrodnią przeciwko informatyce i programowaniu ;)?
    Dla mnie jedyną korzyścią jaką widzę tutaj to np że nie musiałbym patrzeć co chwile do manuala co od jakiego bitu się zaczyna, ale równie dobrze można by zdefiniować sobie makra z offsetami poszczególnych bitów w rejestrze i korzystać klasycznie z przesunięcia bitowego. Do tego dochodzi jeszcze jeden mankament:
    Cytat:
    C gives no guarantee of the ordering of fields within machine words
    , więc może być problem z portowaniem.

    Nie mam zamiaru "wynajdywać koła na nowo" tak pytam się z ciekawości o wasze opinie.

    Ewentualnie tak myślę że dałoby rade to zrobić też w C++ z template w taki sposób żeby np nie pisać 16 razy MODER, ale musiałbym to przemyśleć. W sumie nie wiem czy miałoby to sens.

    znalazłem:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 16236192
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #3 16236414
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Jakąś tam wygodę to niby daje, ale chyba nie warto pisać od nowa całego wielkiego pliku nagłówkowego. Większa wygody byłaby, gdyby w C istniały wektory pól bitowych. niestety nie istnieją.

    toch88 napisał:
    Potem można go używać tak:
    GPIOA->MODER.bit.MODER0=0x2;


    Zawsze mnie fascynowało, dlaczego wielu programistów uważa, że jak się wpisuje wartość do rejestru uC, to musi ona być koniecznie szesnastkowa. Nie można napisać 1 ani 2, musi być koniecznie 0x1, 0x2, bo wiadomo, że mikrokontroler to tylko szesnastkowe stałe łyka, a dziesiętne odrzuca. Są nawet tacy, co do timera wpisują 0x64, a nie 100. ;)
  • REKLAMA
  • Pomocny post
    #4 16236471
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2203
    @toch88 Nie ma powodów, aby nie stosować takiego zapisu. Np. Atmel w swoich nagłówkach dla ARM daje możeliwość korzystania z pól bitowych, lub składania wartości z masek i przesunięć. Przy czym jeśli korzystasz z pól to wygodnie jest użyć compund literals:
    http://mikrokontrolery.blogspot.com/2011/04/J...aly-zlozone-compound-literals-w-praktyce.html
    Ponieważ posługujesz się konkretnym kompilatorem, więc ułożenie pól bitowych jest zawsze takie samo, więc nie ma problemu, że kompilator coś zmieni.
    @BlueDraco Zapis 0x1 istotnie jest dziwny. Jednak 0x01 już nie. Ja stosuję taki zapis z prostego powodu - liczba 8-bitowa zawsze zajmuje 4 znaki, 16-bitowa 6 itd. Dzięki temu raz, że kod się wyrównuje, jeśli są takie same operacje, a dwa, że od razu widać błąd - np. omyłkowe pominięcie cyfry lub jej dodanie.
  • #5 16236480
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    tmf napisał:
    Zapis 0x1 istotnie jest dziwny. Jednak 0x01 już nie.


    Dla pola bitowego o szerokości 1..3 bitów każdy jest równie dziwny. ;)
  • #6 16236503
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2203
    Kwestia up;odobań. Dlaczego 0x03 jest wg ciebie dziwny, a 3 już nie? Jedyne o czym warto pamiętać, to, żeby nie mieszać zapisów, bo wtedy robi się bałagan i łatwo o pomyłkę, chociaż dla pól do 3 bitów zapis jest taki sam.
  • REKLAMA
  • #7 16236504
    toch88
    Poziom 11  
    Posty: 74
    Pomógł: 1
    He he racja nie zauważyłem tego :)
    Swoją drogą trochę szkoda że np strukturze nie da rady w jakiś sposób zdefiniować tablicy.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    w taki sposób aby móc korzystać z

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #8 16236568
    Konto nie istnieje
    Konto nie istnieje  
  • #9 16236582
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2203
    toch88 napisał:
    He he racja nie zauważyłem tego :)
    Swoją drogą trochę szkoda że np strukturze nie da rady w jakiś sposób zdefiniować tablicy.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    w taki sposób aby móc korzystać z

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Oczywiście tablicę da się zdefiniować w strukturze. To o co ci chodzi to zapewne tablica bitów? To można zrobić przez strukturę w strukturze.
    Zobacz jak zrobił to Atmel dla swojej rodziny ARMów, masz tam wszelkie możliwe wariacje dostępu do rejestrów.
  • #10 16236592
    toch88
    Poziom 11  
    Posty: 74
    Pomógł: 1
    Tutaj nie chodzi o to czy coś jest użyteczne czy nie, lecz o zaspokojenie ciekawości.
    Poza tym dzisiaj się dowiedziałem od Freddiego że jest jakaś nowa wersja CMSIS która ma taki postfix _pos,
    Freddie Choppin napisał:


    Note that for the headers that follow CMSIS standard, you don't need to know where each field starts, as the headers provide individual defines for each bit. So if you need to set bits of the MODER9 field, there will be a defines like GPIO_MODER_MODER9_0 and GPIO_MODER_MODER9_1. This standard is followed for all registers. Moreover new versions of the headers provide ..._Pos macros with the bit position of the fields - for example GPIO_MODER_MODER9_Pos from STM32F0 headers.


    i tak zostanę póki co przy starym zapisie, bo nie ma sensu budować takiej biblioteki, ale to co opisał @tmf (Compound literals)będzie całkiem pomocne
  • Pomocny post
    #11 16236595
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    BTW - jakbyś chciał faktycznie robić takie pliki, to nie ma sensu ich dziargać ręcznie. Jedyna sensowna opcja to skorzystanie z plików SVD które są dostępne od ARM. Na szybko znalazłem je na giithubie ( https://github.com/posborne/cmsis-svd ), ale oficjalna paczka jest do pobrania też ze strony ARM.
  • #12 16237117
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    To Freddie jeszcze nie napisał, że w C++ można sprytnie zdefiniować dostęp równoważny w zapisie tablicy pól bitowych? No, zawiedziony jestem okrutnie... ;)

    Wystarczy zrobić klasę dla rejestru i przeciążyć operator indeksowania.
  • #13 16237512
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    BlueDraco napisał:
    To Freddie jeszcze nie napisał, że w C++ można sprytnie zdefiniować dostęp równoważny w zapisie tablicy pól bitowych? No, zawiedziony jestem okrutnie... ;)

    Wystarczy zrobić klasę dla rejestru i przeciążyć operator indeksowania.

    Freddie po prostu umie czytać ze zrozumieniem i zauważył, że autor tematu sam wspomniał o takiej możliwości w pierwszym swoim poście. Nie wiem więc czemu oczekujesz, że Freddie będzie powtarzał rzeczy które dla kogoś są z pewnością oczywiste.

Podsumowanie tematu

✨ W dyskusji poruszono temat mapowania rejestrów GPIO w mikrokontrolerach STM32 przy użyciu struktur i unii w języku C. Uczestnicy wymienili się doświadczeniami na temat wygody korzystania z pól bitowych oraz ich implementacji w kodzie. Zauważono, że chociaż takie podejście może być użyteczne, to pisanie dużych plików nagłówkowych dla różnych rodzin procesorów może być pracochłonne i podatne na błędy. Wskazano na możliwość użycia plików SVD od ARM jako lepszej alternatywy do generowania definicji rejestrów. Dyskutowano również o konwencjach zapisu wartości rejestrów, podkreślając, że użycie zapisu szesnastkowego nie jest konieczne. Uczestnicy podzielili się również pomysłami na implementację tablic bitowych w strukturach oraz na wykorzystanie literali złożonych w C.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA