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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.