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?