Son Yazılar

STM32 ile External Interrupt Kullanımı






Kesme (interrupt), mikrodenetleyicinin normal çalışmasını geçici olarak durdurup, acil bir işlemi gerçekleştirmek üzere belirli bir fonksiyona yönlenmesini sağlayan bir mekanizmadır. Kesme gerçekleştiğinde, mikrodenetleyici o anda yapmakta olduğu işlemi durdurur ve kesmeye bağlı olarak atanmış bir kesme işleyicisini (ISR - Interrupt Service Routine) çalıştırır. Kesme işleyicisi tamamlandığında, mikrodenetleyici durduğu yerden çalışmasına devam eder.


External Interrupt (Harici Kesme) Nedir?

Harici kesme (external interrupt), mikrodenetleyicinin dış dünyadan gelen bir sinyale (örneğin, bir butona basma) tepki vermesini sağlar. Bu sinyal, mikrodenetleyicinin belirli bir GPIO (Genel Amaçlı Giriş/Çıkış) pini üzerinden alınır ve bir kesme tetiklenir. Bu tür kesmeler, mikrodenetleyicinin belirli olaylara hızla tepki vermesine olanak tanır ve enerji verimliliğini artırabilir, çünkü mikrodenetleyici sürekli olarak butonun durumunu kontrol etmek yerine kesme sinyali aldığında bu durumu işler.


STM32'de External Interrupt Nasıl Kullanılır?

STM32 mikrodenetleyicilerinde harici kesme kullanımı, EXTI (External Interrupt/Event Controller) birimi tarafından yönetilir. EXTI, belirli bir GPIO pininde meydana gelen değişiklikleri (yükselen kenar, düşen kenar veya her iki kenar) izler ve bir kesme oluşturur. Bu kesme, NVIC (Nested Vector Interrupt Controller) tarafından işlenir ve ilgili ISR fonksiyonu çağrılır.


Bu uygulamada, STM32F407 Discovery kartı üzerinde sürekli yanan bir LED'in yanı sıra, butona basıldığında bir diğer LED'in yanmasını ve butona her basıldığında LED'in yanıp sönme süresinin artmasını sağlayacağız.


Gerekli Donanım

-STM32F407 Discovery Kartı

-USB Programlama Kablosu

-STM32CubeIDE


Proje Adımları

1. STM32CubeIDE ile Proje Oluşturma

STM32CubeIDE'yi açın ve yeni bir STM32 projesi oluşturun. Kart olarak "STM32F407 Discovery" seçin ve projeyi başlatın.


2. System Core Ayarları

İlk olarak, sistem çekirdeği ayarlarını yapılandırmamız gerekiyor:

System Core -> RCC -> High Speed Clock: Bu seçeneği "Crystal/Ceramic Resonator" olarak ayarlayın. Bu, harici osilatörün kullanılmasını sağlar.

SYS -> Debug -> Serial Wire: Bu seçeneği etkinleştirerek, seri kablo üzerinden hata ayıklama yapmamıza olanak tanır.


3. GPIO Ayarları

Kart üzerindeki LED'leri ve butonu ayarlamak için GPIO yapılandırmalarını yapmamız gerekiyor:

-PD12 ve PD13 pinlerini, STM32F407 Discovery kartı üzerindeki LED'leri kontrol etmek için "GPIO_Output" olarak ayarlayın.

-PA0 WKUP GPIO_EXTI Olarak Ayarlanması:

PA0 pinini "GPIO_EXTI" (harici kesme) olarak yapılandırın ve "interrupt" etiketiyle adlandırın.


4. GPIO Konfigürasyonu

GPIO -> PA0 -> Mode: PA0 pininin modunu "External Interrupt Mode with Rising/Falling Edge" olarak ayarlayın. Bu, butonun hem basılma hem de bırakılma durumlarını algılamamızı sağlar.

Pull Up/Pull Down Ayarları: PA0 pininin "Pull-down" olarak ayarlanmasını sağlayın. Bu, pinin varsayılan durumunun düşük (low) olmasını ve butona basıldığında yüksek (high) olmasını sağlar.


5. NVIC Ayarları

Son olarak, NVIC (Nested Vector Interrupt Controller) ayarlarını yapmamız gerekiyor:

NVIC -> EXTI Line0: "EXTI Line0" kesmesini etkinleştirin. Bu, PA0 pininde bir kesme oluştuğunda kesmenin doğru şekilde işlenmesini sağlar.


Kullanılan Kodlar

Aşağıda, projemizde kullanılan temel kod parçacıklarını bulabilirsiniz. Bu kodlar, STM32F407 Discovery kartı üzerinde LED'lerin nasıl kontrol edildiğini ve kesme işlemlerinin nasıl yönetildiğini göstermektedir.


Global Değişken Tanımı:

/* USER CODE BEGIN PV */
uint16_t counter=10;  // LED'in yanıp sönme süresini kontrol eden sayaç
/* USER CODE END PV */


Ana Döngü

Bu döngü, LED'in sürekli yanıp sönmesini sağlar ve sayaç değerine göre yanıp sönme süresi değişir.

while (1)
{
    HAL_GPIO_TogglePin(led_main_GPIO_Port,led_main_Pin);  // LED'i sürekli yakıp söndürür
    HAL_Delay(counter);  // Sayaç değerine göre bekleme süresi
}


Kesme İşleyicisi

Bu fonksiyon, butona her basıldığında tetiklenir. Eğer butona basılmışsa, ikinci LED yanar. Aynı zamanda, sayaç değeri artırılır, böylece ilk LED'in yanıp sönme süresi uzar.

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if (HAL_GPIO_ReadPin(interrupt_GPIO_Port, interrupt_Pin))
    {
        HAL_GPIO_WritePin(led_GPIO_Port, led_Pin, GPIO_PIN_SET);  // Butona basıldığında LED'i yakar
    }
    else
    {
        HAL_GPIO_WritePin(led_GPIO_Port, led_Pin, GPIO_PIN_RESET);  // Buton bırakıldığında LED'i söndürür
    }
    counter += 5;  // Sayaç değerini artırarak LED'in yanıp sönme süresini uzatır
}



Hiç yorum yok