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.

[STM32] Wyjście timera na dowolnym pinie

Myrek1 31 Sie 2018 22:13 336 9
  • #1 31 Sie 2018 22:13
    Myrek1
    Poziom 23  

    uC to stm32f207. Timer napędza pwm jedno z wyjść (zmienne pwm z preloadingiem co jakiś okres). Wszystko działa ładnie na zmapowanym pinie dla wyjścia OC tego timera (tim 10). Jednak czasem potrzebuję wygenerować identyczny przebieg na pinie tego timera oraz na innym pinie GPIO, akurat tego z tim1.
    Jednym z rozwiązań jest załadowanie danymi w tym samym czasie obu timerów, jednak nie działa to dobrze, brak pełnej synchronizacji i nie generaują tego samego przebiegu (lekko przesunięty tak, że z czasem ilośc impulsów się nie zgadza). Innym jest odczyt z końcówki tim10 i zapis stanu do końcówki od tim1, ale przy sygnale 500khz za często trzeba to robić, podobnie z przerwaniem, też za często by wyskakiwało. Innym rozwiązaniem jest połączenie tim10 jako master, tim 1 jako slave, ale akurat te nie mają ze sobą połączenia w krzemie. Powiecie, że można wybrać inny timer, niestety nie bo oba muszą być na magistrali 120MHz, a żaden na niej nie ma ze sobą połączenia (poza 1 i 8 ale 8 nie mogę użyć).
    Myślałem o DMA, jak timer generujący wywoła transfer DMA, on zapisze bit na GPIO, ale DMA nie może operować na 1 bicie, tylko na co najmniej połowie portu, co nie wchodzi w grę.

    Co w takim wypadku można zrobić?

    0 9
  • #2 31 Sie 2018 22:46
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Myrek1 napisał:
    Myślałem o DMA, jak timer generujący wywoła transfer DMA, on zapisze bit na GPIO, ale DMA nie może operować na 1 bicie, tylko na co najmniej połowie portu, co nie wchodzi w grę.

    Jest bit-banding - wtedy operujesz na 32-bitowej wartości reprezentującej jeden bit w rejestrze - np. jako źródło GPIOx->IDR, a jako cel - GPIOx->ODR.

    0
  • #3 31 Sie 2018 23:03
    BlueDraco
    Specjalista - Mikrokontrolery

    Oczywiście, że można to zrobić przez DMA - zapis do BSRR/BRR. Było ze dwa lata temu w EP.

    0
  • #4 31 Sie 2018 23:18
    Myrek1
    Poziom 23  

    Czy DMA nie ma czasem dostępu do BB?

    Ok, ale teraz widzę, że tim9 nie może wywołać transferu DMA, więc jak sygnalizować potrzebę przesłania stanu linii (gdy się zmieni)? Chyba ogólnie w DMA M2M nie ma możliwości wyzwolenia przez peryferia, więc jak wykożystać taki transfer do ciągłego aktualizowania jednej linii na podstawie drugiej?

    0
  • #5 02 Wrz 2018 14:35
    BlueDraco
    Specjalista - Mikrokontrolery

    Po co BB, jeśli masz BSRR i BRR? Dowolne żądanie DMA może wyzwolić dowolny transfer nie związany z peryferialem zgłaszającym żądanie. DMA musi w tym przypadku pracować w trybie M2P albo P2M. Transfer M2M pcha od razu cały blok.

    0
  • #6 02 Wrz 2018 21:01
    Myrek1
    Poziom 23  

    BlueDraco napisał:
    Po co BB, jeśli masz BSRR i BRR? Dowolne żądanie DMA może wyzwolić dowolny transfer nie związany z peryferialem zgłaszającym żądanie. DMA musi w tym przypadku pracować w trybie M2P albo P2M. Transfer M2M pcha od razu cały blok.


    Ok, to możesz rozwinąć myśl, bo czegoś nie rozumiem. Załóżmy po prostu, że zmienia mi się pin i chcę to zmianę sklonować na inną linię, dowolnego portu przez DMA. Jak wyzwolić DMA dokładnie w momencie zmiany pinu, tak, żeby sygnał na liniach był identyczny? Nie mogę sobie wyobrazić wyzwolenia DMA tak, żeby w odpowiednim momencie zrobił transfer.
    Jeśli zakładając, że klonujemy linie timera 9 w trybie PWM to w teorii można timerem zgłaszać transfer, tyle że ten timer nie może generować takiego transferu.

    0
  • #7 02 Wrz 2018 21:42
    Freddie Chopin
    Specjalista - Mikrokontrolery

    BlueDraco napisał:
    Po co BB, jeśli masz BSRR i BRR?

    A ile kosztuje używanie bit-bandingu?

    0
  • #8 03 Wrz 2018 09:11
    BlueDraco
    Specjalista - Mikrokontrolery

    Myrek1: DMA wyzwalasz timerem, nie zmianą stanu portu. W dotychczasowych STM32 jedynym sposobem na wyzwolenie DMA przez port jest użycie na tej linii trybu capture timera - i wtedy oczywiście DMA wykona się w kilka cykli zegarowych po zmianie stanu linii. Na 80 MHz STM32L4 jest to czas ok. 140 ns. W przypadku wyzwolenia DMA przez timer w trybie compare/PWM będzie trochę szybciej, ale też będzie tu opóźnienie wnoszone przez DMA. żaden układ cyfrowy nie działa w zerowym czasie, a tu masz do czynienia z automatem synchronicznym, który potrzebuje kilku cykli zegara na przeprowadzenie zadanej akcji. W dodatku liczba cykli zegara nie musi być zawsze ta sama.

    Freddie:
    Na pewno nie mniej niż BSRR/BRR, a zapewne więcej, bo operacja BB wykonywana jest nie w porcie, a w interfejsie szyny - już była kiedyś o tym dyskusja.

    Można się też przyjrzeć dwóm innym aspektom:
    Czy BB jest dostępny dla DMA (nie pamiętam, być może nie, jeśli operacje wykonuje interfejs szyny w CPU a nie na drugim końcu matrycy)?
    Czy BB przez DMA nie spowoduje konfliktu z BB przez CPU? (raczej nie)

    0
  • #9 03 Wrz 2018 10:27
    Myrek1
    Poziom 23  

    BlueDraco napisał:
    Myrek1: DMA wyzwalasz timerem, nie zmianą stanu portu


    Tim9 nie ma możliwości wyzwalania, o czym już pisałem 2 razy, więc nic z tego (uprzedzam, że zmiana timera nie wchodzi w grę z różnych przyczyn).

    A jeśli chodzi o DMA, to tak jak pisałem chyba nie ma dostępu do BB.

    0
  • #10 03 Wrz 2018 21:07
    adamusx
    Poziom 27  

    Witam,

    Może w tym przypadku lepiej rozwiązać temat "sprzętowo" dokładając do wyjścia PWM bramkę logiczną AND. Na drugie wejście tej bramki dowolne wyjście z procesora aktywujące wyjście bramki - wówczas synchronizacja zapewniona w 100% (pomijając opóźnienia na samej bramce ;)

    0
  Szukaj w 5mln produktów