Skocz do zawartości

Obsługa przerwania od UART


Karson777

Pomocna odpowiedź

Witam,

Piszę program w HALu na podstawie CubeMX.

Mam problem z obsługą przerwania, a dokładnie z ponownym działaniem przerwania po pierwszej obsłudze.

void HAL_UART_RxCpltCallback(UART_HandleTypeDef * huart)
{
	if(huart->Instance==UART4)
	{
		if(RX[RX_len] == 0x0D)
		{
			RX_len = 0;
		} else
		{
			RX_len++;
		}
		HAL_UART_Receive_IT(&huart4, &RX[RX_len], 1);
	} else
	if(huart->Instance==USART1)
	{
		if(RX[RX1_len] == 0x0D)
		{
			RX1_len = 0;
		} else
		{
			RX1_len++;
		}
		HAL_UART_Receive_IT(&huart1, &RX[RX1_len], 1);
	}
}

Na początku inicjuje przez:

HAL_UART_Receive_IT(&huart1, RX1, 1);

HAL_UART_Receive_IT(&huart4, RX, 1);

Podczas przychodzenia ciągu bajtów, najpierw zostaje obsłużony pierwszy znak w przerwaniu, ale już kolejne bajty przychodzące przez UART nie wywołują przerwania.

Co ciekawe odbieranie innym portem USART (nie UART) daje poprawną obsługę przerwań całeg o ciągu bajtów.

Co może powodować takie zachowanie przerwania dla UART?

 

Pozdrawiam.

Edytowano przez Karson777
Link do komentarza
Share on other sites

Schemat standardowy: TX z RX odbiornika i odwrotnie. Zasilanie obydwu układów z 3,3V z większymi kondensatorami i odsprzęgającymi 100nF.

Naprawdę dziwi mnie dlaczego po wejściu do przerwania (w standardzie HAL) w którym jest ponowne włączenie nasłuchiwania, przerwanie już przestaje działać... mimo nadchodzącego dalszego ciągu znaków.

Link do komentarza
Share on other sites

Cześć,

spróbuj wczytać do bufora więcej niż jeden bajt:

/*##-3- Put UART peripheral in reception process ###########################*/  
  if(HAL_UART_Receive(&UartHandle, (uint8_t *)aRxBuffer, RXBUFFERSIZE, 5000) != HAL_OK)
  {
    Error_Handler();  
  }

Dobrze jest też przerzutować bufer na (uint8_t *)aRxBuffer

Przykład z CubeMX repository..

Pozdrawiam

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

17 godzin temu, Karson777 napisał:

Dopiero poznaje HAL-a, ale czy można łączyć przerwania UARTa z funkcją HAL_UART_Receive?

Cześć,

pomyliłem się, powinno być:

/*##-4- Put UART peripheral in reception process ###########################*/  
  if(HAL_UART_Receive_IT(&UartHandle, (uint8_t *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)
  {
    Error_Handler();
  }

gdzie RXBUFFERSIZE możesz podstawić dyrektywą preprocesora #define. Reszta uwag pozostaje w mocy 😉

Pozdrawiam

  • Lubię! 1
Link do komentarza
Share on other sites

Zanim to sprawdzę, bo w tej chwili nie mam dostępu do programu. Zapytam:

1. Jeśli nie używam przerwań (UART) i wysyłam jakieś zapytanie do zewnętrznego urządzenia i w odpowiedzi otrzymuje kilka linii odpowiedzi (tekstowych), to aby odebrać wszystkie linie muszę kilkakrotnie wystawić: HAL_UART_Receive?

2. Jeśli mam wyłączone przerwania (UART) i nie znamy ile linii tekstu dostaniemy od zewnętrznego urządzenia po zapytaniu przez HAL_UART_Transmit, to jest to możliwe do wykonania bez obsługi przerwania?

Link do komentarza
Share on other sites

HAL_UART_Receive_IT(&huart4, &RX[RX_len], 1);

Powinno być &RX . Tak jak miałeś było źle bo ustawiało początek bufora na adresie ostatniego elementu i w rezultacie nadpisywałeś pamięć za tablicą. Ilość znaków (bajtów) to ilość po odebraniu której zostanie zgłoszone przerwanie. Jeśli dasz 1 to po każdym znaku zostanie uruchomiona obsługa przerwania z funkcji callback ale można dać więcej. Dokładnie to samo jeśli chodzi o DMA z tą różnicą, że DMA zgłasza jeszcze przerwania od odebrania/wysłania połowy bufora(tablicy).

 

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.