Estoy usando UART IO basado en interrupciones (sin DMA).
HAL_UART_Transmit_IT
La función establece EIE
un bit en el CR3
registro. De acuerdo con la hoja de datos STM32F407 (y el comportamiento real), esto genera una interrupción solo en el modo de búfer múltiple (cuando DMAR
se establece el bit). EIE
habilita la generación de interrupciones por error de marco ( FE
), error de desbordamiento ( ORE
), error de ruido ( NE
). Este error, según tengo entendido, solo para recibir.
Parte de HAL_UART_IRQHandler
la función:
tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_ORE);
tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR);
/* UART Over-Run interrupt occurred ----------------------------------------*/
if((tmp1 != RESET) && (tmp2 != RESET))
{
__HAL_UART_CLEAR_OREFLAG(huart);
huart->ErrorCode |= HAL_UART_ERROR_ORE;
}
if(huart->ErrorCode != HAL_UART_ERROR_NONE)
{
/* Set the UART state ready to be able to start again the process */
huart->State = HAL_UART_STATE_READY;
HAL_UART_ErrorCallback(huart);
}
HAL_UART_IRQHandler
controles para cada error. Si se produjo un error y EIE
se establece el bit, restablece el estado de UART, pero no restablece los bits de activación de interrupción, por TXE
lo que siempre se generará una interrupción, pero UART_Transmit_IT
la función trata el estado HAL_UART_STATE_READY
como inválido y no hace nada. Bucle infinito.
Parte de UART_Transmit_IT
la función:
static HAL_StatusTypeDef UART_Transmit_IT(UART_HandleTypeDef *huart)
{
uint16_t* tmp;
uint32_t tmp1 = 0;
tmp1 = huart->State;
if((tmp1 == HAL_UART_STATE_BUSY_TX) || (tmp1 == HAL_UART_STATE_BUSY_TX_RX))
{
}
else
{
return HAL_BUSY;
}
}
¿Es un error en Cube HAL?
¿Intentó descargar la última versión de Cube HAL para su MCU?
Mi función HAL_UART_Transmit_IT() parece muy diferente a la tuya. Tal vez tengas una versión anterior con errores.
Intente acceder a st.com y busque la última versión de Cube HAL. Dentro del archivo encontrarás algún ejemplo con USART.
HAL_UART_Transmit_IT
y UART_Transmit_IT
son funciones diferentes. El primero solo configura interrupciones, mientras que el segundo transmite datos
usuario8908459