STM32 GPIO konusu, mikroişlemciler laboratuvarının başlangıç taşıdır. Çünkü LED yakma, buton okuma, buzzer sürme ve debounce gibi kavramlar öğrenilmeden ADC, PWM ve motor kontrolü gibi daha ileri konular sağlıklı ilerlemez.
Laboratuvar föyünde STM32F407 Discovery kartı ile 8 buton, 8 LED ve 1 buzzer kullanılarak farklı davranışlar istenir. Bu yazıda hem GPIO mantığını anlatıyor hem de o deneyin istenen davranışlarını nasıl organize edeceğini gösteriyoruz.
GPIO nedir?
GPIO, General Purpose Input Output ifadesinin kısaltmasıdır. Bir pinin giriş veya çıkış olarak yazılımla ayarlanabilmesi anlamına gelir. Giriş olarak ayarlanan bir pin buton gibi dış sinyalleri okuyabilir. Çıkış olarak ayarlanan bir pin ise LED, röle veya buzzer gibi elemanları sürmek için kullanılabilir.
Pull-up ve pull-down direnci neden gerekir?
Bir buton bırakıldığında giriş pininin boşa düşmesini istemeyiz. Çünkü boşta kalan pin çevredeki gürültüden etkilenerek rastgele 0 veya 1 okuyabilir. İşte bu yüzden girişler pull-up veya pull-down ile belirli bir seviyeye sabitlenir. Föyde butona basılmadığında lojik 0, basıldığında lojik 1 olacak bağlantı kurgusu önerilir; bu tip durumda genellikle uygun bir direnç ağı kullanılır.
Deneyde kurulan temel donanım
- 8 adet buton ve her biri için uygun direnç
- 8 adet LED ve akım sınırlamak için 220 Ω civarı direnç
- 1 adet buzzer
- STM32F407 Discovery kartı
- Breadboard ve jumper kablolar
Amaç sadece pin bağlamak değil; her butona farklı bir görev atayarak yazılım tarafında olay tabanlı düşünmeyi öğrenmektir.
Debounce neden şart?
Buton mekanik bir elemandır. Basma anında temas yüzeyi birkaç milisaniye boyunca titreşebilir. Bu da yazılımın tek basışı birden fazla basış gibi algılamasına neden olur. Föyde ‘buton arkı oluşmaması için bekleme süresi koyunuz’ denmesinin pratik karşılığı debounce uygulamaktır.
uint8_t button_pressed(GPIO_TypeDef *port, uint16_t pin)
{
if (HAL_GPIO_ReadPin(port, pin) == GPIO_PIN_SET)
{
HAL_Delay(20); // debounce
if (HAL_GPIO_ReadPin(port, pin) == GPIO_PIN_SET)
{
while (HAL_GPIO_ReadPin(port, pin) == GPIO_PIN_SET);
return 1;
}
}
return 0;
}Föyde istenen LED ve buton davranışları nasıl düşünülmeli?
Bu deneyde asıl amaç, her buton için ayrı if-else yazmak değil; davranışları mantıksal gruplara ayırmaktır. İstenen tipik görevler şunlardır:
- Belirli sayıda basış algılandığında sadece tek LED’i yakmak
- LED’leri sırayla ileri doğru doldurmak
- LED’leri ters sırayla doldurmak
- Binary sayma mantığı ile 1’den 255’e kadar LED desenleri üretmek
- Tek numaralı ve çift numaralı LED gruplarını yakmak
- Aynı butona art arda basıldıkça bir sonraki LED’e geçmek
- Buzzer’ı belirli süre öttürmek
Bu görevler aslında üç temel programlama yapısını tekrar ettirir: sayma, durum saklama ve zamanlama. Bu yüzden deney, sadece GPIO değil algoritma kurma pratiği de kazandırır.
State machine yaklaşımı neden işini kolaylaştırır?
Örneğin 7. butonda her basışta aktif LED’in değişmesi isteniyorsa, bunun için sadece bir sayaç tutmak yeterlidir. Her basışta sayaç 1 artar, sonra LED numarası (sayac % 8) mantığıyla belirlenebilir. Aynı şekilde 1. butonda 3 basış isteniyorsa, ayrı bir sayaç tutulur ve 3’e geldiğinde görev tetiklenir.
LED sürerken dikkat edilmesi gerekenler
- LED’leri doğrudan pine bağlama; seri direnç mutlaka kullan.
- Pin akım sınırlarını aşma.
- Aynı anda çok sayıda LED yakıldığında toplam akım tüketimini göz önünde bulundur.
- Tüm pinleri CubeMX/CubeIDE tarafında doğru Input/Output modunda ayarla.
Raporu güçlü gösterecek üç ek dokunuş
- Kullandığın tüm pinleri tablo halinde belirt.
- Breadboard bağlantı şemasını sade ama okunur biçimde çiz.
- Kod içinde her buton davranışını açıklayan yorumlar ekle.
Rapor için kısa sonuç
STM32 GPIO modülü, pinlerin yazılımla giriş veya çıkış olarak yapılandırılmasını sağlar. Buton uygulamalarında kararlı okuma için pull-up/pull-down ve debounce kullanılırken, LED ve buzzer uygulamalarında çıkış pinleri zamanlama ve durum mantığı ile kontrol edilir. Bu deney, temel gömülü sistem programlama alışkanlığını geliştirmek için kritik öneme sahiptir.
Bir sonraki adımda analog veri okumaya geçmek için STM32 ADC, potansiyometre ve LM35 yazısına bakabilirsin.
Bir yanıt yazın