STM32 HAL Kütüphanesi ve CubeMX ile Kesme Kullanımı

STM32 mikrodenetleyicilerde iç ve dış kesme olmak üzere iki ayrı kesme bulunmaktadır. Bu kesmeler NVIC adı verilen Cortex çekirdeğindeki kesme denetimcisi tarafından denetlenir. HAL kütüphanesi kullanırken kesmeleri kolayca ayarlayabilir ve kesme fonksiyonlarının içerisine programımızı yazabiliriz. Bunun için CubeMX programı ile ön ayar yapmak işimizi oldukça kolaylaştıracaktır. Öncelikle size iç ve dış kesme ayarlarının CubeMX programı ile nasıl yapıldığını sonra ise bu kesme fonksiyonlarına nasıl kod yazıldığını sizlere gösterelim.

Sisteme ait kesmeleri kullanmak için System Core sekmesinden NVIC kısmını seçiyoruz. Karşımıza hangi kesmenin etkin hangi kesmenin devre dışı olacağına dair bir tablo çıkmaktadır. Bu tablo üzerinden kutucuğu işaretleyerek ilgili kesmeyi etkin hale getirebiliriz. Dış kesmelerde ise öncelikle bir giriş ve çıkış ayağını seçmemiz ve ilgili ayarı yapmamız gereklidir.

Buradan giriş ve çıkış ayağına tıklayıp GPIO_EXTI seçeneğini seçmemiz gereklidir. Böylelikle dış kesme modunda ayağı tanımlamış oluruz. Yalnız ayarlardan dış kesmeyi etkinleştirmemiz gereklidir. Bunu da şöyle yapmaktayız.

Burada ilgili ayağın dış kesme özelliği NVIC biriminde etkinleştirilmiş olur. Şimdi projemizi üretebiliriz ve projemizi üretip ilgili kesme fonksiyonlarına göz atalım.

Kesme fonksiyonları için TrueStudio projesinde özel bir dosya oluşturulmaktadır. Ben STM32F3 Discovery kartı için oluşturduğum projede stm32f3xx_it.c dosyasını görmekteyim. IT ifadesinin açılımının Interrupt olduğunu tahmin edebilirsiniz. Şimdi bu dosyanın içeriğinin bir kısmına bakalım.

Burada etkinleştirilen kesmeler için boş fonksiyonlar yer almaktadır. HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0) fonksiyonu HAL kütüphanesine ait bir fonksiyondur. Burada yaptığımız her kesme yürütüldüğünde LD4_Pin ayağının açılıp kapatılmasıdır. Diğer kesme fonksiyonlarının içine de programımızı yazabiliriz. Kesmeler geliştiriciye bırakıldığından kesme fonksiyonlarının içi boş halde bize gelmektedir. Düğmenin yer aldığı A0 ayağını kesme ayağı olarak CubeMX programında ayarlamıştık. GPIO sürücüsü kullanılarak yapılan bu ayarlamanın kodu şu şekildedir.

Görüldüğü gibi sadece mod kısmında bir değişiklik mevcuttur. Düğme pull-up devresine bağlı olduğu için biz düşen kenarda kesmeye götürdük. Bunun için GPIO_MODE_IT_FALLING sabit değerini kullandık. Eğer istenirse GPIO_MODE_IT_RISING değeri ile bunu yükselen kenarda yapabiliriz. Bu bizim yapacağımız projeye göre değişiklik göstermektedir.

Programda yaptığımız bir ayar da dış kesme özelliğini NVIC birimine bildirmek oldu. Bunu programda kutucuğu işaretleyerek yapsak da aslında üretilen kod şu şekildedir.

Burada NVIC adında ayrı bir sürücü olmayıp kesmelerle ilgili fonksiyonlar başka sürücülerin içerisinde dağılmıştır. HAL kütüphanesinin kesmeler için ayrı bir sürücüsünün olmayışı başta kafamızı karıştırabilir. Ama Cortex başlıklı sistemle fonksiyonlarının yürütüldüğü sürücüye bakarsak bunu görebiliriz. Burada HAL_NVIC_SetPriority() fonksiyonu ile kesme önceliği belirlenmiş ve HAL_NVIC_EnableIRQ () fonksiyonu ile ilgili kesme etkinleştirilmiştir. Bizim etkinleştirebileceğimiz kesmelerin bir kısmı kaynak kodunda şu şekilde verilmiştir.

 

Kesmelerin kullanımı basit olduğundan buraya kadar anlattıklarımız sizin işinizi görecektir. Bir eğitim içeriğinin eksik olmasını hiç tasvip etmesem de konumuz STM32 olduğunda eksiksiz bir içerik hazırlamamız mümkün olmamaktadır. O yüzden benim yararlandığım datasheet ve kılavuz dokümanlarına bakabilirsiniz. Kesme konusunu burada bitirdik ve yeni konuya geçmeye hazırız.

Bizi Facebook grubumuzda takip etmeyi unutmayın. Bilgili ve öğrenmeye hevesli bir topluluk oluşturmak istiyoruz.

https://www.facebook.com/groups/1233336523490761/

UYARI!!

 

Gökhan Dökmetaş

"Arduino Eğitim Kitabı" ve "Arduino ve Raspberry PI ile Nesnelerin İnterneti" kitaplarının yazarı. Başkent Teknoloji ve Dedektör Merkezi'nde Ar-ge Sorumlusu. Araştırmacı-Yazar.

You may also like...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.