Merhaba,

Önceki uygulamamızda kesme ve kesme mantığının nasıl çalıştığından bahsedip, sonrasında dış (external) kesme ile anlattıklarımızı gerçeklemiştik. Daha önce de paylaşmış olduğumuz gibi belirli kesme kanalları çevresel birimlere bağlı olmakla birlikte, kullandığınız birimi kesmeler ile kontrol edebilmektesiniz. Bu uygulamamızda bir örnek olarak UART kanalını, kesme fonksiyonları ile kullanarak irdeleyeceğiz. UART üzerinden bir veri almak istendiği takdirde programınız standart metotlar kullanıldığında sürekli haberleşme hattında talep ettiğiniz byte kadar verinin olup olmadığını kontrol eder ve eğer veri varsa onları tanımlamış olduğunuz buffer içerisine aktarır. Problem, en basit haliyle dış kesmelerde olduğu gibi, mikroişlemci üzerine yazdığınız diğer komutların polling durumundan etkilenmesi ile karşımıza çıkacaktır. Hassas bir uygulama adına ne yazık ki birbirinden etkilenmemesi gereken süreçler birbirilerini etkilemeye başlayacaktır. Bir diğer önemli problem ise HAL kütüphanesinin UART polling metotları, bir zaman aşımını (timeout) fonksiyonlara parametre olarak girmenizi gerekli tutmasıdır. Örneğin, UART ile haberleşen bir modül/sensör kullanmak istediğinizde eğer sensörün size geri bildirim süresi mutlak bir süreye tekabül etmiyorsa ve tahminen belirlediğiniz zaman aşımı sonunda haberleşme hattına veri düşmediyse bu durum bizler için veri kayıplarıyla sonuçlanabilmektedir. Kullandığınız sensör veri almaya ya da göndermeye ne zaman hazırsa, o zaman haberleşme işlemini gerçekleştirmek daha gürbüz bir çözüm olacaktır.

Konfigürasyonlara başlamadan önce UART uygulamamızı yaparken testlerimiz için kullandığımız seri terminal programı olan Hercules’i ve kullandığınız geliştirme kitinin dokümanında USB portuna hangi UART kanalının bağlı olduğu bilgisini hazırda tutmanız gerekmektedir. Kullandığım STM32F767ZI için UART kanalının USART3 olduğunu geçmiş yazımızdan hatırlayabilirsiniz. Unutmayın ki bu sizler için farklı olabilir. ? Şimdi her zaman olduğu gibi sıradaki adımımız biraz elimizi kirletmek!

Şekil 1: USART3 Konfigürasyonları

USART3 kanalının asenkron modda aktifleştirilmesi ile birlikte “Parameter Settings” sekmesinde bulunan tanımlı ayarlarda şu an için değişiklik yapmamıza gerek olmamaktadır. Ancak dilerseniz “Baud Rate”’i haberleşeceğiniz modülün dokümanında belirtilen hıza ayarlayabilirsiniz. Bilgisayar ve mikroişlemci arasında haberleşeceğimiz için bu parametreleri olduğu gibi bırakabiliriz. Kesmelerin aktifleştirilmesi için Şekil 2’ de gösterilen “NVIC Settings” sekmesine geçerek “USART3 Global Interrupt” parametresini işaretlememiz yeterli olacaktır.

Şekil 2: USART3 Kesmelerinin aktivasyonu

Ardından “Project Manager” sekmesinden programınıza ait konfigürasyonları üreterek devam edebilirsiniz. Keil tarafında ise diğer uygulamalarımızda olduğu gibi “functions” sekmesi altında bulunan UART kütüphanesinin fonksiyonlarını inceleyerek ihtiyacınız olan kesme fonksiyonları hakkında bilgi edinebilirsiniz.

Şekil 3: stm32fxxx_hal_uart.c ve kesme fonksiyonları

Örneğin Şekil 3’ te “_IT” anahtar kelimesi eklenmiş olan iletim fonksiyonunu görebilirsiniz. Yapacağımız uygulamayı temel seviyede tutmak adına bir metni interrupt fonksiyonu ile gönderip, sonrasında interrupt fonksiyonu ile veri alımı gerçekleştirelim. “merhaba!” stringini mikroişlemci üzerinde tutmak için 8 byte uzunluğunda, “receiveBuffer” adında bir dizi tanımlayalım. Kesme kanalını bir kez açmanız mikroişlemcinin o kanal üzerinde gerçekleşebilecek herhangi bir olayı bekleyecek olması demek olduğundan USART haberleşme ile veri alabilmemizi sağlayan HAL_UART_Receive_IT fonksiyonunu sonsuz döngü dışında bir kez çağırmamız yeterli olacaktır (CPU gerçekleşecek olayların farkındalığına sahiptir).

Şekil 4: main fonksiyonu

Uygulamamızı test etmek amacıyla, yazdığımız programı mikroişlemci üzerine gömüp sonrasında “debug” moda (Ctrl+F5) geçiyoruz. “receiveBuffer” değişkenini geçmiş uygularımızda olduğu gibi bir gözlem tablosuna aktararak bilgisayarın haberleşme hattına düşürdüğü verileri kontrol ediyoruz. Son olarak ise Hercules Seri Terminal’inde geliştirme kitimizin bağlı olduğu portu, mikroişlemcinin baud rate’ i ile aynı olacak şekilde ayarlıyoruz. Programı çalıştırdığınız takdirde, eğer her şey yolundaysa Şekil 5 ve 6’ da gösterilen sonuçları elde edeceksiniz.

Şekil 5: Hercules Seri Terminal ekranı. Gelen ve gönderilen mesajlar.
Şekil 6: Gelen mesajın gözlem tablosunda görünümü.

Yazımızı bitirmeden hemen önce, çevresel birimlerin kesme metotlarının da CallBack fonksiyonları olduğundan bahsedelim. Beklenen byte kadar veri geldiğinde görev tamamlanır ve program bir CallBack (HAL_UART_CpltCallBack) fonksiyonuna dallanır. Size bir önerimiz, eğer kaç byte veri geleceğini bilmiyorsanız ya da bu sizin için değişken bir durum ise CallBack metodu kullanarak bu duruma çözüm üretmeye çalışmanız. Cevabı merak edenler için bize yorumlar üzerinden yazarsanız büyük bir mutlulukla yardımcı olacağımızdan şüpheniz olmasın ?.

GitHub üzerinde bulunan uygulama linkini aşağıda sizlerle paylaşmak üzere bırakıyoruz. Bir sonraki yazımızda görüşmek üzere, hoşça kalın! Sorularınız için yorum yapmayı unutmayın… ?

https://github.com/karamelekrobotics/karamelektech_uart_interrupt

Bir Cevap Yazın