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

Bu blogdaki popüler yayınlar

Analog PID ile Encoderlı Motorun Hız Kontrolu