stm32 2 uart interrupt overrun hatası

Başlatan ybkahveci, 11 Ocak 2019, 22:27:55

ybkahveci

Merhabalar,
2 adet uart interrupt aktif 1 tanesi 0 priority bir tanesi 1 priority
Uart ile 1 byte olacak şekilde reception yapıyorum toplamda paket boyutu uart1 için 8 - 10 byte Ve uart 2 için 70 byte. Uartların 1 tanesi 115200 de, 1 tanesi 9600 de çalışıyor.

Uart rx complate callback den tüm paketleri alıyorum. Bu fonksiyona girince hangi uarttan geldiğine bakıp ona göre işlem yapıyorum. Sadece 1 uart kullkanırken çok nadir overrun error oluyor. Fakat 2 uart kullanırken 3-5 paket sonrasında overrun hatası veriyor.

Çözüm için denedikerim:
Error callback fonksiyonunda hata flaglarini temizledim, çalışmadı.
Deinit - init yaptım çalışmadı.
Interrupt priority ayarladım çalışmadı.
Bu şekilde 2 adet uart için nasıl bir yol izlememi tavsiye edersiniz?

mylord92

Merhabalar, anladığım kadarıyla HAL kütüphanesini kullanıyorsunuz. Her iki uart içinde paket alımınız bittikten sonra tekrardan HAL_UART_Receive_IT ile iki uart içinde paket alımını zamanında başlatmanız gerekiyor çünkü HAL kütüphanesi paket alımı bittikten sonra interruptları kapatıyor. Zamanında başlatılmadığında anladığım kadarıyla karşı taraf size veri yollamaya devam ediyor ama HAL kütüphanesi gidip data registerlarından bu verileri okumuyor ve overrun hatası oluşuyor.

Bana kalırsa en doğru çözüm HAL ile uğraşmayıp low level(LL) ile her gelen byte için interrupt kurmak ve paketleri kendi kendinize ayrıştırmak.

ybkahveci

Yanıtınız için teşekkür ediyorum,
Evet HAL kütüphanesi kullanıyorum, interrupt içinde gelen byte ı kendi oluşturduğum fifoya aktarıyorum, ve interruptı yeniden kuruyorum, while içinde de fifo dolu ise tek tek içindeki byte ları alıp işliyorum. Yani interrupt byte alındıktan sonra hemen kuruluyor.
Şimdilik çözümü şu şekilde buldum, Uartlardan bilgileri request-response şeklinde alıyordum. requestleri 2şer saniyelik uartlar için özel zamanlarda alıyorum. 2 saniye uart3, 2 saniye uart2 gibi. Ama bu geçici bir çözüm. Şuanda low level programlayamıyorum, malesef HAL kullanmak zorundayım, ileride vaktim olunca low level de kullanmak için araştırma yapmayı düşünüyorum.