Estoy usando UART IO basado en interrupciones (sin DMA).
La función HAL_UART_Transmit_IT
establece EIE
bit en el registro CR3
. De acuerdo con la hoja de datos STM32F407 (y el comportamiento real), esto genera una interrupción solo en el modo búfer múltiple (cuando se establece DMAR
bit). EIE
habilita la generación de interrupciones para error de trama ( FE
), error de saturación ( ORE
), error de ruido ( NE
). Este error, según entiendo, solo para recibir.
Parte de la función HAL_UART_IRQHandler
:
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
comprueba cada error. Si se produjo un error y se establece EIE
bit, restablece el estado UART, pero no restablece los bits de habilitación de interrupción, por lo que siempre se generará TXE
interrupt, pero la función UART_Transmit_IT
trata el estado HAL_UART_STATE_READY
como no válido y no lo hace No hagas nada. Bucle infinito.
Parte de la función UART_Transmit_IT
:
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?