J'utilise un STM32F105 pour communiquer avec une puce GPS Linx à l'aide d'un UART.
Si je n'utilise pas d'interruptions (si j'interroge simplement l'indicateur RX), cela fonctionne très bien. Mais j'obtiens des résultats inattendus lorsque j'essaie d'utiliser des interruptions.
Par exemple, si j'active uniquement l'interruption RXNE ("RX not empty") à l'aide USART_ITConfig(USARTx, USART_IT_RXNE)
, le code ne doit être vecteur que vers l'ISR pour cet événement spécifique. Mais l'interruption est également déclenchée pour une condition de dépassement.
En ce qui concerne la suppression des drapeaux, il semble que la méthode dépende du drapeau. Pour effacer l'indicateur de dépassement ( USART_IT_ORE
), le manuel de l'utilisateur explique que je devrais d'abord lire le USARTx_SR
registre, puis lire le USARTx_DR
registre. Cela fonctionne; le drapeau est effacé.
Il existe également une USART_ClearITPendingBit()
fonction, mais elle n'accepte qu'un petit sous-ensemble de drapeaux.
Il existe huit sources d'interruption différentes qui peuvent être activées de manière sélective et dix drapeaux différents. Y a-t-il un résumé quelque part de la façon de gérer tous ces indicateurs?
la source
Je veux juste ajouter mon expérience sur ce problème, je suis les instructions:
USART_IT_ORE - "Erreur de dépassement"
Effacé par: USART_GetITStatus (USARTx, USART_IT_ORE) suivi de USART_ReceiveData (USARTx) ()
Cela ne semble pas fonctionner, et la commande suivante fonctionne pour moi à la place:
USART_GetFlagStatus (USARTx, USART_IT_ORE) suivi de USART_ReceiveData (USARTx)
Si vous regardez les fonctions:
USART_GetFlagStatus () et USART_ReceiveData ()
Vous trouverez ce qu'écrivait exactement Bitsmack avant ... "Lisez d'abord le registre USARTx_SR, puis lisez le registre USARTx_DR."
J'espère que cela fonctionnera pour vous et vous fera gagner beaucoup plus de temps sur ce problème. =)
la source