KULLANICI BUTONU İLE LEDLERİMİZİN DURUMUNU DEĞİŞTİRİYORUZ !
İlk projemizde bordumuz üzerindeki kırmızı (PG14) ve Yeşil (PG13) ledlerimizi nasıl yakıp söndüreceğimizi öğrenmiştik.
Bu projemizde ise aynı projede yapacağımız değişiklikler ile yine 429I Dısco bordu üzerindeki kullanıcı uygulamaları için ayrılmış mavi renkli butona basıldığında yanmakta olan kırmızı ledimizi söndürüp, sönmüş durumdaki yeşil ledimizi yakan, tekrar buttona basıldığında ise budefa yeşil ledimizi söndürüp kırmızı ledimizi yakan ve sürekli bir döngü içinde çalışan bir uygulama geliştireceğiz.
Bir önceki yazımızda GPIO portlarını nasıl kullanacağımızı uzun uzun anlatmıştım. Bu nedenle tekrar üzerinden uzun uzadıya geçmeyeceğim.
Şimdi uygulamamızı yazmaya başlayalım.
yine aynı kütüphaneleri kullanarak başlıyoruz.
#include "stm32f4xx.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"
int main(void)
{429I Disco bordumuzun kırmızı ve yeşil ledlerini kullanabilmek için AHB1 i hazırlıyoruz
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG,ENABLE);
GPIO port tiplerini kullanabilmek için GPIO_InitDef değişkenimizi GPIO_InitTypeDef tipinde olmak üzere tanımlıyoruz :
GPIO_InitTypeDef GPIO_InitDef;
İlk olarak GPIOG portunun pinlerini düzenliyoruz :
// Pinlerimizi Belirliyoruz
GPIO_InitDef.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
// Pinlerimizi çıkış tipini Push Pull olarak belirliyoruz
GPIO_InitDef.GPIO_OType = GPIO_OType_PP;
// Pinlerimizi çıkış olarak tanımlıyoruz.
GPIO_InitDef.GPIO_Mode = GPIO_Mode_OUT;
// Pinlerimizin çekme direncini ayarlıyoruz.
GPIO_InitDef.GPIO_PuPd = GPIO_PuPd_NOPULL;
// Pinlerimizin çalışma frekanslarını ayarlıyoruz
GPIO_InitDef.GPIO_Speed = GPIO_Speed_2MHz;
//Şimdi GPIOG portumuzu kuralım
GPIO_Init(GPIOG, &GPIO_InitDef);
Şimdi sıra buton tanımlarının yapılmasında;Şimdide 429I Disco bordumuzda bulunan mavi butonu kullanabilmek için AHB1 i hazırlıyoruz
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
GPIO port tiplerini kullanabilmek için GPIO_InitDef değişkenimizi GPIO_InitTypeDef tipinde olmak üzere daha önce tanımlamıştık burada da aynı tanımlamayı kullanabiliyoru, bu nedenle doğrudan GPIOA portunun pin ayarlarını tanımlamaya başlayabiliriz.
// Butonun bulunduğu PA0 pin'ini tanımlıyoruz
GPIO_InitDef.GPIO_Pin = GPIO_Pin_0;
// Pinimizi çıkış tipini Push Pull olarak set ediyoruz
GPIO_InitDef.GPIO_OType = GPIO_OType_PP;
// Buton bir giriş aygıtı olduğu için pinimizi giriş olarak tanımlıyoruz
GPIO_InitDef.GPIO_Mode = GPIO_Mode_IN;
// Çekme direncimizi Pull Down olarak ayarlıyoruz
GPIO_InitDef.GPIO_PuPd = GPIO_PuPd_DOWN;
// Son olarak buton pin hızımızı 2MHz e ayarlıyoruz
GPIO_InitDef.GPIO_Speed = GPIO_Speed_2MHz;
//Şimdi GPIOA portumuzu kuralım
GPIO_Init(GPIOA, &GPIO_InitDef);
Bundan sonra butona basılana kadar bekleyerek, butona her basıldığında led'lerin durumunu değiştirecek olan kodumuzu yazalım.
İlk olarak ledlerimizi ilk çalışma zamanında default değerlerini tanımlıyoruz.
// Kırmızı Led "Düşük", yeşilled ise "Yüksek" durumda olacakGPIO_SetBits(GPIOG, GPIO_Pin_14);
GPIO_ResetBits(GPIOG, GPIO_Pin_13);
// Şimdi Butona basılmasını beklemek için sonsuz deönümüzü kuralım
volatile int i;
while (1)
{
// butona basılıp basılmadığını kontrol edelim
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0))
{
// Buton'a basıldığında bir parazit anı vardır. Bu parazite bouncing denir.
// eğer bu durumu ortandan kadıracak zamanı vermezseniz led lerin kontrolsüzce
// yanıp söndüğünü gözlemlersiniz. Bu sorunu ortadan kaldırmak için yapılan
// işleme debouncing adı verilir butonun bu parazitten kurtulup düğmeye bastığınızı
// algılaması için bir süre beklemeniz ve sonraki işleme bu sürenin sonunda geçmeniz gerekir
// Şimdi Debouncing süresince beklememizi sağlayacak döngümüzü ekliyoruz.
for(i=0;i<300000;i++){
}
// Şimdi de ledlerimizin durumunu değiştirelim
GPIO_ToggleBits(GPIOG, GPIO_Pin_13 | GPIO_Pin_14);
}
}
}
Ve uygulamamızı bitirdik. Şimdi CoIDE'ile derleyerek ST-Link ile bordumuza derlediğimiz kodumuzu atalım.
ve çalıştıralım işte sonuç !















