Menghapus USART (UART) menginterupsi flag di STM32?

8

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_SRregister terlebih dahulu , kemudian membaca USARTx_DRregister. 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?

bitmack
sumber

Jawaban:

16

Secara umum, Anda hanya perlu menangani flag interrupt yang telah diaktifkan secara khusus USART_ITConfig().

Namun, jika Anda mengaktifkan interupsi RXNE ( USART_ITConfig(USARTx, USART_IT_RXNE)) maka ini juga mengaktifkan interupsi Overrun! Jadi, Anda harus menangani keduanya.

intmap

Bendera USART dapat membingungkan. Ada bendera status terpisah dan bendera interupsi dan mereka berbagi nama yang sama. Misalnya: USART_IT_RXNEdan USART_FLAG_RXNE.

Selain itu, ada berbagai metode untuk menghapus bendera ini. Misalnya, USART_ClearITPendingBit()fungsi hanya berfungsi untuk empat (dari sepuluh) kemungkinan flag.

Berikut ini adalah ringkasan dari flag interrupt dan cara menggunakannya. Ini khusus untuk STM32F105, tetapi representatif:


USART_IT_TXE - " Kirimkan data kosong"

  • Itu dihapus secara otomatis saat memanggil USART_SendData()

USART_IT_RXNE - "Terima register Data tidak kosong"

  • Itu dihapus secara otomatis saat memanggil USART_ReceiveData(USARTx)

  • Itu dapat dihapus secara manual dengan menelepon USART_ClearITPendingBit(USARTx, USART_IT_RXNE)


USART_IT_TC - "Transmisi selesai"

  • Itu dihapus secara otomatis oleh:

    • USART_GetITStatus(USARTx, USART_IT_TC) diikuti oleh
    • USART_SendData()
  • Itu juga dapat dihapus secara manual dengan menelepon USART_ClearITPendingBit(USARTx, USART_IT_TC)


USART_IT_CTS - "Perubahan CTS"

  • Dihapus dengan menelepon USART_ClearITPendingBit(USARTx, USART_IT_CTS)

USART_IT_LBD - "LIN Break terdeteksi"

  • Dihapus dengan menelepon USART_ClearITPendingBit(USARTx, USART_IT_LBD)

USART_IT_PE - "Kesalahan paritas"

  • Dibersihkan oleh:
    • USART_GetITStatus(USARTx, USART_IT_PE) diikuti oleh
    • USART_ReceiveData(USARTx)

USART_IT_NE - "Kesalahan kebisingan"

  • Dibersihkan oleh:
    • USART_GetITStatus(USARTx, USART_IT_NE) diikuti oleh
    • USART_ReceiveData(USARTx)

USART_IT_ORE - "Kesalahan overrun"

  • Dibersihkan oleh:
    • USART_GetITStatus(USARTx, USART_IT_ORE) diikuti oleh
    • USART_ReceiveData(USARTx)()

USART_IT_IDLE - "Idle line terdeteksi"

  • Dibersihkan oleh:
    • USART_GetITStatus(USARTx, USART_IT_IDLE) diikuti oleh
    • USART_ReceiveData(USARTx)()
bitmack
sumber
Yap, saya menjawab pertanyaan saya sendiri :) Jika saya telah menemukan daftar seperti ini sebelumnya, itu akan menghemat banyak waktu. Saya harap ini membantu seseorang!
bitsmack
2
Jawaban ini adalah emas; referensi yang sangat jelas tentang cara menghapus masing-masing interupsi ini.
jjmilburn
2

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. =)

LostInCoding
sumber
Terima kasih atas informasi anda! Saya tidak mengenali USART_GetFlat (). Bisakah Anda memberi tahu saya dari mana asalnya?
bitsmack
Saya minta maaf bahwa saya salah mengetik pada perintah ,, seharusnya USART_GetFlagStatus () diikuti oleh USART_ReceiveData (), pos asli diperbaiki. Terima kasih Bitsmack.
LostInCoding
Luar biasa terima kasih! Sepertinya nama fungsi telah berubah. Apakah Anda menggunakan Perpustakaan Periferal Standar atau salah satu dari STMCube HAL? Untuk keluarga mikrokontroler yang mana?
bitsmack