STM32F4 Discovery İnterupt Buton ( STM32 CUBE MX / IDE ) ve ATOLİC
Amaç:
buton ile interupt oluşturarak ledleri farklı şekillerle yakılmasıCUBE MX ile yapılışında
12 13 14 15 pinlerindeki ledleri output olarak ayarladık (
led yapmada nasıl yapdılığı gosterildi )
Button olarakta st32f407 discovery ustunde bulunan butonu
kullanıcaz. (A portundaki 0. Pin).
Görselde olduğu gibi external seçicez.
System core -> nvic gelip EXTI line0 interupt tıkını
ekliyoruz.
( buton GPIOA 0 da olduğunu için line0 eğerki GPIOA 2 olsaydı line2 seçilcekti.)
Harici clock devreye alındı.
Clock
conf kısmında 168MHZ alındı
Usb ile haberleşmesi için serial wire dervreye alındı .
zaten otomatik olarak biz seçmesekte bu projede devreye girecekti.
Yükselen kenar tetikleyen ve butonumuz pulldown bağlı
Pulldown seçmezsek kararsız çalışır.
KOD:
Main.c sayfası nı
açıyoruz.
GPIO hal kütüphanelerinden intterupt fonksiyonunu kopylıcaz
ve interupt olunca ne yapmamız gerekirse yazıcaz.
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)// burda
interupt oldugunda yapılacak işlem belirtiliyor
{
count++;
if(count
== 3) count = 0;
}
Benim işlemimde count değişkenini her basıldığında 1
arttırcak ve led fonksiyonlarını çalışırıcak
Led fonksiyonlarım:
void sirali_yakV1()
{
HAL_GPIO_WritePin(GPIOD,
GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_RESET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOD,
GPIO_PIN_12,GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOD,
GPIO_PIN_13,GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOD,
GPIO_PIN_14,GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOD,
GPIO_PIN_15,GPIO_PIN_SET);
HAL_Delay(500);
}
void sirali_yakV2()
{
HAL_GPIO_WritePin(GPIOD,
GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_RESET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOD,
GPIO_PIN_12,GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOD,
GPIO_PIN_12,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,
GPIO_PIN_13,GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOD,
GPIO_PIN_13,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,
GPIO_PIN_14,GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOD,
GPIO_PIN_14,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,
GPIO_PIN_15,GPIO_PIN_SET);
HAL_Delay(500);
}
void blink(){
HAL_GPIO_WritePin(GPIOD,
GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_RESET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOD,
GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_SET);
HAL_Delay(500);
}
Şekilindedir.
İnt main içindeki while donuşunun içine ise aşağıdaki kodu
yazdım. Gerekli count değerinde belirli fonksiyonları çalıştıracak.
while (1)
{
if(count == 0)
blink();
else if(count == 1)
sirali_yakV1();
else if(count == 2)
sirali_yakV2();
}
ATOLİC İLE YAPILIŞI
Atolic ile kendi kodumuzu yazmamız gerekirse şu şekilde
yazmamız gerekmetedir. Yorum satırlarını dikkate alarak ilerleyebilirsiniz.
Nesneleri
tanımladık:
GPIO_InitTypeDef GPIO_InitStruct; // GPIO ayarlamasi yapmamiz için gerekli
// nesne olusturduk ve config de
ayarları yapıcaz
EXTI_InitTypeDef EXTI_InitStruct; // external interupt icin kullanılacak nesne
// config için gerekli
NVIC_InitTypeDef NVIC_InitStruct; // interuptlari yonetmek için kullanılan
nesne
// nesnelerin üstüne
gelerek config için ne yapmamız gerektiğini
gorecegiz
GPIO
ayarları için fonksiyon yazdık
void GPIO_Config()
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,
ENABLE); // kullanılacak
GPIO pinleri AHB1 clock hattına bağlı
// bu sebeble
D protunu aktif ediyoruzz _GPIOD
// ledler
için
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA
,ENABLE); // GPIO A portunda
buton oldup
// buttton
için AHB1 clock GPIOA portunda
// external interupt icin clock hattini aktif
edilmesi gerekir
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,
ENABLE); // external interupt
APB2 clock hattında ve SYSCFG
// SYSCFG portunda||
fonksiyon kaynak kodundan bilgler
// kısaca
external interupt SYSCFG olarak geçiyo
//NVIC interupt yoneticisi islemciye baglı
oldugu icin bir clcok hattı yok
/**
* GPIO pinlerini ayarlanması ...
*
* */
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; // output olduğunu
soluyorum
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12 |GPIO_Pin_13
|GPIO_Pin_14 |GPIO_Pin_15; //pinleri belirledim
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //push pull olarak seçtik
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; // no pull secildi ( pull
up/down )
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz; // max hızda guc tuketiminde etkin rol
GPIO_Init(GPIOD,&GPIO_InitStruct); // bunlari sisteme tanıttık
// D portu oldugundan GPIOD yazdık
// Simdi buton icin kullanıcaz
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; // buton oldugundan input sectik
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; // 0 .
pin
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN; // pull down olarak bağlı
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct); // A portuna yaptıgım ozellikleri aktif
ettik
}
Extarnel interupt için tanımlamaları yapan fonksiyon yazıcaz
void EXTI_Config()
{
/*
* External interupt aktif etmeden
önce External hatlarni aktif etmek gerekir
*
* */
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0); //Extermal
hattı aktif edildi
// A portu olduğunu || 0 . pin olduğunu soledik
// zaten fonksiyon parametrelerine bakarak
yazabiliriz.
// A portunun 0 pinini external kullanıcaz tanıtık
EXTI_InitStruct.EXTI_Line = EXTI_Line0; // Line 0 seçtik çunku 0. pinde kullanıyoruz
// egerki 3. pin kullanılsaydı line3 kullanılcaktı
EXTI_InitStruct.EXTI_LineCmd = ENABLE; // line aktif
ettik
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; // interupt olarak kullanıcağımızdan
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising; // yukselen
kenar secildi
EXTI_Init(&EXTI_InitStruct); // external interupt ı tanımladık
/*
* NVIC confirgasyonu yapılacak
*
* */
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn; // external 0 hattını aktif
ettik
// external interupt ın 0 kanalnı kullanıldı
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE ; // NVIC kanalını aktif ettik
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; // hangisi
oncelik istiyosak değeri daha düşük olmalı
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0 ;
// yukardaki iki parametre oncelik ayarlamak
için kullanıyor birden fazla kesici varsa
kullanılr
NVIC_Init(&NVIC_InitStruct); // NVIC tanımlama yapıldı
}
void delay(uint32_t time)
{
time=168000*time; // mili
sn olması için ve 168MHz çalışıyor
while(time--);
}
Butona
basıldığın da çalışacak fonksiyon
void EXTI0_IRQHandler() // butona basıldığında icindeki fonksiyon
çalısacak
{
if(EXTI_GetITStatus(EXTI_Line0)!= RESET) // interupt bayragı aktif değilse çalışaca
{
GPIO_ResetBits(GPIOD,GPIO_Pin_12
|GPIO_Pin_13 |GPIO_Pin_14 |GPIO_Pin_15);
delay(100);
GPIO_SetBits(GPIOD,
GPIO_Pin_12 |GPIO_Pin_13 |GPIO_Pin_14 |GPIO_Pin_15);
delay(100);
GPIO_ResetBits(GPIOD,GPIO_Pin_12
|GPIO_Pin_13 |GPIO_Pin_14 |GPIO_Pin_15);
delay(100);
GPIO_SetBits(GPIOD,
GPIO_Pin_12 |GPIO_Pin_13 |GPIO_Pin_14 |GPIO_Pin_15);
delay(100);
GPIO_ResetBits(GPIOD,GPIO_Pin_12
|GPIO_Pin_13 |GPIO_Pin_14 |GPIO_Pin_15);
delay(100);
EXTI_ClearITPendingBit(EXTI_Line0); // flagı
indiriyorum
}
}
Main
fonksiyonunda config fonksiyonları çağırıp ledler i set eden bir program
yazıyoruz
int main(void)
{
GPIO_Config(); // kendimiz
yazdigimiz configler çalisicak
EXTI_Config();
while (1)
{
GPIO_SetBits(GPIOD, GPIO_Pin_12 |GPIO_Pin_13
|GPIO_Pin_14 |GPIO_Pin_15);
}
}
Build ve debug ederek kodu
gömebiliriz.
VİDEO:
Yorumlar
Yorum Gönder