STM32F411RE UART IRQ

0

Quiero hacer una comunicación RS-232 con un terminal de PC utilizando la interrupción en la recepción del STM32F11RE. He hecho encuestas usando

HAL_UART_Receive(&huart2,&data1,sizeof(data1),HAL_MAX_DELAY);

en un bucle while, repitiendo un eco al finalizar esto:

HAL_UART_Transmit(&huart2,"OK",sizeof("OK"),HAL_MAX_DELAY);

Ahora quiero hacer lo mismo pero sin sondeo, pero no sé cómo proceder. El manual dice "Habilitar el controlador NVIC USART IRQ", pero no hay ninguna referencia a NVIC en STM324fxx_hal_uart.c Hay una función

void HAL_UART_IRQHandler(UART_HandleTypeDef *huart);

Ya que tiene un argumento de entrada, supongo que esto no es llamado por un vector de interrupción en algún lugar. Debe ser el caso que tendré que llamarlo desde main. ¿Debería crear de alguna manera una tarea de alta prioridad y llamar al controlador de IRQ? Actualmente he descalificado FreeRTOS. Hay un indicador de interrupción global que verifiqué en el CubMx.

He añadido esto ahora

void USART2_IRQHandler(void)
{

HAL_UART_IRQHandler(&huart2);

uint8_t data1;

 HAL_UART_Receive_IT(&huart2,&data1,sizeof(data1));
      if(data1 > 0)
      {
          HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin,GPIO_PIN_SET);
          HAL_UART_Transmit_IT(&huart2,"OK",sizeof("OK"));
      }
}

Funciona con esto en main:

void MX_USART2_UART_Init(void)
{

 huart2.Instance = USART2;
 huart2.Init.BaudRate = 115200;
 huart2.Init.WordLength = UART_WORDLENGTH_8B;
 huart2.Init.StopBits = UART_STOPBITS_1;
 huart2.Init.Parity = UART_PARITY_NONE;
 huart2.Init.Mode = UART_MODE_TX_RX;
 huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
 huart2.Init.OverSampling = UART_OVERSAMPLING_16;
 HAL_UART_Init(&huart2);
 HAL_NVIC_SetPriority(USART2_IRQn,14,0);
__HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);
}
    

1 respuesta

1

El controlador de interrupciones se ubicará en stm32f4xx_it.c

Encontrará el controlador de interrupciones UART y la función de devolución de llamada, puede agregar su código en su lugar.

por ejemplo, si desea almacenar los datos recibidos en una matriz especial o transimitar los caracteres en algún lugar, simplemente asegúrese de borrar las marcas si no está utilizando la función de devolución de llamada.

    
respondido por el ElectronS

Lea otras preguntas en las etiquetas