Skocz do zawartości

Przerwanie od UART w NUCLEO F103RB - ocena


miszczu18

Pomocna odpowiedź

Cześć,

Chciałem zapytać czy przerwanie, które zrobiłem jest poprawne, to znaczy czy to działa przypadkiem  czy może jest okej? Ma to być przerwanie od TX.

main.c

#include "stm32f1xx.h"

UART_HandleTypeDef uart;
char TxBuffer[] = "proba\r\n";

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
		   HAL_UART_Transmit_IT(huart, (uint8_t*)TxBuffer, sizeof(TxBuffer));
}

int main(void) {
	SystemCoreClock = 8000000;

	HAL_Init();

	__HAL_RCC_GPIOA_CLK_ENABLE()
	;
	__HAL_RCC_USART2_CLK_ENABLE()
	;

	GPIO_InitTypeDef gpio;
	gpio.Mode = GPIO_MODE_AF_PP;
	gpio.Pin = GPIO_PIN_2;
	gpio.Pull = GPIO_NOPULL;
	gpio.Speed = GPIO_SPEED_FREQ_LOW;
	HAL_GPIO_Init(GPIOA, &gpio);

	gpio.Mode = GPIO_MODE_AF_INPUT;
	gpio.Pin = GPIO_PIN_3;
	HAL_GPIO_Init(GPIOA, &gpio);

	uart.Instance = USART2;
	uart.Init.BaudRate = 9600;
	uart.Init.WordLength = UART_WORDLENGTH_8B;
	uart.Init.Parity = UART_PARITY_NONE;
	uart.Init.StopBits = UART_STOPBITS_1;
	uart.Init.HwFlowCtl = UART_HWCONTROL_NONE;
	uart.Init.OverSampling = UART_OVERSAMPLING_16;
	uart.Init.Mode = UART_MODE_TX_RX;
	HAL_UART_Init(&uart);

	HAL_NVIC_SetPriority(USART2_IRQn,0,0);
	NVIC_EnableIRQ(USART2_IRQn);
	HAL_UART_Transmit_IT(&uart,(uint8_t*)TxBuffer,sizeof(TxBuffer));

	while (1)
	{

	}
}

 Do stm32f1xx_it.c dodałem ten fragment:

extern UART_HandleTypeDef uart;
void USART2_IRQHandler(void)
{
HAL_UART_IRQHandler(&uart);
}

HAL_UART_Transmit_IT to taki zamiennik zwykłego transmit dla przerwań jeśli dobrze rozumiem?

Link do komentarza
Share on other sites

Czy to załatwi sprawę ze wszystkimi UARTami?

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance==USART2)
	{
		HAL_UART_Transmit_IT(huart, (uint8_t*)TxBuffer, sizeof(TxBuffer));
	}
}

Nie mam zbytnio pojęcia o co chodzi z tymi wszystkimi zdarzeniami. Mógłbyś coś podpowiedzieć?

Link do komentarza
Share on other sites

1 godzinę temu, miszczu18 napisał:

Nie mam zbytnio pojęcia o co chodzi z tymi wszystkimi zdarzeniami. Mógłbyś coś podpowiedzieć?

UART może generować przerwania gdy bufor nadawczy pusty i gdy wysłano znak więc masz dwa zdarzenia.może jest więcej nadawczych, nie pamiętam. UART1 ma kilka wektorów przerwań, pozostałe jeden, gdzie wszystko jest razem. HAL włącza wszystkie jakie popadnie, gdybyś używał rejestrów można decydować, które włączyć, które nie. W HAL, możesz po wywołaniu nadawania wyłączyć co niepotrzebne ale wyklucza to sytuacji, że jednak jakieś zdąży się wykonać.

 

2 godziny temu, miszczu18 napisał:

Czy to załatwi sprawę ze wszystkimi UARTami?

Nie jestem pewny czy ==UART2 czy nie ==&huart2.  Ja się wpinam w przerwania konkretnego UART

void USART2_IRQHandler(void)
{
  /* USER CODE BEGIN USART2_IRQn 0 */

  /* USER CODE END USART2_IRQn 0 */
  HAL_UART_IRQHandler(&huart2);
  /* USER CODE BEGIN USART2_IRQn 1 */

  /* USER CODE END USART2_IRQn 1 */
}

Teraz wystarczy podejrzeć HAL_UART_IRQHandler wydłubać co potrzebne i po robocie. Pamiętaj aby swoją funkcję umieścić przed HAL_UART_IRQHandler a nie po, bo po nic nie sprawdzisz, bo flagi zostaną skasowane.

 

Dlaczego nie używasz DMA tylko przerwań?

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

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.