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
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 ?
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.
#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.
}
}
}
Eyvallah hocam teşekkürler.
Hocam aynı kodları yazıyorum fakat yine yukarıda yazdığım sorun oluyor.
Proje dosyalarını paylaştım onları denedin mi?
Diğer led örneklerini denedin mi? Butonunda fiziksel bir sorun olmasın?
Hocam 2. projeyi indirdim çalıştı teşekkür ederim.Button sağlammış 😀
Hocam tekrardan merhaba.Hocam kare dalga saydırmam gerekiyor elimde algoritmam var ama koda dökemiyorum yardımcı olabilir misiniz ?
Burada yardım zor olur. Ne yaptığını, nerede takıldığını anlatan bir mail atarsan uygun bir zamanımda geri dönerim.