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

[STM32][C] - Poradnik dla początkujących (bez bibliotek)

szczywronek 15 Lis 2015 18:53 57666 134
  • #31
    tadzik85
    Poziom 38  
    Dlatego ja z dystansem podchodzę do tego co ST pisze.

    Widzisz nie jesteś 1 tu na forum, który miał problem bez opóźnienia po włączenia zegara. Przejrzałem na szybko erraty i dokumentacje i jestem wielce zdziwiony dlaczego dla F4 taka wzmianka jest a dla F1 nie ma. Ja daję zawsze dla świętego spokoju, zwykle jest to rozbiegówka więc nie ma sensu martwić się optymalnością czy coś.

    Jak wspomniałem skieruje właściwe pytanie do ST, co wyniknie zobaczymy.

    No właśnie snippetsy nie zawierają tak poważnych rzeczy.
    Ale jak mówię bez opóźnień po włączeniu zegara wszystko chodzi w 99% przypadkach. Jeśli jest z tym problem zwykle daje się zdebugować.

    Skoro mowa o takich rzeczach. Zwróćcie uwagę na jakiś rejestr SR gdzie flagi kasuje się zerem. A chcesz skasować tylko jedną, co ST czyni nadmiernie w swoich przykładach. Są pola reserved (czyli nie spisuj nic innego niż tam jest) A jednak takie kasowanie wpisuje tam 1.
  • PCBway
  • #32
    BlueDraco
    Specjalista - Mikrokontrolery
    Wzmianka o dwóch cyklach zegara opóźnienia jest, ale tak, jak napisałem, nie ma to nic wspólnego z DMB. Kilka wpisów powyżej te nie traktuje o potrzebie synchronizacji przez DMB, a tylko o opóźnieniach pomiędzy czymś i czymś innym. Dla takich opóźnień DMB działa zaledwie jak taki trochę wolniejszy NOP, ale DMB sam z siebie nie gwarantuje właściwego opóźnienia.

    A ja robię to bardzo prosto: w trzech kolejnych instrukcjach w języku C włączam zegary wszystkich peryferiali na AHB, APB1 i APB2. Następnie inicjuję GPIO. W ten sposób włączenie zegarów na APBx daje (znacznie nadmiarowy) odstęp czasowy dla GPIO, a programowanie portów - dla operacji na peryferialach z APB1. Jak widać nie ma tu potrzeby jakichkolwiek jawnych opóźnień, ani tym bardziej użycia DMB, które opóźnieniem w zasadzie nie jest (ok, no troszkę jest).
  • PCBway
  • #33
    tadzik85
    Poziom 38  
    BlueDraco napisał:
    Wzmianka o dwóch cyklach zegara opóźnienia jest, ale tak, jak napisałem, nie ma to nic wspólnego z DMB. Kilka wpisów powyżej te nie traktuje o potrzebie synchronizacji przez DMB, a tylko o opóźnieniach pomiędzy czymś i czymś innym. Dla takich opóźnień DMB działa zaledwie jak taki trochę wolniejszy NOP, ale DMB sam z siebie nie gwarantuje właściwego opóźnienia.

    A ja robię to bardzo prosto: w trzech kolejnych instrukcjach w języku C włączam zegary wszystkich peryferiali na AHB, APB1 i APB2. Następnie inicjuję GPIO. W ten sposób włączenie zegarów na APBx daje (znacznie nadmiarowy) odstęp czasowy dla GPIO, a programowanie portów - dla operacji na peryferialach z APB1. Jak widać nie ma tu potrzeby jakichkolwiek jawnych opóźnień, ani tym bardziej użycia DMB, które opóźnieniem w zasadzie nie jest (ok, no troszkę jest).


    Rozwiązanie stosowane zapewne przez wielu. Lecz czy NOPowi warto ufać? Raczej nie. Myślę, że jeśli już to konieczne lepiej wstawić to DMB niż nopy. A uparciuch sprawdziłby czy oby jest w rejestrze to co zapisał.
  • #34
    BlueDraco
    Specjalista - Mikrokontrolery
    Jeśli napisano, że wymagane jest opóźnienie np. 2 cykli zagara APB, to trzeba wykonać np. jedną operację na APB albo 2 na AHB, a nie instrukcję DMB, która działa z częstotliwością rdzenia i ew. czeka na zakończenie bieżącej, jednej operacji AHB/APB (albo i nie czeka - do sprawdzenia).

    No i czemu DMB ma być bardziej godne zaufania niż NOP? Ani jedna, ani druga instrukcja nie ma gwarantowanego minimalnego czasu wykonania. Za to każda operacja na AHB/APB musi zająć min. jeden cykl odpowiedniej szyny.

    Cytat z Errata:
    "Workarounds
    1. Enable the peripheral clock some time before the peripheral read/write register is
    required.
    2. For AHB peripheral, insert two dummy read operations to the peripheral register.
    3. For APB peripheral, insert a dummy read
    operations to the peripheral register"

    Jest tu coś o DMB?

    To, czego najbardziej nie lubię w projektowaniu (sprzętu i oprogramowania) - to magia. Np. wiara w magiczne działanie DMB. ;)
  • #35
    tadzik85
    Poziom 38  
    Cytat:
    Workarounds
    1. Use the DSB instruction to stall the Cortex-M4 CPU pipeline until the instruction is completed.
    2. Insert “n” NOPs between the RCC enable bit write and the peripheral register writes (n = 2 for AHB peripherals, n = 1 + AHB/APB prescaler in case of APB peripherals).


    Coś jeszcze?
  • #36
    BlueDraco
    Specjalista - Mikrokontrolery
    Jeszcze tylko pytanie: po co mam wykonywać DSB i NOPy, jeśli mam w tym czasie do zrobienia coś, co i tak muszę zrobić, a co nie zależy od poprzedniej instrukcji, której efekt działania wystąpi po kilku cyklach? Przecież to kompletnie nie ma sensu.

    Podobnie na inicjowanie portów można wykorzystać np. czas potrzebny na uruchomienie oscylatora albo ustabilizowanie PLL - nie ma obowiązku odczekiwania w pustej pętli na ustawienie odpowiedniego bitu, bo portom wszystko jedno, czy PLL już "załapała", skoro póki co działamy na zegarze IRC.

    Naprawdę trudno jest wskazać przykład realnego zastosowania, w którym niezbędne byłoby "puste" oczekiwanie na zadziałanie zapisanego do rejestru ustawienia. Ten czas zawsze można wykorzystać na coś pożytecznego.
  • #37
    tadzik85
    Poziom 38  
    BlueDraco napisał:
    Jeszcze tylko pytanie: po co mam wykonywać DSB i NOPy, jeśli mam w tym czasie do zrobienia coś, co i tak muszę zrobić, a co nie zależy od poprzedniej instrukcji, której efekt działania wystąpi po kilku cyklach? Przecież to kompletnie nie ma sensu.

    Podobnie na inicjowanie portów można wykorzystać np. czas potrzebny na uruchomienie oscylatora albo ustabilizowanie PLL - nie ma obowiązku odczekiwania w pustej pętli na ustawienie odpowiedniego bitu, bo portom wszystko jedno, czy PLL już "załapała", skoro póki co działamy na zegarze IRC.

    Naprawdę trudno jest wskazać przykład realnego zastosowania, w którym niezbędne byłoby "puste" oczekiwanie na zadziałanie zapisanego do rejestru ustawienia. Ten czas zawsze można wykorzystać na coś pożytecznego.


    Po primo obejścia są 2 różne a nie jedno. I zdecyduj się chłopie we własnych zeznaniach. Najpierw piszesz to tego problemu nie da się barierą rozwiązać, potem ze w ogóle po co? Ktoś tu chyba o magii wspomniał.

    A tu proszę czarno na białym.
  • #38
    BlueDraco
    Specjalista - Mikrokontrolery
    Piszę tylko, że jeśli da się to zrobić na DSB i NOP, to równie dobrze da się to zrobić na samych NOP (bez bariery), a w obu przypadkach wcześniej trzeba przyjąć zgodnie ze zdrowym rozsądkiem a wbrew formalnej definicji architektury ARM, że minimalny czas wykonania NOP jest określony i wynosi x cykli zegara (np. x = 1).
    Oba rozwiązania moim zdaniem w praktyce są zbędne, bo zamiast czekać na pusto można w tym samym czasie robić coś pożytecznego, ergo czekać specjalnie nic nie robiąc nie trzeba wcale.
  • #39
    tadzik85
    Poziom 38  
    BlueDraco napisał:
    Piszę tylko, że jeśli da się to zrobić na DSB i NOP, to równie dobrze da się to zrobić na samych NOP (bez bariery), a w obu przypadkach wcześniej trzeba przyjąć zgodnie ze zdrowym rozsądkiem a wbrew formalnej definicji architektury ARM, że minimalny czas wykonania NOP jest określony i wynosi x cykli zegara (np. x = 1).
    Oba rozwiązania moim zdaniem w praktyce są zbędne, bo zamiast czekać na pusto można w tym samym czasie robić coś pożytecznego, ergo czekać specjalnie nic nie robiąc nie trzeba wcale.


    A ja wole DSB() bo zamiast liczyć nopki , gdzie 1 może nie zająć czasu...., a ich ilość będzie zależna od preskalerów szyn......

    A to, że w tym czasie można co innego porobić to inny temat i żaden argument.
  • #40
    szczywronek
    Poziom 27  
    Ogłoszenia!
    Uwzględniając uwagi Czytelników z wątku "wywiadowego" (Darmowy poradnik STM32 dla początkujących - rozmowa z autorem.) oraz inne obserwacje itd... ogłaszam co następuje:

    1. Z przyczyn technicznych załączniki zostały przeniesione do czwartego posta w temacie.
    2. Wersjonowanie Poradnika zostało delikatnie zmienione. Dotychczas dostępny pdf (z 06.11.2015r., oznaczony jako wersja 1) otrzymał nowe oznaczenie 1.0.
    3. Zmianie ulega forma erraty. Poprawki będą wprowadzane bezpośrednio w Poradniku oraz równolegle wypunktowywane w erracie.
    4. Errata dołączona zostaje do Poradnika. Możliwe jest również pobranie jej bez prowizji (osobny plik).
    5. Poradnik w wersji 1.0, po wprowadzeniu wszystkich zmian które były ujęte dotychczas w erracie (plik errata v1_2) otrzymuje oznaczenie 1.1.
    6. Poradnik w wersji 1.1, po dodaniu najnowszych zmian (patrz plik errata v1_2a) otrzymuje numerek 1.2 (jest świeży i jeszcze ciepły).
    7. Poradnik w wersji 1.1 nie był publikowany. Ta "wirtualna" wersja została wprowadzona jedynie dla zachowania porządku, aby wyróżnić najnowsze wpisy w erracie.
    8. Mam nadzieję, że teraz będzie wygodniej :]

    Podsumowując zmiany: Poradnik będzie poprawiany na bieżąco. Kto nie chce pobierać "odświeżonej" całości, może pobrać (bez prowizji) samą erratę uwzględniającą wszystkie zmiany od pierwszej publikacji.

    ------

    tadzik85 napisał:
    Zwróćcie uwagę na jakiś rejestr SR gdzie flagi kasuje się zerem. A chcesz skasować tylko jedną, co ST czyni nadmiernie w swoich przykładach. Są pola reserved (czyli nie spisuj nic innego niż tam jest) A jednak takie kasowanie wpisuje tam 1.
    Też na to zwróciłem uwagę. Tak z ciekawości - zapis do bitów Reserved przysporzył kiedyś komuś problemów? Chodzi mi po głowie, że ktoś pisał na forum że nadział się na jakiś "nieudokumentowany ficzer", ale nie mogę znaleźć nic konkretnego.

    Odnośnie zegarów i barier: w poradniku zostawiam na razie bez zmian - czyli z dsb przy F4 jak w erracie. Przykłady są przez to bardziej "edukacyjne" jeśli chodzi o sam mikrokontroler i przypominają o istnieniu erraty. Przy najbliższym "update" poradnika dopiszę wyraźnie, że opóźnienie oparte na barierze można zrealizować na milion innych sposób, np. zmieniając kolejność instrukcji. No i ciekaw jestem co ST odpisze koledze tadzik85 :)
    Tak na dobrą sprawę to instrukcje barierowe zasługują na osobny rozdział. Lub przynajmniej dodatek opisujący przypadki kiedy mogą się przydać. Ale to chyba wykracza poza tytułowe "dla początkujących".

    Przy okazji - lektura dla chętnych i zainteresowanych tematem instrukcji barierowych: ARM Cortex-M Programming Guide to Memory Barrier Instructions.
  • Pomocny post
    #41
    Grzegorz__d
    Poziom 2  
    Troszkę się przyczepię do tego przypisu:
    "21 ARM to jednocześnie nazwa architektury rdzenia i firmy która go produkuje"

    Z tego co wiem to ARM raczej niczego nie produkuje a daje licencję na "IP" czyli po polsku na myśl techniczną ;) ?

    W razie co od razu odpowiadam: to nie zarzut a uwaga :).

    --
    Grzegorz...
  • #42
    tadzik85
    Poziom 38  
    szczywronek napisał:
    tadzik85 napisał:
    Zwróćcie uwagę na jakiś rejestr SR gdzie flagi kasuje się zerem. A chcesz skasować tylko jedną, co ST czyni nadmiernie w swoich przykładach. Są pola reserved (czyli nie spisuj nic innego niż tam jest) A jednak takie kasowanie wpisuje tam 1.
    Też na to zwróciłem uwagę. Tak z ciekawości - zapis do bitów Reserved przysporzył kiedyś komuś problemów? Chodzi mi po głowie, że ktoś pisał na forum że nadział się na jakiś "nieudokumentowany ficzer", ale nie mogę znaleźć nic konkretnego.

    Pewnie nikomu, ale na pewno możliwe przy spisaniu czegoś w reserved rejestru typu CR.
    Poza jednym przypadkiem gdy dokumentacja sama mówiła o takim wymaganym zapisie.
  • #44
    Grzegorz__d
    Poziom 2  
    W sumie poczytałem dalej i dość często w tekście używasz sformułowania np. "Rdzeń jest produkowany przez holding ARM", a powinno raczej paść iż jest przez nich projektowany i pewnie ciężko będzie to wszędzie poprawić. W sumie to niewielki błąd, ale akurat mi się jakoś rzuca w oczy :).

    Generalnie dotarłem do pierwszych ćwiczeń i podziwiam Twój upór i styl we wkładaniu wiedzy do głowy. No i te prośby (i groźby ;)), aby próbować rozwiązywać zadania samemu mi się bardzo podobają. W końcu ktoś każe czytać i myśleć, a nie CTRL-C i CTRL-V :) jak to mają dziś dość często w nawyku młodzi ludzie.

    --
    Pozdrawiam.
    Grzegorz...
  • #45
    szczywronek
    Poziom 27  
    Melduję po-weekendowy update załączników :)

    tadzik85 napisał:
    przy spisaniu czegoś w reserved rejestru typu CR. Poza jednym przypadkiem gdy dokumentacja sama mówiła o takim wymaganym zapisie.
    Poszukałem trochę i poddaję się :] Gdzie dokumentacja sugeruje zapis do zastrzeżonego pola?

    Jak, w ogóle, należy rozumieć oznaczenie bitów (w rejestrze) jako "read-only (r)"? W RMie jest opis, który za wiele nie wyjaśnia: "Software can only read these bits.". To "read only" to jest coś w stylu "nie wolno zapisywać do tego pola" czy raczej "zapisywanie do tego pola nie ma sensu"?

    @Grzegorz__d - informacje o wszelkich błędach oraz inne sugestie/pomysły/propozycje są bardzo mile widziane i pomocne! Przeszukałem cały dokument pod kątem hasła "arm" i w sumie poza tymi dwoma miejscami, które wskazałeś to nic podobnego nie znalazłem. Możliwe, że coś przeoczyłem :roll:
    Cieszę się, że się podoba. Nie ukrywam, że są rozdziały trochę mniej entuzjastyczne (np. RTC). Kłopot polega na tym, że jak już pozna się wszystkie "nowości", to wszystko sprowadza się do ustawienia kilku bitów na podstawie dokumentacji. I nie bardzo jest co opisywać ;)
  • Pomocny post
    #46
    tadzik85
    Poziom 38  
    STMF4 I2C_OAR1 bit 14
  • Pomocny post
    #47
    ramrusazer
    Poziom 13  
    W rozdziale 17.3 strona 293, pierwszy akapit

    "konfiguracja Odchylacza Częstotliwości (Spread Spectrum)"

    Lepiej by brzmiało, Konfiguracja rozmycia częstotliwości.

    Chodzi w tym wypadku o rozmycie widma zakłóceń tj. zmniejszenie energii "prążków" w widmie zakłóceń. Związane to jest badaniami EMI.
  • #49
    ramrusazer
    Poziom 13  
    Poradnik świetny, momentami troszkę na siłę te tłumaczenia ;). Ale jadę równo z tym koksem. Wcześniej byłem zatwardziałym LibStandardowcem. Hal mnie pokonał ostatnio. Sam robię kurs na STM32L152RE i RC, oraz będę robił podejście na STM32F746-disco z STemWin.

    Gratuluję chęci bo jest to kawał dobrej roboty.
  • #50
    szczywronek
    Poziom 27  
    Ponownie dziękuję :D I od razu ciągnę za język: "na siłę" - w sensie, że rozwlekam tłumaczenie czegoś prostego, czy "na siłę" staram się tłumaczyć coś o czym widać, że nie mam pojęcia? :lol:

    ramrusazer napisał:
    Sam robię kurs na STM32L152RE i RC
    Jakieś namiary?
  • #51
    ramrusazer
    Poziom 13  
    szczywronek napisał:
    Jakieś namiary?


    https://www.elektroda.pl/rtvforum/download.php?id=709826 ;)

    Tylko trzeba otworzyć oba datasheety, a czasem i nawet od 103 i sobie porównać.
    Ogólnie na StdLibsach miałem mniej więcej opanowane uart, spi. Tylko przez to, że STM przeszedł wyłącznie na HAL w nowych prockach tj. L4, F7 itd. Zmuszony zostałem do zainteresowania się HAL, niestety zdecydowanie mnie to przerosło. Z twoim poradnikiem zdecydowanie lepiej idzie, chcę sprawdzić, jak się zachowa STemWin na F7 i 429i, czy da się to ożenić z rejestrami bez HALa.
  • #53
    ramrusazer
    Poziom 13  
    Nie ma problemu, w sumie będę pewnie sukcesywnie testował na L072, F407, F334, no i F746. Bo spodobało mi się to podejście.
  • Pomocny post
    #54
    _Arecki_
    Poziom 15  
    @szczywronek, a masz erratę do erraty? ;)

    Oczywiście żartuję, ale zauważyłem, że w erracie masz przy poprawce nr 13:
    Cytat:
    rozdział 5.2,
    tabela 5.1,
    opis wyjątku Reset

    A w poradniku ten opis jest dla HardFault
  • #57
    slawek-matyl
    Poziom 11  
    Witam
    Moje słowa uznania dla autora poradnika. Chyba najobszerniejsze i to w języku polskim opracowanie na temat STM32 bez użycia SPL. Sam nie stosuję tych bibliotek a początki mojej przygody z STM32 rozpoczęły się od poradnika : http://en.radzio.dxp.pl/stm32vldiscovery/
    W sumie to chyba na nic więcej się nie natknąłem, być może słabo szukałem.
    P.S
    Przez przypadek nacisnęło mi się minus pod postem autora, bardzo przepraszam jestem całym sercem za propagowaniem darmowej nauki.
  • #58
    szczywronek
    Poziom 27  
    @bgolab - tylko szkoda, że SPL :(
    @slawek-matyl - dziękuję :) Obszerny i do tego się jeszcze rozrasta 8-)

    Dziwna rzecz się zadziała. Od ostatniego odświeżenia Poradnika (w niedzielę 29.11.2015, do wersji 1.4) nie pojawiły się żadne nowe doniesienia o napotkaniu farmazonów! To może świadczyć o tym, że udało się wyeliminować wszystkie błędy lub o tym, że nikt tego nie czyta. Przy czym, co do tego pierwszego, to jestem pewny że to nieprawda :lol: A na poważnie: nie miałem błędów do poprawiania, więc posiedziałem nad niedokończonymi rozdziałami. W efekcie rozdział 16 rozrósł się o trzy nowe podrozdziały:
    Spoiler:
    16.5. Kod w pamięci SRAM - po co? (F103 i F429)
    16.6. Funkcja w pamięci sram - jak? (F103 i F429)
    16.7. Cały program w pamięci sram - jak? (F103 i F429)

    oraz przybyły dwa całkiem nowe rozdziały:
    Spoiler:
    18. Hashing randomly encrypted CRC (“Contra facta non valent argumenta”)
    18.1. Wstęp z niespodzianką
    18.2. Nic nie dzieje się przypadkiem (F429)
    18.3. Suma kontrolna CRC32 (F103 i F429)
    18.4. Sprzętowe CRC8, CRC16 i dowolny wielomian (F103 i F429)

    19. Interfejs SPI (“Potius sero quam numquam”)
    19.1. Wstęp (F103 i F429)
    19.2. Master ŚPI (F103 i F429)
    19.3. Master i Slave w jednym SP(al)I domu (F103 i F429)
    19.4. Pół-puplex na dwa mikrokontrolery (F103 i F429)
    19.5. CRC w SPI (F103 i F429)

    Miłej lektury!
  • #59
    Boulious
    Poziom 7  
    Trochę pusty post, ale żeby zmotywować autora do dalszej pracy i podziękować za już włożoną, napiszę, że ja jestem w trakcie. Niestety przez najbliższy czas raczej nie napisze nic konstruktywnego, gdyż dopiero zaczynam moją przygodę z programowaniem jako takim i to od razu od ARMów (dokładnie zaczynam zabawę z STM32F4Discovery), oraz również nie mam w tej dziedzinie wykształcenia. Nie jestem również studentem ETI, bo mam wykształcenie w całkowicie innej branży technicznej słabo powiązaną z elektroniką.
    Miesiąc temu postanowiłem się przebranżowić.
    W związku z tym utknąłem na teście ze strony nr 8 :D
    Pozdrawiam
  • #60
    szczywronek
    Poziom 27  
    Czołem :) Wszelkie uwagi mile widziane, nie tylko "techniczno-merytoryczno-błędowe". Jeżeli uznasz, że pomimo starań nie dajesz sobie z czymś rady/coś jest niezrozumiale opisane, itp... - pisz śmiało.

    Powodzenia!