Elektroda.pl
Elektroda.pl
X
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] Licznik TIM1 konfiguracja i przerwanie

05 Lip 2011 17:33 3480 7
  • Poziom 19  
    Witam,

    Ostatnio postanowiłem zająć się licznikami i przerwaniami.

    To co chcę osiągnąć, to każdorazowe przerwanie po przepełnieniu licznika TIM1.

    Konfiguracja licznika:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Konfiguracja przerwania:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Przerwanie:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    W ogóle nie dostję przerwania. W czym tkwi problem?
  • Poziom 43  
    A taktowanie Timera jest włączone?
  • Poziom 30  
    Napisz co ile ma być zgłoszone przerwanie i jak masz skonfigurowany zegar.
    A poza tym po wejściu do przerwania musisz skasować bit zgłoszenia przerwania TIMx->SR &= ~(1<<0);
    Spróbuj może takiej konfiguracji:

    TIM6->PSC=0xFA00;//1ms,64MHz
    TIM6->ARR=10;// int co 10ms
    TIM6->DIER=1;
    TIM6->CR1=0x1;
  • Pomocny post
    Poziom 10  
    Mnie tam brakuje ustawienia przerwania:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Ogólnie takie coś powinno działać:
    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 19  
    radzick napisał:
    Mnie tam brakuje ustawienia przerwania:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Ogólnie takie coś powinno działać:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Z tego co widzę to używasz PWM'a. Ja potrzebuję tylko zwyczajne przerwanie od przepełnienia.

    Ale włączenie

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Pomogło dzięki.

    Ogólnie biorąc to w tych ARM'ach strasznie dużo rejestrów trzeba poustawiać, żeby coś działało ;)

    Mam jeszcze pytanie dotyczące flagi, która trzeba wyzerować w przerwaniu:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Powinno to się odbywać na początku, czy na końcu przerwania. Jak potem można zidentyfikować, o które przerwanie chodzi?
  • Pomocny post
    Poziom 10  
    Cieszę się, że mogłem pomóc. Fakt - ciężko się w tym odnaleźć, tym bardziej, że czasem są dziwne zależności. Jak np. żeby włączyć PWM dla TIM1 trzeba ustawić bit w rejestrze od break'a i dead-time:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Ustawia ono bit TIM_BDTR_MOE w rejestrze BDTR, polecenie dotyczy liczników 1, 8, 15, 16 i 17 .

    Dodano po 57 [minuty]:

    y0yster napisał:


    Pomogło dzięki.

    Ogólnie biorąc to w tych ARM'ach strasznie dużo rejestrów trzeba poustawiać, żeby coś działało ;)

    Mam jeszcze pytanie dotyczące flagi, która trzeba wyzerować w przerwaniu:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Powinno to się odbywać na początku, czy na końcu przerwania. Jak potem można zidentyfikować, o które przerwanie chodzi?

    Och jeszcze odnośnie twojego pytania o flagę przerwania. Ja używam poniższej procedury. W razie gdy przerwania odnosi się do wielu peryferiów (jak np. TIM1_CC_IRQHandler może odnosić się do czterech kanałów timera) trzeba wszystkie wy-if-ować jak poniżej:

    Kod: c
    Zaloguj się, aby zobaczyć kod