Sosyal Medya  

FacebookTwitterDiggLinkedinRSS Feed
   

   
   

Adım Adım ARM Programlama 4 - EXTI isimli makalemde ARM işlemciler için dış kesmeyi anlatmıştım. Makalenin geneli STM32F107x mikroişlemcisi üzerinden yürütmüştüm. Bu makalemde de bir önceki makalemde değinmiş olduğum dış kesmeler üzerine STM32F107VCT işlemcisini kullanarak örnek bir uygulama yazacağız. Uygulamamızı derlemek için KEIL platformunu kullanacağız. KEIL üzerinde program yazabilmeniz için Adım Adım ARM Programlama-1 isimli makalemde vermiş olduğum kütüphaneleri indirmeniz gerekmekte.

Bu uygulamamızda; butona basınca düşen kenar kesmesi oluşturarak, herhangi bir LED'in durumunu tersleyen bir proram yazacağız. Yazdığımız programı da ST firmasının üretmiş olduğu STM32F10C-Eval geliştirme kartında deneyecğiz.

EXTI Kesmesi Kurulumu İçin İzlenecek Adımlar

  • Kesme oluşturulacak PORT'un saati aktif yapılır.
  • Kesme oluşturulacak pinin özellikleri tanımlanır. Kesme modunda genellikle floating özelliği ayarlanır.
  • EXTI kesme ayarları aktifleştirilir.
  • Kesmenin önceliği ayarlanır.
  • Kesme fonksiyonu stm10x_it.c dosyası içerisinde tanımlanır.

Daha önceki uygulama makalemde de belirttiğim gibi, ARM programlayabilmek için ARM kütüphanesindeki fonksiyonları iyi okuyabilmek gerekmekte. EXTI kesme kurulumlarını yapabilmek için stm32f10x_exti.c dosyasından yararlanacağız. Bu dosyada oluşturulmuş olan fonksiyonların listesi ve tanımları da stm32f10x_exti.h dosyasının sonunda yer almaktadır:

void EXTI_DeInit(void);
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);
void EXTI_ClearFlag(uint32_t EXTI_Line);
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);

Bilinmesi gereken bir diğer nokta da EXTI_IRQ kesme tanımlarıdır. Adım Adım ARM Programlama 4 - EXTI isimli önceki makalemde hangi pinlerin hangi hatlara bağlı olduğunu belirten bir şema vermiştim. O şemadaki isimlere göre EXTI_IRQ kesmesi oluşturulmuş. Buna göre;

  • EXTI9_5_IRQ: Portların 5., 6., 7., 8. ve 9. hatlarını içeren kesme fonksiyonudur. Örneğin; PORTB'nin 9. pini tabloya göre line 9 olduğu için bu kesme grubuna girer.
  • EXTI15_10_IRQ: Portların 10., 11., 12., 13. ve 14., 15. hatlarını içeren kesme fonksiyonudur.
  • EXTI0_IRQn, EXTI1_IRQn, EXTI2_IRQn, EXTI3_IRQn, EXTI4_IRQn: Sırasıyla; 0., 1., 2., 3., 4. hatlara ait kesme fonksiyonlarıdır.

Diğer kesme fonksiyonlarının listesini stm32f10x.h dosyasında bulabilirsiniz.

Uygulama

Problem

STM32F10C-Eval deneme kartı üzerinde bulunan User butonuna basılınca yükselen kenar kesmesini girip, LED1 ledinin durumunu tersleyen programı yazınız. (User butonu ARM işlemcinin PB9, LED1 de PD7 pinlerine bağlıdır.)

Program

 main.c

#include "stm32f10x.h"
#include "stm32_eval.h"
#include <stdio.h>
#include "main.h"


EXTI_InitTypeDef   EXTI_InitStructure;
GPIO_InitTypeDef   GPIO_InitStructure;
NVIC_InitTypeDef   NVIC_InitStructure;


void EXTI9_5_Config(void);
void LED_Config(void);

int main(void)
{
  
	LED_Config();
	EXTI9_5_Config();
	
  while (1);
}

