COIDE İLE NUCLEO-F401RE PROGRAMLAMA – Buton Okuma

Bu uygulamamızda NUCLEO kitimizde bulunan mavi renkli kullanıcı butonu ile ledimizi yakıp söndüreceğiz.


#include "stm32f4xx.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"

int main(void)
{
/* GPIO init */
// LED PIN AYARI
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // A portunun saat darbesini aktifleştidik.

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; // 5 numaralı pin için ayarlıyoruz.
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // Pin çıkış tipini ayarladık.
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // Pinimizi output olarak ayarladık.
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // Pull Up direncini pasif yaptık.
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // Pinin maksimum çalışma frekansını ayarladık.
GPIO_Init(GPIOA, &GPIO_InitStructure); // Ayarları uyguluyoruz.
// BUTON PIN AYARI
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); // C portunun saat darbesini aktifleştidik.

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; // 13 numaralı pin için ayarlıyoruz.
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // Pin çıkış tipini ayarladık.
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // Pinimizi input olarak ayarladık.
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // Pull Up direncini pasif yaptık.
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // Pinin maksimum çalışma frekansını ayarladık.
GPIO_Init(GPIOC, &GPIO_InitStructure); // Ayarları uyguluyoruz.

while(1)
{
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 0) // Buton basılı ise
{
GPIO_SetBits(GPIOA, GPIO_Pin_5); // Ledi yak.
}
else // Buton basılı değil ise
{
GPIO_ResetBits(GPIOA, GPIO_Pin_5); // Ledi söndür.
}
}
}

Önceki uygulamamızda olduğu gibi ilk önce ledimizin ve butonumuzun bağlı olduğu pinlerin ayarlarını yaptık. Butonu okuyarak basılı olup olmadığını karşılaştırdık. Bu durumda buton basılı ise led yanacak, basılı değilse sönecektir.

Şimdi kodumuzu butona her basışımızda ledi tersleyecek şekilde düzenleyelim.


while(1)
{
while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 0) // Butonu okuduk.
{
GPIO_ToggleBits(GPIOA, GPIO_Pin_5); // Buton basıldı ise ledi tersliyoruz.
}
}

Sizinde fark etiğiniz gibi buton ile ledi yakmak yada söndürmek çok kolay olmuyor. Ufak bir değişiklikle daha stabil çalışan bir kod elde edebiliriz.


while(1)
{
while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 0) // Butonu okuduk.
{
while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 0); // Buton bırakılana kadar bekle.
GPIO_ToggleBits(GPIOA, GPIO_Pin_5); // Buton basıldı ise ledi tersliyoruz.
}
}

Butona basıldığında değilde bırakıldığında işlem yaparak daha stabil bir kod elde ettik.

Proje dosyasını linkten indirebilirsiniz. –>coide_buton_uygulamasi_1

Proje dosyasını linkten indirebilirsiniz. –>coide_buton_uygulamasi_2

Etiket(ler): , , , , , .Yer işareti koy Kalıcı Bağlantı.

COIDE İLE NUCLEO-F401RE PROGRAMLAMA – Buton Okuma için 9 cevap

  1. FIRAT SERCAN ŞAHİN diyorki:

    Hocam merhaba öncelikle.Yukarıdaki kodları uyguluyorum debug ettiğimde led sürekli yanık kalıyor.Butona basmama gerek kalmadan yanıyor.Nedenini öğrenebilir miyim acaba ?

    • mesut diyorki:

      Kodunu görmeden bir şey diyemem. Bir yerlerde hata yapmış olabilirsin. Şimdi tekrar denedim öyle bir sorunla karşılaşmadım.
      Dosyaları hazırlıyorum. Bütün sayfalara projeleri ekleyeceğim. Birde onlarla denersin.

      • FIRAT SERCAN ŞAHİN diyorki:

        #include “stm32f4xx.h”
        #include “stm32f4xx_gpio.h”
        #include “stm32f4xx_rcc.h”

        int main(void)
        {
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
        GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);

        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);

        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
        GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOC,&GPIO_InitStructure);

        while(1)
        {
        if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 0) // Buton basılı ise
        {
        GPIO_SetBits(GPIOA, GPIO_Pin_5); // Ledi yak.
        }
        else // Buton basılı değil ise
        {
        GPIO_ResetBits(GPIOA, GPIO_Pin_5); // Ledi söndür.
        }
        }
        }

  2. FIRAT SERCAN ŞAHİN diyorki:

    Eyvallah hocam teşekkürler.

  3. FIRAT SERCAN ŞAHİN diyorki:

    Hocam aynı kodları yazıyorum fakat yine yukarıda yazdığım sorun oluyor.

    • mesut diyorki:

      Proje dosyalarını paylaştım onları denedin mi?
      Diğer led örneklerini denedin mi? Butonunda fiziksel bir sorun olmasın?

  4. FIRAT SERCAN ŞAHİN diyorki:

    Hocam 2. projeyi indirdim çalıştı teşekkür ederim.Button sağlammış 😀

  5. FIRAT SERCAN ŞAHİN diyorki:

    Hocam tekrardan merhaba.Hocam kare dalga saydırmam gerekiyor elimde algoritmam var ama koda dökemiyorum yardımcı olabilir misiniz ?

    • mesut diyorki:

      Burada yardım zor olur. Ne yaptığını, nerede takıldığını anlatan bir mail atarsan uygun bir zamanımda geri dönerim.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir