Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[HAL]Przerwanie od RX - NUCLEO-F103RB

Pan Korsarz 12 Mar 2019 15:15 441 7
  • #1
    Pan Korsarz
    Level 3  
    Witam,
    cały dzień męczę się z obsługą przerwania od odbioru danych w STM32103RB.
    Korzystam z biblioteki HAL.
    Po całym dniu dalej nie wiem jak to ma wyglądać, dostępne example robione są w STM32CubeMX, a ja z tego nie korzystam.
    W dokumentacji chyba nie potrafię się poruszać bo nie wyiskałem z niej co po kolei trzeba wywoływać aby obsłużyć to przerwanie.
    Generalnie przewijają się funkcje:

    HAL_UART_RxCpltCallback();
    HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

    Nie wiem czy powinienem odbierać char'y w ramach tej pierwszej funkcji (w jej ciele), czy dać wskaźnik do tablicy i odbierać dane w tej drugiej funkcji, tak czy siak, żaden nie działa.
    Czy w HAL muszę jakoś aktywować przerwania (tak jak na przykład w AVR robiło to polecenie sei())?

    Sam UART jest skonfigurowany i działa.
    Generalnie dążę do tego, żeby odbierać chary po kolei z UART'u i zapisywać je kolejno w tablicy.
    Nie proszę o gotowca, tylko o to, żeby ktoś poukładał mi te informacje.

    Niżej przesyłam kod programu, mam zaimplementowany w nim system FreeRTOS.
    Code: c
    Log in, to see the code
  • Helpful post
    #2
    MaX.J
    Level 12  
    Aby cokolwiek odebrać przy użyciu HALa musisz wywołać funkcję HAL_UART_Receive_IT. W niej podajesz bufor i ile bajtów chcesz odebrać. Przerwanie wykona się, gdy odbierzesz oczekiwaną ilość i wyłączy jednocześnie przerwanie. Musisz je znowu aktywować. Konfigurację UARTa można zostawić z HALa, jednak samą obsługę przerwań lepiej zrobić na rejestrach.
  • #3
    Pan Korsarz
    Level 3  
    Jeśli FRAME_SIZE ma wartość 22, przerwanie wykona się gdy wyślę 22 chary przez UART ? A jeśli wyślę 21 to gdzie one będą się znajdowały? W jakimś buforze ?
    Obsługą przerwania jest sama funkcja HAL_UART_Receive_IT() ? Po wysłaniu tych 22 znaków przepisze ona je do tablicy na którą podałem wskaźnik ?
    Czy obsługa przerwania zawiera się może w innej funkcji ?
    Pytań się namnożyło...
  • Helpful post
    #4
    MaX.J
    Level 12  
    Odebrane znaki przechowywane będą w podanym buforze. Przerwania obsługiwane są w HALu, funkcja HAL_UART_RxCpltCallback jest wywoływana po odebraniu całości (w tym przypadku 22 znaki). Oczywiście możesz z nich korzystać wcześniej, ale musisz zajrzeć głębiej do HALa. Obsługi przerwań są w pliku projektu, plik z końcówką "it" (funkcja UART_IRQHandler). Możesz też bezpośrednio operować na tym buforze, jednak jest to ryzykowne, ponieważ może on być w każdej chwili zmieniony (przerwanie i wpis do bufora).
  • Helpful post
    #5
    LChucki
    Level 31  
    Pan Korsarz wrote:
    A jeśli wyślę 21 to gdzie one będą się znajdowały? W jakimś buforze ?

    W "*pData"

    Pan Korsarz wrote:
    Obsługą przerwania jest sama funkcja HAL_UART_Receive_IT()

    Ta funkcja aktywuje odbiór na przerwaniach. Samo przerwanie to przykładowo "HAL_UART_RxCpltCallback();" ale możesz obejrzeć funkcję, która wywołuje "HAL_UART_RxCpltCallback();" i będziesz miał jasność co się i gdzie dzieje, jak obsłużyć przerwania od konkretnego UART (gdzieś tam będziesz musiał dać if == $huartx).

    W "kursach" piszą o "HAL_UART_RxCpltCallback();" ale jak odróżnić, z którego UART pochodzi przerwanie już nie. Faktycznie w przypadku UART lepiej skorzystać z własnej funkcji niż "HAL_UART_RxCpltCallback();".
  • #6
    Pan Korsarz
    Level 3  
    MaX.J wrote:
    Musisz je znowu aktywować. Konfigurację UARTa można zostawić z HALa, jednak samą obsługę przerwań lepiej zrobić na rejestrach.

    Jak je ponownie aktywować ? Obsługę czy inicjalizacje przerwania?
  • Helpful post
    #7
    LChucki
    Level 31  
    Pan Korsarz wrote:
    MaX.J wrote:
    Musisz je znowu aktywować. Konfigurację UARTa można zostawić z HALa, jednak samą obsługę przerwań lepiej zrobić na rejestrach.

    Jak je ponownie aktywować ?

    HAL_UART_Receive_IT
  • #8
    User removed account
    Level 1