¿Borrar los indicadores de interrupción de USART (UART) en un STM32?

8

Estoy usando un STM32F105 para comunicarme con un chip GPS Linx usando un UART.

Si no utilizo interrupciones (si solo enciendo el indicador de RX), entonces funciona bien. Pero estoy obteniendo resultados inesperados al intentar usar interrupciones.

Por ejemplo, si solo habilito la interrupción RXNE ("RX not empty") usando USART_ITConfig(USARTx, USART_IT_RXNE) , entonces el código solo debe incluir el ISR para este evento específico. Pero la interrupción también se está activando para una condición de saturación.

En cuanto a borrar las banderas, parece que el método depende de la bandera. Para borrar el indicador de saturación ( USART_IT_ORE ), el Manual del usuario explica que primero debo leer el registro USARTx_SR y luego el registro USARTx_DR . Esto funciona; la bandera está despejada.

También hay un USART_ClearITPendingBit() fuction, pero solo acepta un pequeño subconjunto de indicadores.

Hay ocho fuentes de interrupción diferentes que se pueden habilitar de forma selectiva y diez indicadores diferentes. ¿Hay algún resumen en algún lugar sobre cómo administrar todas estas banderas?

    
pregunta bitsmack

2 respuestas

14

En general, solo necesita manejar los indicadores de interrupción que ha habilitado específicamente con USART_ITConfig() .

Sin embargo, si habilita la interrupción RXNE ( USART_ITConfig(USARTx, USART_IT_RXNE) ), este también habilita la interrupción de saturación. Así que debes manejar ambos.

LasbanderasUSARTpuedenserconfusas.Hayindicadoresdeestadoseparadoseindicadoresdeinterrupciónycompartennombressimilares.Porejemplo:USART_IT_RXNEyUSART_FLAG_RXNE.

Además,hayvariosmétodosparaborrarestasbanderas.Porejemplo,lafunciónUSART_ClearITPendingBit()solofuncionaparacuatro(delasdiez)marcasposibles.

Aquíhayunresumendelosindicadoresdeinterrupciónycómousarlos.EstossonespecíficosparaelSTM32F105,perosonrepresentativos:

USART_IT_TXE-"Registro de datos de transmisión vacío"

  • Se borra automáticamente al llamar a USART_SendData()

USART_IT_RXNE - "El registro de recepción de datos no está vacío"

  • Se borra automáticamente al llamar a USART_ReceiveData(USARTx)

  • Se puede borrar manualmente llamando a USART_ClearITPendingBit(USARTx, USART_IT_RXNE)

USART_IT_TC - "Transmisión completa"

  • Se borra automáticamente por:

    • USART_GetITStatus(USARTx, USART_IT_TC) seguido de
    • USART_SendData()
  • También se puede borrar manualmente llamando a USART_ClearITPendingBit(USARTx, USART_IT_TC)

USART_IT_CTS - "Cambio de CTS"

  • Se borra llamando a USART_ClearITPendingBit(USARTx, USART_IT_CTS)

USART_IT_LBD - "Detectado LIN Break"

  • Se borra llamando a USART_ClearITPendingBit(USARTx, USART_IT_LBD)

USART_IT_PE - "Error de paridad"

  • Despejado por:
    • USART_GetITStatus(USARTx, USART_IT_PE) seguido de
    • USART_ReceiveData(USARTx)

USART_IT_NE - "Error de ruido"

  • Despejado por:
    • USART_GetITStatus(USARTx, USART_IT_NE) seguido de
    • USART_ReceiveData(USARTx)

USART_IT_ORE - "Error de saturación"

  • Despejado por:
    • USART_GetITStatus(USARTx, USART_IT_ORE) seguido de
    • USART_ReceiveData(USARTx)()

USART_IT_IDLE - "Línea inactiva detectada"

  • Despejado por:
    • USART_GetITStatus(USARTx, USART_IT_IDLE) seguido de
    • USART_ReceiveData(USARTx)()
respondido por el bitsmack
2

Solo quiero agregar algo de mi experiencia sobre este problema, Sigo las instrucciones:

USART_IT_ORE - "Error de saturación"

Despejado por: USART_GetITStatus (USARTx, USART_IT_ORE) seguido de USART_ReceiveData (USARTx) ()

Parece que no funciona, y el siguiente comando funciona para mí en su lugar:

USART_GetFlagStatus (USARTx, USART_IT_ORE) seguido de USART_ReceiveData (USARTx)

Si miras las funciones:

USART_GetFlagStatus () y USART_ReceiveData ()

Encontrarás exactamente lo que Bitsmack escribió antes ... "Primero lea el registro USARTx_SR, luego lea el registro USARTx_DR".

Esperemos que te funcione y te ahorre mucho más tiempo en este problema. =)

    
respondido por el LostInCoding

Lea otras preguntas en las etiquetas