SMT32 HAL UART se bloquea en un posible rebasamiento

0

Aumenté mi velocidad en baudios de 56000 a 115200 y mi comunicación en serie deja de funcionar al hacer ping continuamente después de 10-20 segundos. Estoy corriendo a 16 MHz.

Por lo que sé, el controlador HAL manejará la saturación, entre otros errores al borrar la bandera y llamar a la función de devolución de llamada de error. Si ese es el caso, entonces si tengo un exceso de velocidad debido al aumento en la velocidad, debería borrarse y mi comunicación debería continuar trabajando después de eso.

También descubrí que aumentar la velocidad del procesador a 32 MHz "soluciona" el problema, pero no quiero confiar en eso. Quizás solo tome mucho más tiempo para que se produzca el error.

¿Mi entendimiento es correcto? ¿Las marcas UART se borran automáticamente con los controladores HAL? ¿Necesito limpiarlos yo mismo o manejarlos de alguna manera? ¿Hay algo que me falta?

Básicamente uso HAL_UART_Transmit_IT () y llamo a HAL_UART_Receive_IT () después de que termine y no hago nada más.

    
pregunta Carlos

1 respuesta

1

Lo que sucede es que tengo el error de saturación, ya que mi microcontrolador no puede mantenerse al día con todo. Hay una extraña combinación de saturación y RXNE que no se maneja en HAL UART y solo hará que HAL_UART_IRQHandler () se atasque cuando se le llame por todas partes.

He encontrado un enlace aquí explicando un poco.

Aquí está el código que agregué (ligeramente modificado para la serie STM32L0) debajo de HAL_UART_IRQHandler () justo antes del comentario si ocurre algo:

  if( ((isrflags & USART_ISR_ORE) != RESET) && ((isrflags & USART_ISR_RXNE) == RESET) )
  {
    __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF);
    huart->ErrorCode |= HAL_UART_ERROR_ORE;
    return;
  }

¡Y solo asegúrese de modificar el archivo HAL_UART.c que realmente compila!

    
respondido por el Carlos

Lea otras preguntas en las etiquetas