Skocz do zawartości
Karson777

Obsługa przerwania od UART

Pomocna odpowiedź

Napisano (edytowany)

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

Udostępnij ten post


Link to post
Share on other sites

Pokaż schemat podłączenia ;p

Udostępnij ten post


Link to post
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.

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
Share on other sites
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

Udostępnij ten post


Link to post
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?

Udostępnij ten post


Link to post
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).

 

Udostępnij ten post


Link to post
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!

Gość
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...