Estou usando um STM32F105 para me comunicar com um chip GPS Linx usando um UART.
Se eu não usar interrupções (se eu apenas pesquisar o sinalizador RX), ele funcionará perfeitamente. Mas estou obtendo resultados inesperados ao tentar usar interrupções.
Por exemplo, se eu habilitar apenas a interrupção do RXNE ("O RX não está vazio") usando USART_ITConfig(USARTx, USART_IT_RXNE)
, o código deverá ser vetorizado apenas para o ISR para esse evento específico. Mas a interrupção também está sendo acionada para uma condição de superação.
Tanto quanto limpar as bandeiras, parece que o método depende da bandeira. Para limpar o sinalizador Overrun ( USART_IT_ORE
), o Manual do Usuário explica que eu deveria primeiro ler o USARTx_SR
registro e, em seguida, ler o USARTx_DR
registro. Isso funciona; a bandeira está limpa.
Há também uma USART_ClearITPendingBit()
função, mas ela aceita apenas um pequeno subconjunto de sinalizadores.
Existem oito fontes de interrupção diferentes que podem ser ativadas seletivamente e dez sinalizadores diferentes. Existe um resumo em algum lugar de como gerenciar todos esses sinalizadores?
fonte
Só quero adicionar um pouco da minha experiência com esse problema, sigo as instruções:
USART_IT_ORE - "Erro de saturação"
Desmarcado por: USART_GetITStatus (USARTx, USART_IT_ORE) seguido por USART_ReceiveData (USARTx) ()
Parece não funcionar, e o seguinte comando funciona para mim:
USART_GetFlagStatus (USARTx, USART_IT_ORE) seguido por USART_ReceiveData (USARTx)
Se você olhar para as funções:
USART_GetFlagStatus () e USART_ReceiveData ()
Você encontrará o que exatamente o Bitsmack escreveu antes ... "Primeiro leia o registro USARTx_SR e, em seguida, leia o registro USARTx_DR."
Espero que funcione para você e economize muito mais tempo com esse problema. =)
fonte