Merhabalar,
Bu makalemdeki uygulamayı takip ettiğinizde STM32F4 serisi MCU’nuzda EXTI (Harici Kesme- Interrupt) kullanımını öğrenebilirsiniz.
Bu makaleden önce
CUBEMX – STM32F429 İLE GPIO KONTROLÜ (LED YAKIP SÖNDÜRME)
STM32F429 İLE GPIO – BUTON KONTROLÜ (DİJİTAL GİRİŞ)
Bu iki makaleyi okursanız, bu uygulamayı daha rahat yapabilirsiniz 🙂
Öncelikle Harici kesme (External Interrupt) kavramı hakkında biraz bahsetmek istiyorum.. Ön bilgi veya hatırlatma olması açısından 🙂
Kesme işlemini günlük hayattan bir örnek vererek açıklayalım: Diyelim ki televizyonda sevdiğiniz bir
artistin filmini izliyorsunuz ve bu anda telefon çaldı. Ne yaparsınız? İlk olarak
konsantrasyonunuz bozulur ve ne yapacağınıza karar verirsiniz. Eğer önemli bir telefon
bekliyorsanız, televizyonun sesini keser, video player’in record butonuna basarak filmi
kaydedersiniz. Telefon konuşması bittikten sonra da kaydettiğiniz filmi izlemeye başlarsınız.
Eğer önemli bir telefon beklemiyorsanız kararınız bu defa telefona cevap vermeyerek arayanın
telesekretere mesaj bırakması yönünde olur ve filmi izlemeye devam edersiniz.
Aynı işlem MCU’larda da donanımsal olarak gerçekleşir. Her MCU’nun bir veya birden çok Harici Kesme pini bulunur. Siz bu pine beklenilen sinyal darbesini uyguladığınızda, MCU main fonksiyonu altında yaptığı işlemi hemen bırakarak, Kesme Alt Programına (Interrupt Service Routine) yönlenir. Kesmede tanımlanan işlemleri yapar ve yeniden kesme gelmezse main’e geri dönerek kaldığı yerden devam eder 🙂
Hayati önceliği olan sinyalleri kavramak için interrupt kullanılır. Örneğin çok hızlı gelen bir pulse’in sayılması veya herhangi bir gecikme yaşanmadan gelen bir sinyalle başka bir işleme yönlenilmesi gereken durumlarda 🙂
Entegremizde kaç tane EXTI pini olduğu ve birkaç özellikten daha bahsedecektim aslında ama daha fazla teoriye girmek yerine uygulamamızın nasıl yapıldığını anlatacağım. Detaylı bilgi almak isteyenler sanırım zaten datasheet’i inceleyerek öğrenirler 🙂
Şimdi CubeMX’imizi açarak uygulamamıza başlıyoruz 🙂
1) İşlemci seçimini yaptıktan sonra PA2 pini üzerinden EXTI2(Interrupt2) özelliğini aktif ediyoruz.
2) EXTI özelliğinin kullanımını basitçe kavramanız için yapmanızı istediğim uygulama;
Kesme gelmediğinde PG13’e bağlı LED’in yanıp sönmesi,
Kesme geldiğinde ise PG14’e bağlı LED’in yanıp sönmesi.
Bu sebeple CubeMX üzerinden bu 2 pini(PG13 ve PG14) GPIO_Output olarak ayarlamayı UNUTMAYIN!.
3) Şimdi CubeMX üzerinden “Configuration” sekmesine girin. Buradan Interrupt ile ilgili küçük bir ayar yapacağız.
Karşınıza gelen ekranda System’in altında NVICe tıklayın.EXTI2 Interrupt’ı check edin. OK’ a basarak çıkın. Resimden görebilirsiniz 🙂
OK’ a basarak çıkın.
Şimdi yine Configuration sekmesinde GPIO’ya tıklayın ve kesmenin:
– Düşen kenarda mı ?
– Yükselen kenarda mı ?
– Hem yükselen hem de düşen kenarda mı ?
oluşmasını istediğinizi seçin 🙂 Resimden görebilirsiniz.
OK’ a basarak çıkın.
4) Project menüsü altından Generate Code yapın. Yine her zamanki gibi MDK5 veya 4’ü seçmeyi unutmayın !
5) Open Project’e basarak projenizi açın. Biz şimdi Interrupt özelliğini kullanacağımız için bununla ilgili driver dosyasını açmalıyız. “stm32f4xx_it.c” Resimden görebilirsin.
6) Dosyayı açtığımızda aşağıdaki kısmı bulmalıyız. MCU’muzun EXTI2 pinine kesme sinyali geldiğinde, MCU direk olarak void EXTI2_IRQHandler(void) fonksiyonuna yönlenecek ve buradaki komutları çalıştıracaktır.
Kırmızı ile belirtilen yeri seçip kopyalayın.
7) main.c dosyasını açın ve void main() fonksiyonunun bitiş parantezinin hemen altına, bir önceki adımda kopyaladığınız yeri yapıştırın. Yapıştırdığınız fonksiyonun içinde kesme geldiğinde istenilen işlemi yazın. İşlemimiz PG14’e bağlı olan LED’in yanmasıydı. Resimde görebilirsiniz.
8) Şimdi main.c içerisindeki while(1) döngüsünün içine girin ve kesme gelmediğinde yapılmasını istediğimiz PG13’ün yanıp sönmesi komutunu oraya yazın.
Yani :
HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_13);
HAL_Delay(500);
Kodunuzu derleyin ve MCU’ya yükleyin. EXTI2 olarak tanımlanan PA2 pinine her sinyal uygulandığında PG13’le ilgili işleme kısa bir ara verildiğini ve PG14’ün yanıp söndüğünü göreceksiniz.
İyi çalışmalar 🙂
Bir cevap yazın