STM32F4 User Button Kullanımı

Bilindiği gibi STM32F4’ün üzerinde User Button (Kullanıcı Butonu) bulunmaktadır. Kartın üzerinde bukunan LED’leri nasıl output olarak kullanabiliyorsak, bu butonu da input olarak kullanabiliyoruz. STM32F4’te projelerimizde kullanmak istersek diye, bu buton ile ilgili bir örnek kod yazıp paylaşmak istedim.

Yazacağımız kodda butona bastığımızda LED Toggle olsun. Yani SET ise RESET, RESET ise SET olsun. Bunun için bir adet GPIO’yu output olarak LED için tanımlamamız lazım. Bir de input için bir adet PIN ataması yapmamız lazım. Ama istediğimiz herhangi bir PIN’e atama yapamayız. Çünkü donanımsal olarak butonun ve LED’leri bağlı bulunduğu PIN’ler belli. Eğer STM32F4 geliştirme kartının üzerindeki buton ve LED’leri kullanmayıp da başka LED ve PIN’ler kullanmak isteseydik o zaman istediğimiz PIN’i kullanabilirdik.

LED için D PORT’unun 12. PIN’inde bulunan LED’i kullanalım.

User Button ise A PORT’unun 0. PIN’inde bulunmaktadır.

Yukarıdaki kodda görülebileceği gibi önce stm32f4xx.h header’ını dahil ettik. Çünkü stm32f4xx Standard Peripheral Library kullandık ve eğer bu header’ı dahil etmezsek, stm32f4xx_conf.h dahil etmemiş oluruz. Bu header dahil olmazsa da Standard Peripheral Library projeye eklenemediği için hata alırız.

STM32F4-Discovery Board’u Keil uVision MDK-ARM ile Kodlama adlı yazımda nasıl proje oluşturulacağını açıklamıştım. Burada gelecek projelerimizde kullanmak amacıyla LEDToggle isimli bir proje oluşturmuştuk. Bu projeyi kopyaladım ve yine aynı klasöre yapıştırdım. LedToggle – Kopya isimli oluşan yeni dosyanın ismini UserButtonLEDToggle olarak değiştirdim. UserButtonLEDToggle > Project > Project.uvproj dosyasını açalım. Keil uVision derleyicisi açıldığında Project sekmesinde LEDToggle ismini üzerine tıklayıp F2’ye basarak UserButtonLEDToggle olarak değiştirelim. Burada bize gerekli olan StdPeriph_Library source kodları eklenmişti. “main.c” kodunu yukarıda yazdığım kod ile değiştirirsek hiç bir problem çıkmaması gerekir. Tekrar Build edelim. Sonrasında önceden göstermiş olduğum gibi kodu kartımıza yükleyelim.

Önce LED için GPIO’yu output olarak ayarlamak için D PORT’una güç verdik. Sonra User Button için GPIO’yu output olarak ayarlamak için A PORT’unagüç verdik. Sonrasında ayarlamaları yaptık. Aşağıda görüldüğü gibi,

while(1) { } kod bloğunun içine yazdığımız kodlar eğer bir interrupt ya da hata oluşmazsa sonsuza kadar devam eder. Bu döngüye infinite loop (sonsuz döngü) denir.

Yukarıdaki kod bloğunda A PORT’unun 0.PIN’inin değerini yani User Button’un değerini okuyoruz. Eğer butona basılmazsa bu bloğun içinde kal anlamına gelir. Eğer butona basılırsa bu blokta çıkılır ve sonraki satır yani

execute edilir. Bu kod ile LED’i toggle edilir. Ardından kısa bir sürelik delay(bekleme) koydum. Bunun sebebi kod çok hızlı çalıştığı için elimizi butona basıp çektiğimizde işlemcinin hızına yetişemediğimiz için bazen bulunduğu hali korumasıydı. Delay ile bunu birazcık olsun engellemiş olduk. Fakat arada bir de olsa bu sıkıntıyla karşılaşabiliyoruz.

Bu kod küçük uygulamalar için faydalı olabilir ama sonsuz döngünün içine başka bir döngü koymamız kodlama mantığına çok ters çünkü program o kısımda aslında boşa çalışıyor. Bu tür kodların interrupt mantığıyla yazılmasında fayda vardır. Bu yazıyı yazmamın sebebi GPIO mantığının daha iyi anlaşılmasıdır. User Button’u interrup kullanarak LED Toggle etme kodunu ilerideki zamanlarda paylaşmayı düşünüyorum.

Herkese iyi çalışmalar dilerim. İyi akşamlar…

Leave a Comment

%d bloggers like this: