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