Estoy usando un STM32F105 para comunicarme con un chip GPS Linx usando un UART.
Si no uso interrupciones (si solo sondeo el indicador RX), entonces funciona bien. Pero obtengo resultados inesperados cuando trato de usar interrupciones.
Por ejemplo, si solo habilito el uso de la interrupción RXNE ("RX no está vacío") USART_ITConfig(USARTx, USART_IT_RXNE)
, el código solo debería vectorizar al ISR para este evento específico. Pero la interrupción también se activa por una condición de Desbordamiento.
En cuanto a borrar las banderas, parece que el método depende de la bandera. Para borrar la bandera de Desbordamiento ( USART_IT_ORE
), el Manual del usuario explica que primero debería leer el USARTx_SR
registro y luego leer el USARTx_DR
registro. Esto funciona La bandera se borra.
También hay una USART_ClearITPendingBit()
función, pero solo acepta un pequeño subconjunto de banderas.
Hay ocho fuentes de interrupción diferentes que se pueden habilitar selectivamente y diez banderas diferentes. ¿Hay algún resumen en alguna parte sobre cómo administrar todas estas banderas?
fuente
Solo quiero agregar algo de mi experiencia en este problema, sigo las instrucciones:
USART_IT_ORE - "Error de desbordamiento"
Autorizado por: USART_GetITStatus (USARTx, USART_IT_ORE) seguido de USART_ReceiveData (USARTx) ()
Parece que no funciona, y el siguiente comando funciona para mí:
USART_GetFlagStatus (USARTx, USART_IT_ORE) seguido de USART_ReceiveData (USARTx)
Si nos fijamos en las funciones:
USART_GetFlagStatus () y USART_ReceiveData ()
Encontrará exactamente lo que Bitsmack escribió antes ... "Primero lea el registro USARTx_SR, luego lea el registro USARTx_DR".
Espero que funcione para usted y ahorre mucho más tiempo en este tema. =)
fuente