Solución:
Generalmente, 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)
) luego esto además habilita la interrupción Overrun! Entonces debes manejar ambos.
Las banderas de USART pueden ser confusas. Hay banderas de estado e interrupciones independientes y comparten nombres similares. Por ejemplo: USART_IT_RXNE
y USART_FLAG_RXNE
.
Además, existen varios métodos para borrar estas banderas. Por ejemplo, el USART_ClearITPendingBit()
La función solo funciona para cuatro (de los diez) indicadores posibles.
Aquí hay un resumen de los indicadores de interrupción y cómo usarlos. Estos son específicos para el STM32F105, pero son representativos:
USART_IT_TXE – “Registro de datos de transmisión vacío”
- Se borra automáticamente al llamar
USART_SendData()
USART_IT_RXNE – “El registro de datos de recepción no está vacío”
-
Se borra automáticamente al llamar
USART_ReceiveData(USARTx)
-
Se puede borrar manualmente llamando
USART_ClearITPendingBit(USARTx, USART_IT_RXNE)
USART_IT_TC – “Transmisión completa”
-
Se borra automáticamente mediante:
-
USART_GetITStatus(USARTx, USART_IT_TC)
seguido por USART_SendData()
-
-
También se puede borrar manualmente llamando
USART_ClearITPendingBit(USARTx, USART_IT_TC)
USART_IT_CTS – “Cambio de CTS”
- Borrado llamando
USART_ClearITPendingBit(USARTx, USART_IT_CTS)
USART_IT_LBD – “LIN Break detectado”
- Borrado llamando
USART_ClearITPendingBit(USARTx, USART_IT_LBD)
USART_IT_PE – “Error de paridad”
- Autorizado por:
-
USART_GetITStatus(USARTx, USART_IT_PE)
seguido por USART_ReceiveData(USARTx)
-
USART_IT_NE – “Error de ruido”
- Autorizado por:
-
USART_GetITStatus(USARTx, USART_IT_NE)
seguido por USART_ReceiveData(USARTx)
-
USART_IT_ORE – “Error de desbordamiento”
- Autorizado por:
-
USART_GetITStatus(USARTx, USART_IT_ORE)
seguido por USART_ReceiveData(USARTx)()
-
USART_IT_IDLE – “Línea inactiva detectada”
- Autorizado por:
-
USART_GetITStatus(USARTx, USART_IT_IDLE)
seguido por USART_ReceiveData(USARTx)()
-
Solo quiero agregar algo de mi experiencia sobre este problema, sigo las instrucciones:
USART_IT_ORE – “Error de desbordamiento”
Borrado 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 observa las funciones:
USART_GetFlagStatus () y USART_ReceiveData ()
Encontrará lo que escribió exactamente Bitsmack antes … “Primero lea el registro USARTx_SR, luego lea el registro USARTx_DR”.
Esperamos que funcione para usted y ahorre mucho más tiempo en este tema. =)