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.

STM32F0 - Przerwanie, a ustawianie globalnej zmiennej

23 Sie 2013 13:23 1455 6
  • Poziom 9  
    Witam

    Mam następujący problem przy płytce STM32F0Discovery. Celem programu jest na poziomie obsługi przerwania ustawienie globalnej zmiennej, a następnie po powrocie do maina sprawdzenie zmiennej i wykonanie instrukcji.

    Kod pliku main.c
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Kod pliku stm32f0xx_it.c
    Kod: c
    Zaloguj się, aby zobaczyć kod


    setup() ustawia wykorzystywane peryferia i na pewno działa dobrze.

    Kod setup.c:
    Kod: c
    Zaloguj się, aby zobaczyć kod



    Problem jest taki. Podczas pracy krokowej w debugerze wszystko działa OK. Jak przejdzie się do free-run to już klapa. Coś jakby przerwanie nie było obsługiwane wewnątrz while(1). Kompilator Keil'a nie zgłasza żadnych błędów. Jeśli przerzucić linię od zapalania diody do funkcji obsługi przerwania to działa.

    Ktoś spotkał się z takich zachowaniem?
  • Poziom 20  
    1. Gdzie kasujesz flagę przerwania?
    2. Gdzie kasujesz flagę new_data?
  • Poziom 9  
    Wg RM0091 (strona 629) m.in. bit RXFRQ w rejestrze RQR USART'u kasuje flagę przerwania.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Flagi new_data nie chcę kasować póki co. Ważne żeby po opuszczeniu przerwania była ustawiona na true i żeby dioda się zapaliła. Wtedy będę rozbudowywać program i dodam kasowanie flagi zaraz po zapaleniu diody.
  • Użytkownik usunął konto  
  • Poziom 9  
    Pobawiłem się inicjalizacją UART'a. I zauważyłem coś ciekawego. Uaktywnienie nadajnika i odbiornika pierwotne wyglądało następująco:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Wyłączyłem nadajnik:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    I zaczęło działać :| czy przy aktywnym nadajniku i jego przerwaniu musi być sprawdzenie źródła przerwania i ew. ominięcie?

    Cytat:
    Jeśli w przerwaniu działa dobrze, to nasuwa się jeden wniosek:
    Program nie wraca do main() ale ląduje w jakimś wyjątku, lub innym przerwaniu.
    Sprawdź to.

    Albert


    Sprawdzałem - pracuje normalnie. Jedynie w podglądzie rejestrów UART->RXNE nie ustawia się znacznik, ale podejrzewam że to wina Keil'a. W przerwanie wchodzi.
  • Poziom 32  
    Przerwania od nadajnika uaktywniaj tylko jak masz coś do nadania i po wysłaniu ostatniego bajtu dezaktywuj. Przecież wolny nadajnik jest cały czas gotowy, więc cały czas zgłasza przerwanie.
  • Poziom 9  
    W sumie to całkiem logiczne. Dzięki za odpowiedź. Problem rozwiązany.