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

STM32F7Discovery - Kaskadowe łączenie TIM2 i TIM3

nauritius 30 Gru 2015 18:32 1332 7
REKLAMA
  • #1 15283340
    nauritius
    Poziom 9  
    Posty: 35
    Chcę, aby TIM2 i TIM3 pracowały w połączeniu kaskadowym. Ta konfiguracja działa, ale mam pewną wątpliwość dotyczącą pracy TIM2 (TIM2 taktuje TIM3). Z racji braku domowego oscyloskopu staram sobie pomóc diodą LED. Inicjalizacja diody realizowana jest przez inicjalizacją timerów. W inicjalizacji dioda jest zapalana. W procedurze obsługi przerwania od TIM2 zmieniam stan pinu związanego z diodą na przeciwny.
    TIM2 jest taktowany sygnałem 1MHz. Zaobserwowałem, że pierwsze przerwanie generowane jest około 30 sekund po uruchomieniu zasilania, tymczasem powinno być po 2^32 us (dioda gaśnie po ok. 30 sekundach). Zmieniłem więc wartość ARR z 0xFFFF FFFF na 1 000 000, w celu generowania przerwania co 1 s. Efekt jest zbliżony, tzn tuż po zapaleniu diody generowane jest przerwanie (w czasie znacznie krótszym od 1s).

    Poniżej zamieszczam kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 15283415
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Pokaż cały, najkrótszy kod, z którym masz problem, najlepiej z samym TIM2.
  • REKLAMA
  • #3 15283456
    nauritius
    Poziom 9  
    Posty: 35
    Oto kod main.c (inicjalizacja timera: timerInit(), inicjalizacja GPIO: testGpioInit()):
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Przepraszam za Hala, powoli staram się zastępować go działaniem na rejestrach, do GPIO jeszcze nie doszedłem. Kod gpioTestInit() - to jest funkcja inicjująca pin związany z LED:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Procedura obsługi przerwania od TIM2:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Usunąłem z definicji funkcji kod związany z TIM3, TIM5 i "kaskadowością", efekt jest ten sam, czyli w przypadku ARR = 2^32 przerwanie generowane jest po ok 30 sekundach. Kolejne przerwania generowane są już w odpowiednich chwilach czasu.
  • REKLAMA
  • #4 15283489
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Brak timerinit(), więc nie wiemy, co robi.

    A to co?:

    osThreadInit();
    osKernelStart();
  • REKLAMA
  • #6 15283515
    nauritius
    Poziom 9  
    Posty: 35
    BlueDraco napisał:
    Brak timerinit(), więc nie wiemy, co robi.

    A to co?:

    osThreadInit();
    osKernelStart();


    timerInit() zamieściłem w pierwszym poście, powtarzam:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Funkcje: osThreadInit() i osKernelStart() związane są z FreeRTOSem.

    Dodano po 15 [minuty]:

    szczywronek napisał:
    Buforowanie rejestru preskalera? Po konfiguracji rejestru TIMx_PSC dodaj ustawienie bitu TIMx_EGR_UG i daj znać czy pomogło ;)


    Dodałem to o czym piszesz:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Działa, tzn. dioda nie gaśnie po 30 sekundach (nie jest zgłaszane przerwanie) :)
    Pomogło ustawienie bitu UG w rejestrze TIM2->EGR. W nocie jest napisane:

    UG: Update generation
    This bit can be set by software, it is automatically cleared by hardware.
    0: No action
    1: Re-initialize the counter and generates an update of the registers. Note that the prescaler
    counter is cleared too (anyway the prescaler ratio is not affected). The counter is cleared if
    the center-aligned mode is selected or if DIR=0 (upcounting), else it takes the auto-reload
    value (TIMx_ARR) if DIR=1 (downcounting).

    Czy dobrze rozumiem:
    we wcześniejszej wersji programu (błędnej) wartość prescalera była buforowana i dopiero UEV wynikający z przepełnienia TIM2 powodował zaktualizowanie wartości prescalera (wpisanie wartości pożądanej przeze mnie). Ustawienie bitu UG wygenerowalo UEV programowo, i przepisanie wartości prescalera nastapiło przez uruchomieniem TIM2?

    Czy można zrobić to samo wyłączając buforowanie za pomocą bitu ARPE w CR1?
    Hmm, ARPE dotyczy chyba jedynie ARR, natomiast u mnie problem dotyczył nie tylko ARR ale także PSC, zatem samo ARPE nie wystarczy?
  • #7 15283612
    szczywronek
    Poziom 28  
    Posty: 678
    Pomógł: 142
    Ocena: 217
    Cieszę się, że działa. Dobrze rozumiesz :spoko: ARPE nie pomoże - działa tylko na buforowanie rejestru ARR. Z tego co wiem, preskaler jest buforowany zawsze i nie można tego wyłączyć. Chyba, że w F7 coś się zmieniło, ale wątpię.
  • #8 15283741
    nauritius
    Poziom 9  
    Posty: 35
    Szczywronek, dziękuję za pomoc. Zamykam temat.

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik zadał pytanie dotyczące kaskadowego łączenia timerów TIM2 i TIM3 na płytce STM32F7Discovery. Zauważył, że przerwanie od TIM2 generowane jest znacznie później niż oczekiwano, co skłoniło go do zmiany wartości rejestru ARR. W odpowiedziach zasugerowano, aby sprawdzić buforowanie rejestru preskalera oraz potwierdzono, że preskaler jest zawsze buforowany. Użytkownik zamieścił kod inicjalizacji timerów oraz procedurę obsługi przerwania, co pomogło w rozwiązaniu problemu. Na koniec podziękował za pomoc i zamknął temat.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA