Skocz do zawartości
miszczu18

Przerwanie od UART w NUCLEO F103RB - ocena

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?

Udostępnij ten post


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

Udostępnij ten post


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

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ść
Napisz odpowiedź...

×   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...