Witam,
co jakiś czas mam problem z brakiem inkrementacji rejestru CNT wolniejszego timera, inkrementowanego przez przepełnienie timera szybszego.
Konfiguracja timerów odbywa się w sposób standardowy, tzn. pomijając ustawienia jednostek Capture, ustawiam też kaskadowe połączenie timerów zgodnie z dokumentacją. TIM5 ma być inkrementowany poprzez przepełnienie licznika TIM2. W tym celu:
1) [TIM2] Ustawiam bity 6:4 MMS = 010 (przepełnienie TIM2 powoduje załączenie TRGO)
2) [TIM5] Wybieram wejściowy trigger służący do synchronizacji licznika (ITR0, TS=000 rejestru TIM5_SMCR)
3) [TIM5] Ustawiam zbocze narastające jako taktowanie wolniejszego licznika (TRGI, SMS=111 rejestru TIM5_SMCR)
4) Odpalam liczniki TIM2, TIM5
Dodam, że rejestry TIM2->CNT i TIM5->CNT były wyzerowane.
Generalnie program działa dobrze, przepełnienie TIM2 powoduje inkrementację TIM5 ale... nie zawsze!
W programie wygląda to tak:
// funkcja main(), pętla while(1)
// część programu, wywołanie funkcji
static volatile unsigned short tim5_value, tim2_value;
static volatile unsigned long Timer25a, Timer25b;
tim5_value = TIM5->CNT;
tim2_value = TIM2->CNT;
Timer25a = tim2_value + (tim5_value << 16); //zapisz do zmiennej Timer25a wartość dwóch rejestrów
// tutaj występuje kilka instrukcji nie mających związku z timerami
tim5_value = TIM5->CNT; //powtarzamy odczytanie rejestrów (różnica Timer25a-Timer25b da nam czas)
tim2_value = TIM2->CNT;
Timer25b = tim2_value + (tim5_value << 16); //zapisz do zmiennej Timer25b wartość dwóch rejestrów
Jak wspomniałem, program działa bez zarzutów, jednak co jakiś czas przepełnienie TIM2 nie powoduje inkrementacji TIM5. Zdiagnozowałem to przy debugowaniu, i tak:
1) Na początku zmienna Timer23a ma wartość np. 0x2171 C519
2) A za chwilę zmienna Timer23b ma wartość np. 0x2171 0013
Mimo, że nastąpiło przepełnienie licznika szybszego (o czym świadczą 4 najmłodsze bajty) to licznik TIM5 (cztery najstarsze bajty) się nie inkrementował. Dodam, że rejestry ARR wynoszą odpowiednio:
TIM2->ARR=0xFFFF;
TIM5->ARR=0x2AEA;
Z góry dziękuję za pomoc.