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);
}