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 - Przerwania, Timer7 na rejestrach

28 Lip 2015 02:33 696 4
  • Poziom 10  
    Witam ponownie tym razem próbuję uruchomić przerwanie od TIM7 w mikro STM32 F303VC6 na płytce Discovery F3. Napisałem konfiguracje NVIC i TIM7 po czym uruchomiłem całość i owszem to co jest w funkcji obsługi przerwania jest wykonywane ale mam wrażenie, że pełną częstotliwością a nie co 1 sekundę tj ustawiłem. Prosiłbym o jakieś wskazówki bo pierwszy raz to robię na rejestrach i nie do końca wiem jak to powinno wyglądać. Poniżej zamieszczam kody:

    konfiguracja NVIC:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    konfiguracja TIM7:
    Kod: c
    Zaloguj się, aby zobaczyć kod



    Funkcja obsługi przerwania:
    Kod: c
    Zaloguj się, aby zobaczyć kod



    Tak na sam koniec mógłby mi ktoś wytłumaczyć dlaczego w Program manualu rejestry NVIC ISER IABR ICER są tablicami 2-elementowymi a w CMSIS 8-elementowymi i tu i tu typ uint32_t?
  • Pomocny post

    Poziom 26  
  • Pomocny post
    Poziom 38  
    Tablicami NVIC się nie przejmuj. Korzystaj z funkcji dostarczonych przez CMSIS, w tym przypadku nie warto stosować rejestrów wprost.
    Konfiguracja Timera OK, choć kolejność nie należy do poprawnych. Przyjrzyj się jeszcze rejestrowi EGR.
    Przerwanie? Brak kasowania flagi skutkuje ciągłym jego wywoływaniem.
    Flagę kasuje się na początku przerwania.

    I taka uwaga. Programując na rejestrach czasami można mieć odczucie, że rdzeń jest szybszy od układów peryferyjnych.
  • Pomocny post
    Specjalista - Mikrokontrolery
    Rada praktyczna: ustaw preskaler tak, żeby podzielony zegar timera miał jakiś "okrągły" okres, np. 1, 10 lub 100 us, wtedy nie będziesz musiał pracowicie wyliczać wartości okresu timera, np. preskaler 7200 -> okres zegara 100 us; w celu uzyskania jednej sekundy ładujesz do ARR 10000-1.

    Twój problem, jak napisano wyżej, wynika z braku kasowania znacznika zgłoszenia przerwania -> po "pierwszym razie" przerwanie jest ciągle zgłaszane. Brakuje instrukcji:
    TIM7->SR = ~TIM_SR_UIF;

    Masz jeszcza kilka innych kwiatków - uruchamiasz timer przed załadowaniem preskalera i okresu - zmień kolejność; zapis do CR1 powinien być na końcu. Przy zapisie CR1 i DIER używaj podstawień, nie |=.

    Rdzenie M3 mogą mieć do 512 przewań (typowo do 256), więc dwa rejestry po 32 bity nie wystarczą do trzymania 512 bitów. Konkretyn model uC może mieć źródeł przerwań znacznie mniej, więc definicja ogólna jest na 256 bitów, a w konkretnym modelu mogą być tylko 2 rejestry po 32 bity.

    SCB->AIRCR nie ruszaj, dopóki nie wiesz dokładnie, co robisz i z czego to wynika.
  • Poziom 10  
    Miło mi poinformować, że po wpisaniu komendy o zerowaniu flagi przerwania całość działa pięknie. Dziękuje a ponizej zamieszczam listningi poprawne:

    Konfiguracje

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Funkcja main i funkcja obsługi przerwania:

    Kod: c
    Zaloguj się, aby zobaczyć kod