STM32F4 Cubo HAL UART. ¿Es un error o me estoy perdiendo algo?

Estoy usando UART IO basado en interrupciones (sin DMA).

HAL_UART_Transmit_ITLa función establece EIEun bit en el CR3registro. 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 DMARse establece el bit). EIEhabilita 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_IRQHandlerla 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_IRQHandlercontroles para cada error. Si se produjo un error y EIEse establece el bit, restablece el estado de UART, pero no restablece los bits de activación de interrupción, por TXElo que siempre se generará una interrupción, pero UART_Transmit_ITla función trata el estado HAL_UART_STATE_READYcomo inválido y no hace nada. Bucle infinito.

Parte de UART_Transmit_ITla 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?

tres años y medio después y esto sigue siendo un problema

Respuestas (2)

es un error

Hice la misma pregunta en el foro de ST: https://my.st.com/d5c15f59

Lo confirmaron.

El enlace "my.st.com" requiere un inicio de sesión. Encontré este hilo en el foro ST, que creo que es el informe de este problema, y ​​es accesible sin iniciar sesión, por lo que los lectores pueden encontrarlo útil.

¿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_ITy UART_Transmit_ITson funciones diferentes. El primero solo configura interrupciones, mientras que el segundo transmite datos
Sí, pero ¿sabe que la segunda función solo puede ser llamada por otra función HAL no directamente por el usuario? Y solo abro mis archivos fuente HAL y encuentro UART_Transmit_IT y es diferente a la parte que pegaste arriba. Otra opción si aún cree que hay un error es escribir la misma pregunta en el foro.