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] Przerwanie UART-a nie działa

18 Paź 2010 11:43 2877 7
  • Poziom 23  
    Witam
    Napotkałem na dziwny problem. Napisałem programik gdzie używam kilku przerwań m.in przerwania USART4. Jak wgram program przez JTAG-a i debuguje to wszystko działa bez zarzutów natomiast po zaprogramowaniu hexa do procka nie działa przerwanie od UART-a przy czym inne przerwania działają ok. Sam uart działa bo wysyła znaki natomiast przerwanie się nie wykonuje jak coś wyślę. Może ktoś wie w czym może być rzecz ??

    kod inicjalizacji:
    Code:

        RCC->APB1ENR|=RCC_APB1ENR_UART4EN;
        RCC->APB2ENR|=RCC_APB2ENR_IOPCEN;
        //set baudrate
        UART4->BRR=FREQUENCY/9600L/2;
        //enable uart, reciever and transmiter
        UART4->CR1 |= (USART_CR1_UE|USART_CR1_RE | USART_CR1_TE);
        //enable recieve interrupt
         UART4->CR1|=USART_CR1_RXNEIE;


    RX ustawione jako wejście z pullupem, TX jako Alternate function
  • Specjalista - Mikrokontrolery
  • Poziom 23  
    Proszę moderatora o doklejenie do wcześniejszego tematu bo przez przypadek kliknąłem w rozwiązano :(

    Przerwania mam włączone. Globalnie przez __enable_irq(); i poszczególne przez wpisanie jedynek do odpowiednich rejestrów ISER. Czy to możliwe że przerwania działają przy debugowaniu a przy normalnym wykonywaniu kodu już nie nawet jakby nie były włączone ??
  • Specjalista - Mikrokontrolery
    Niebardzo - STM32 jest bardzo bezproblemowy w debuggowaniu, więc nie tutaj szukałbym problemu.

    Może podczas debuggowania (ze względu na nieco inne "okoliczności") nie wyskakują Ci errory, które w normalnych warunkach się pojawiają i blokują transmisję? Sprawdź, czy nie są poustawiane flagi od błędów w rejestrach SR.

    4\/3!!
  • Poziom 38  
    Może pokaż cały kod. Poza tym, przerwania mogą być tak szybko wywoływane, że przy debuggingu się one gdzieś zgubią (bo nie odbierzesz wszystkich znaków z bufora a już przyjdą następne znaki).

    Mówisz, że nie działa w ogóle, więc może posprawdzaj flagi transmisji ?
  • Poziom 23  
    Trochę pogrzebałem i znalazłem przyczynę. Kluczowa była flaga IDLE okazało się że po resecie UART nie jest w stanie IDLE nawet jak nic nie szło i wtedy trochę pogrzebałem i odkryłem że mam błąd. Problem polegał na tym że robiłem OR-a żeby skonfigurować port w odpowiedni tryb a zapomniałem że rejestr GPIOx-CRx nie ma 0 po resecie tylko 0x44444444 ale w takim razie wychodzi na to że jak wgrywałem soft to tam jakoś się to 0 pojawiało a po pierwszym resecie ustawiało się 0x44444444. Dzięki za pomoc.
  • Poziom 38  
    Dlatego zawsze należy umieszczać CAŁY program, a nie stwierdzać, że reszta jest ok tylko tutaj coś nie gra...
  • Poziom 23  
    Umieszczenie całego programu stanowi często problem ze względu że czasem są to grube setki linii kodu, a komu by się to chciało czytać :P