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.

stm32f100 - Konfiguracja TIM1

el2010tmp 07 Lut 2014 13:09 1125 9
  • #1 07 Lut 2014 13:09
    el2010tmp
    Poziom 25  

    Próbuje skonfigurować timer TIM1 jako generator pwm. W celach edukacyjnych puściłem go w zwolnionym tempie aby zobaczyć jak działa.
    Nie rozumiem dlaczego po ustawieniu opcji [Center-aligned mode] timer zaczyna pracę od zliczania w dół zamiast rozpocząć od 0 w górę. Przeglądam dokumentację i nic nie przychodzi mi do głowy, może ktoś zna odpowiedź bo od mnogości opcji już sam się pogubiłem :)

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 9
  • #2 07 Lut 2014 13:27
    Loker
    Poziom 38  

    W RM0008 jest taka ciekawostka (strona 306):

    Hints on using center-aligned mode:
    ● When starting in center-aligned mode, the current up-down configuration is used. It means that the counter counts up or down depending on the value written in the DIR bit in the TIMx_CR1 register. Moreover, the DIR and CMS bits must not be changed at the same time by the software.

    Choć z drugiej strony, nie widzę w Twoim kodzie żebyś modyfikował TIM1_CR1->DIR...

    0
  • #3 07 Lut 2014 13:40
    el2010tmp
    Poziom 25  

    Loker napisał:
    Choć z drugiej strony, nie widzę w Twoim kodzie żebyś modyfikował TIM1_CR1->DIR...


    Podczas wykonywania instrukcji:

    TIM1->CR1|=TIM_CR1_CEN; // załącz TIM1

    bit TIM1_CR1->DIR w "cudowny" sposób zmienia wartość na 1 i tego nie mogę zrozumieć...

    TIM_CR1_CEN==((uint16_t)0x0001) więc bit TIM1_CR1->DIR nie powinien zostać naruszony.

    0
  • #4 07 Lut 2014 13:45
    tadzik85
    Poziom 38  

    el2010tmp napisał:
    TIM1->CR1=0;
    TIM1->CR1|=(//TIM_CR1_ARPE| // Auto-reload preload enable
    TIM_CR1_CMS_0| // Center-aligned mode 3 [11]
    TIM_CR1_CMS_1);


    I nie twórz takich cudów na przyszłość, po co zerujesz rejestr by później wykonać OR na nim? Skoro można wprost zapisać wartość.

    Sprawdź czy zanim go nie włączysz nie masz ustawionej flagi przepełnienia.
    Zrobiłeś update timera z zerowaniem flag?

    0
  • #5 07 Lut 2014 14:00
    el2010tmp
    Poziom 25  

    tadzik85 napisał:
    Sprawdź czy zanim go nie włączysz nie masz ustawionej flagi przepełnienia.


    UIF pojawia się w chwili załączenia. Przed załączeniem rejestr TIM1->SR jest wyzerowany.

    0
  • #6 07 Lut 2014 14:06
    tadzik85
    Poziom 38  

    To zanim włączysz TIM wymuś update i wyzeruj flagi, przed włączeniem wstaw __DMB();

    0
  • #7 07 Lut 2014 14:24
    el2010tmp
    Poziom 25  

    tadzik85 napisał:
    To zanim włączysz TIM wymuś update
    ???

    Przepraszam ale jestem początkujący :)
    Chodziło o coś takiego?
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Niestety nie działa. Bawię się stm od niedawna i podejrzewam, że skopałem coś w konfiguracji, ale nie mogę tego rozgryźć.

    0
  • Pomocny post
    #8 07 Lut 2014 14:38
    tadzik85
    Poziom 38  

    Kod: c
    Zaloguj się, aby zobaczyć kod

    zle

    bit U w rejestrze EGR
    po tym tez wstaw to DMB dla pewności

    0
  • #9 07 Lut 2014 15:36
    el2010tmp
    Poziom 25  

    tadzik85 napisał:
    bit U w rejestrze EGR


    Faktycznie, działa nawet bez __DMB();
    W dokumentacji również się "znalazło" :)

    Dzięki.

    0
  • #10 07 Lut 2014 15:41
    tadzik85
    Poziom 38  

    el2010tmp napisał:
    tadzik85 napisał:
    bit U w rejestrze EGR


    Faktycznie, działa nawet bez __DMB();
    W dokumentacji również się "znalazło" :)

    Dzięki.


    Faktycznie DMB nie jest konieczne, konieczne jest gdy od razu sprawdzasz stan flagi, np czekając na przepełnienie wówczas od razu warunek jest spełniony.

    0
  Szukaj w 5mln produktów