El bit TXE no borrará UART ARM M0

Estoy tratando de hacer que UART funcione en una parte STM32F0 y no puedo descifrar las interrupciones. Según el manual de referencia

Bit 7 TXE: Transmit data register empty
This bit is set by hardware when the content of the USARTx_TDR register has been 
transferred into the shift register. It is cleared by a write to the USARTx_TDR register.
An interrupt is generated if the TXEIE bit =1 in the USARTx_CR1 register.

Sin embargo, nunca puedo ver clara la bandera TXE. Esto es lo que tengo en mi controlador de IRQ:

  if(USART_GetITStatus(EVAL_COM1, USART_IT_TXE) != RESET)
  {   
    /* Write one byte to the transmit data register */
    if (TxBuffer[TxCount] != '\0')
    {
      USART_SendData(EVAL_COM1, TxBuffer[TxCount++]);
    }
    //else{
    //  USART_ITConfig(EVAL_COM1, USART_IT_TXE, DISABLE);
    //}
  }

A menos que elimine el comentario de la declaración else, la interrupción de envío sigue activándose sin cesar incluso después de que dejo de enviar bytes al TDR. ¿Hay alguna manera de detener las interrupciones sin deshabilitarlas? ¿O necesito volver a habilitar cada vez que quiero enviar algo?

Intente agregar: USART_ClearITPendingBit(EVAL_COM1,USART_IT_TXE); ... Todavía deshabilitaría la interrupción si no tiene datos para enviar.
Necesito enviar un mensaje cada par de segundos en respuesta a un mensaje recibido. ¿Es la forma correcta de enviar mi respuesta y luego deshabilitar la interrupción? Si es así, está bien, simplemente no pensé que la interrupción debía deshabilitarse.
Siempre deshabilito la interrupción cuando mi búfer de transmisión está vacío. Para ser honesto, no estoy seguro de si es necesario si borra el bit USART_IT_TXE según mi sugerencia anterior.

Respuestas (2)

Cuando USARTx_TDRel registro está vacío, USART_ISR_TXEel indicador se establece en 1. Cuando USARTx_CR1_TXEIE( TXEindicador de habilitación de interrupción) está habilitado y TXE=1quedará pendiente la interrupción.

Entonces, la muestra de código con la interrupción de desactivación después de la transmisión completa es una buena solución.

Al iniciar la transmisión periódicamente, simplemente escriba el primer byte (se borrará TXE) y habilite la interrupción.

O, si es posible, use DMA: un poco más de código, pero después de calcularlo strleny configurarlo, es más bien disparar y olvidar;)

En lugar de pensar en TXE como un indicador que debe borrarse, se debe considerar que indica que el UART está listo para aceptar datos para la transmisión. El hecho de que no tenga ningún dato para la transmisión de datos no significa que no esté listo.

Algunos microcontroladores como el 8051 tienen un indicador que se establece cuando el UART termina de configurar un byte, pero también se puede borrar manualmente. Dichos diseños son propensos a causar problemas incluso con UART de un solo búfer y son completamente inadecuados para los UART que pueden tener un doble búfer.

El enfoque correcto es simplemente habilitar la interrupción de transmisión de datos vacíos cada vez que tenga algo interesante que decir, y deshabilitarla cuando no la tenga. En algunos casos, puede ser útil habilitar una interrupción de transmisión inactiva cuando transmite algo, y hacer que el controlador de interrupción reaccione a la transmisión completa y deshabilite la interrupción. Si bien puede parecer inusual que un controlador de interrupciones deshabilite la interrupción sin "resolver" la causa, es completamente apropiado en los casos en que alguna otra acción en el sistema hará que la interrupción se vuelva a habilitar.