logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

STM32F0 przesyłanie bajtów przez USART, drgania styków zawieszają procesor.

norbis15 04 Mar 2019 15:52 588 5
REKLAMA
  • #1 17819426
    norbis15
    Poziom 14  
    Posty: 237
    Pomógł: 1
    Ocena: 91
    Witam,
    Napisałem program który wysyła kolejno bajty przez USART do drugiego urządzenia i jednocześnie odbiera bajty (taki powiedzmy full-duplex :)) . W zasadzie nic specjalnego program wygląda następująco:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Układ mam połączony na płytce stykowej, ale zauważyłem, że jak wypinam przewód RX to procesor się zawiesza - sprawdziłem debugerem:
    STM32F0 przesyłanie bajtów przez USART, drgania styków zawieszają procesor. . Czy przyczyną są drgania styków?

    Wcześniej tą komunikacje realizowałem za pomocą DMA i przesyłałem hurtem 8 bajtów podczas jednego cyklu i ten efekt nie występował, mogłem dowolnie wypinać przewód RX-owy. Czy można wyeliminować problem zawieszania się procesora? Transmisja hurtem przez DMA odpad, bo zależy mi na przerwie pomiędzy przesyłanymi bajtami:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Czy mierzył się ktoś z podobnym problemem? Dodam, że przesyłając pojedyncze bajty przez DMA z pożądaną zwłoką pomiędzy bajtami efekt zawieszania dalej występuje.
  • REKLAMA
  • #2 17819503
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Przyczyn szukaj w błędnym kodzie ew. braku połączenia mas. Ani sensownej części kodu, anie schematu nie pokazałeś. Kod źle sformatowany i przez to nieczytelny, inicjowanie UART dziwne, nadawanie błędne, odbiór przez krótką chwilę a potem w krzaki (chyba, bo końca kodu nie widać). Niby jaki odstęp pomiędzy bajtami ma dawać taka pętla? Potrzebujesz odstępu czasowego - użyj przerwania timera. Jak ma działać ten sam bufor używany do nadawania i odbioru?
  • REKLAMA
  • #3 17820220
    norbis15
    Poziom 14  
    Posty: 237
    Pomógł: 1
    Ocena: 91
    Poprawiłem formatowanie kodu.

    Dodano po 1 [godziny] 24 [minuty]:

    BlueDraco napisał:
    Niby jaki odstęp pomiędzy bajtami ma dawać taka pętla? Potrzebujesz odstępu czasowego - użyj przerwania timera.

    Odstęp czasowy narazie realizuję blokującym whilem, później być może przerobię to na przerwania timera.

    Przed wysyłką 8 bajtów z prędkością 115200 wysyłam jeden bajt z prędkością 9600

    Zrobiłem trochę testów i dodałem w kodzie wyłączanie USARTu CR1 &= ~(USART_CR1_UE); tuż po otrzymaniu znaku, oraz włączanie USART4 -> CR1 |= (USART_CR1_UE); tuż przed wysyłką. Po tej poprawce znacznie trudniej jest zawiesić procesor - muszę wykonać więcej prób drgania przewodem aby go zawiesić. Jednak dalej nie rozumiem w jaki sposób drgania styków zawieszają procesor. Kod wygląda następująco:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • REKLAMA
  • #5 17820519
    norbis15
    Poziom 14  
    Posty: 237
    Pomógł: 1
    Ocena: 91
    Freddie Chopin napisał:
    A jakby tak zrobić to "tak jak należy" (odczytywać odpowiednie flagi TXE/RXNE), zamiast tak kombinować?


    Co konkretnie masz na myśli? Przecież po wysyłce bajtu sprawdzam flagę USART_ISR_RXNE i odczytuje odebrany bajt z rejestru RDR.
  • #6 17820597
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    USART to jeden z najprostszych układów peryferyjnych, zarówno w konfiguracji jak i w używaniu, natomiast ty masz tam natrzaskaną taką masakrę jakby to było nie wiem co, z jakimś włączaniem, wyłączaniem, resetowaniem, ciągłymi zmianami prędkości, oczekiwaniem do 500, ... Po co? Twoja funkcja od wysyłania powinna mieć może z 5 linijek, a ma 3x tyle.
REKLAMA