Sto usando un STM32F105 per comunicare con un chip Linx GPS usando un UART.
Se non utilizzo gli interrupt (se eseguo semplicemente il polling del flag RX), allora funziona perfettamente. Ma sto ottenendo risultati inaspettati quando provo a usare gli interrupt.
Ad esempio, se abilito solo l'interruzione RXNE ("RX non vuoto") utilizzando USART_ITConfig(USARTx, USART_IT_RXNE)
, il codice dovrebbe essere vettoriale per l'ISR solo per questo evento specifico. Ma anche l'interrupt viene attivato per una condizione di Overrun.
Per quanto riguarda la cancellazione delle bandiere, sembra che il metodo dipenda dalla bandiera. Per cancellare il flag Overrun ( USART_IT_ORE
), il Manuale dell'utente spiega che dovrei prima leggere il USARTx_SR
registro, quindi leggere il USARTx_DR
registro. Questo funziona; la bandiera è cancellata.
C'è anche una USART_ClearITPendingBit()
funzione, ma accetta solo un piccolo sottoinsieme di flag.
Esistono otto diverse origini di interrupt che possono essere abilitate in modo selettivo e dieci flag diversi. C'è un riassunto da qualche parte su come gestire tutte queste bandiere?