void EXTI9_5_Config(void)
{

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // Portların 9. pinini GPIO olarak ayarla
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // Butonu floating modda tut
  GPIO_Init(GPIOB, &GPIO_InitStructure); // PortB'nin 9.pini için yukarıdaki ayarları kaydet

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource9); // PORTB'nin 9. pinini EXTI kesmesi olarak ayarla

  EXTI_InitStructure.EXTI_Line = EXTI_Line9;  // PORT'ların 9. pinindeki kesmeler açık
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // Kesme modu
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // Yükselen kenar tetiklemesi
  EXTI_InitStructure.EXTI_LineCmd = ENABLE; // Pinlere özel kesme hattını aktif et
  EXTI_Init(&EXTI_InitStructure);

  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;  // stm32f10x_it.c dosyasındaki kesme fonksiyonu adı
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F; // Kesme önceliği (EXTI9_5 kesmesi haricindekiler için en düşük)
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F; // Kesme Önceliği(EXTI9_5 kesmesi içerisindekiler için en düşük)
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // Kesmeyi aç

  NVIC_Init(&NVIC_InitStructure);

}
void LED_Config(void)
{
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); // PORTD'yi aktif et
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; // PORTD'nin 7. pinini aktif et
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  // PORTD.7 pinini push pull olarak ayarla
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 
  GPIO_Init(GPIOD, &GPIO_InitStructure); // Yukarıdaki ayarları kaydet
}
void LEDTersle(void)
{
	if(GPIO_ReadOutputDataBit(GPIOD,GPIO_Pin_7)) //LED açık mı?
		GPIO_ResetBits(GPIOD,GPIO_Pin_7);	
	else
		GPIO_SetBits(GPIOD,GPIO_Pin_7);
}

  main.h

#ifndef __MAIN_H
#define __MAIN_H

#include "stm32f10x.h"
#include "stm32_eval.h"

void LEDTersle(void);

#endif 

  stm32f10x_it.c

#include "stm32f10x_it.h"
#include "main.h"

void EXTI9_5_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line9) == 1) // Eğer PB9 daki buton basılmışsa
  {
    LEDTersle();
   EXTI_ClearITPendingBit(EXTI_Line9); // Bayrağı Temizle
  }
}

Bu makalemin de sonuna geldik. Umarım sizler için faydalı olmuştur.

Sağlıcakla kalın...

Yorumlar   

+3 # Serhat 16-01-2014 07:17
Kardeşim çok faydalı bir makale , emeğine sağlık . Devamını bekliyoruz ...
Cevap | Alıntıyla Cevapla | Alıntı
+2 # Super User 16-01-2014 08:59
Sağolasın kardeşim. İşlerimden vakit buldukça birşeyler eklemeye çalışıyorum.
Cevap | Alıntıyla Cevapla | Alıntı
+4 # Ayhan 18-01-2014 14:52
Yararlı bir çalışma. Mutlaka işini görecek vardır.
Cevap | Alıntıyla Cevapla | Alıntı
+1 # mehmet 19-05-2015 16:04
selamün aleyküm hocam!
Ben yeni başlamak istiyorum C de ARM programlamayı.f akat elimde hiç kaynak yok.sizin makalelerinizi okudum faydalı oldu.tafsiye edebileceğiniz kaynak (kitap) varmı?birde hangi derleyiciyi kulansam avantajlı olur?son soru olarak programlama kartını almadan proteusta bu simülasyonları yapabiliyormuyu z?teşekür ediyorum.kolay gelsin
Cevap | Alıntıyla Cevapla | Alıntı
0 # Sinan 26-10-2015 13:24
Merhaba, öncelikle çok faydalı bir makale olmuş bu yüzden teşekkür ederim. Elimde STM32 F4 discovery(with TFT) kiti mevcut kütüphanesini önceki makalede paylaşmışsınız lakin uygulamaların diğer kitle yapıldığı görülüyor. STM32 F4 discovery ile de uygulamalar yapacak mısınız ? Teşekkürler, kolay gelsin.
Cevap | Alıntıyla Cevapla | Alıntı

Yorum ekle


Güvenlik kodu
Yenile

   
   
© muhammetefe.com