TXE bit no se borrará UART ARM M0

2

Estoy tratando de hacer que UART trabaje en una parte STM32F0 y no puedo resolver 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 la marca TXE clara. 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] != '
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.
') { USART_SendData(EVAL_COM1, TxBuffer[TxCount++]); } //else{ // USART_ITConfig(EVAL_COM1, USART_IT_TXE, DISABLE); //} }

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

    
pregunta spizzak

2 respuestas

2

Cuando USARTx_TDR register está vacío USART_ISR_TXE flag se establece en 1. Cuando USARTx_CR1_TXEIE ( TXE Interrupción habilita el indicador) está habilitada y TXE=1 se interrumpirá.

Por lo tanto, el ejemplo 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, solo escribe el primer byte (borrará TXE ) y habilitará la interrupción.

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

    
respondido por el kwesolowski
1

En lugar de pensar en TXE como una bandera que debe borrarse, se debe pensar que indica que el UART está listo para aceptar datos para su transmisión. El hecho de que no tenga datos para la transmisión de datos no significa que no esté listo.

Algunos microcontroladores como el 8051 tienen una marca que se establece cuando el UART termina de configurar un byte, pero también puede borrarse manualmente. Tales diseños son propensos a causar problemas incluso con UART de búfer único y son completamente inadecuados para los UART que pueden tener 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 deshabilitarlo cuando no lo haga. En algunos casos, puede ser útil habilitar una interrupción de ralentí de transmisión cuando transmite algo, y hacer que el controlador de interrupciones reaccione a la transmisión completada y deshabilite la interrupción. Si bien puede parecer inusual que un controlador de interrupciones deshabilite la interrupción sin "resolver" la causa, es totalmente apropiado en los casos en que alguna otra acción en el sistema haga que la interrupción se vuelva a habilitar.

    
respondido por el supercat

Lea otras preguntas en las etiquetas