Saya menggunakan STM32F105 untuk berkomunikasi dengan chip GPS Linx menggunakan UART.
Jika saya tidak menggunakan interupsi (jika saya hanya polling flag RX) maka itu berfungsi dengan baik. Tapi saya mendapatkan hasil yang tidak terduga ketika mencoba menggunakan interupsi.
Misalnya, jika saya hanya mengaktifkan interupsi menggunakan RXNE ("RX not empty") USART_ITConfig(USARTx, USART_IT_RXNE)
, maka kode seharusnya hanya vektor ke ISR untuk acara khusus yang satu ini. Tetapi interupsi dipicu untuk kondisi Overrun juga.
Sejauh membersihkan bendera, tampaknya metode ini tergantung pada bendera. Untuk menghapus flag Overrun ( USART_IT_ORE
), Manual Pengguna menjelaskan bahwa saya harus membaca USARTx_SR
register terlebih dahulu , kemudian membaca USARTx_DR
register. Ini berhasil; bendera dikosongkan.
Ada juga USART_ClearITPendingBit()
fungsi, tetapi hanya menerima sebagian kecil flag.
Ada delapan sumber interupsi berbeda yang dapat diaktifkan secara selektif, dan sepuluh flag berbeda. Apakah ada ringkasan tentang cara mengelola semua bendera ini?
sumber
Hanya ingin menambahkan beberapa pengalaman saya pada masalah ini, saya ikuti petunjuknya:
USART_IT_ORE - "Kesalahan overrun"
Dihapus oleh: USART_GetITStatus (USARTx, USART_IT_ORE) diikuti oleh USART_ReceiveData (USARTx) ()
Tampaknya tidak berfungsi, dan perintah berikut ini bekerja untuk saya sebagai gantinya:
USART_GetFlagStatus (USARTx, USART_IT_ORE) diikuti oleh USART_ReceiveData (USARTx)
Jika Anda melihat fungsi:
USART_GetFlagStatus () dan USART_ReceiveData ()
Anda akan menemukan apa yang sebenarnya ditulis Bitsmack sebelumnya ... "Pertama, baca register USARTx_SR, lalu baca register USARTx_DR."
Semoga ini berhasil untuk Anda dan menghemat lebih banyak waktu untuk masalah ini. =)
sumber