STM32F4 Cube HAL UART. ¿Es un error o me falta algo?

7

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?

    
pregunta rublag

2 respuestas

2

Es un error.

Hice la misma pregunta en el foro de ST: enlace

Lo confirmaron.

    
respondido por el rublag
0

¿Intentaste descargar la última versión de Cube HAL para tu MCU?

Mi función HAL_UART_Transmit_IT () parece muy diferente a la tuya. Tal vez tienes una versión anterior con errores.

Intente acceder a st.com y busque la última versión de Cube HAL. Dentro del archivo encontrará algún ejemplo con USART.

    

Lea otras preguntas en las etiquetas