STM32F407 Interrupt (Kesme) Nedir ve Nasıl Kullanılır?

banner

Interrupt (Kesme) Nedir?

Bütün bilgisayar ve mikrodenetleyicilerde kesme bulunur. Önceliği yüksek işlerin mikrodenetleyici tarafından ana program akışı
kesilerek yapılmasına kesme denir.

STM32F407 Interrupt (Kesme) Özellikleri

  • STM32F4 82 adet maskelenebilir kesme kanalına sahiptir.
  • Programlanabilir 16 öncelik seviyesi verilebilir.
  • Kısa gecikme süreli kesme erişimine sahiptir.
  • Güç kontrol kesmelerine sahiptir.
  • Sistem kontrol kesmelerine sahiptir.

Harici Kesmeler (EXTI)

  • Harici bir kaynakta oluşan olaylardan meydana gelen kesmelere, harici kesmeler denir.
  • STM32F4 mikrodenetleyicileri 23 harici kaynaktan kesme kabul etmektedir.
  • Harici kaynak olarak , dış ortamdan pinler vasıtasıyla gelecek kesme ve kendi içindeki donanımlardan gelen kesmeler anlaşılmalıdır.

MikroC Kesme Fonksiyonları

NVIC_IntEnable

Bu fonksiyon tanımlanan interrupt vektörüne izin verir.

void NVIC_IntEnable (const unsigned long ivt);

Fonksiyona giriş yapılan ivt (Interrupt Vector Table) işlemcinin kesme olarak kabul ettiği değişimlerin (kesme) tablosudur. Hangi değişimde kesme oluşması isteniyorsa o kesme yazılır.
Örnek: NVIC_IntEnable (IVT_INT_EXTI0);

NVIC_IntDisable

Bu fonksiyon müsaade edilen kesmeyi iptal etmek için kullanılır.
Örnek: NVIC_IntDisable (IVT_INT_EXTI0);

Interrupt Asistant

İlk başta;

Bir kere derlenince;

void buton_kesme() iv IVT_INT_EXTI0 ics ICS_AUTO
{
	EXTI_PR=1;
	GPIOD_ODR=~GPIOD_ODR;
}
void main() {
	GPIO_Digital_Input(&GPIOA_IDR, _GPIO_PINMASK_0);
	GPIO_Digital_Output(&GPIOD_ODR, _GPIO_PINMASK_ALL);
	SYSCFG_EXTICR1=0;
	EXTI_FTSR=0;
	EXTI_RTSR=1;
	EXTI_IMR=1;
	EXTI_EMR=0;
	EXTI_PR=1;
	NVIC_IntEnable(IVT_INT_EXTI0);
	while(1);
}
  • SYSCFG_EXTICRx registerleri ile interrupt olarak algılanacak port/pin (bit) seçilir.
  • Kesmenin yükselen/düşen kenar veya her ikisinden de gelen kesme seçilir.
  • Değişiklik olduğunda bunun kesme olarak algılanmasını sağlayan EXT_IMR registerinin biti 1 yapılır.
  • EXTI_PR kaydedicisi «1» yapılarak kesme isteğinin oluştuğu bildirilir.
  • NVIC kontroller ilgili interrupt rutinine yönlendirir.
  • Rutin içindeki komutlar işlendikten sonra tekrar ana programa geri dönülür.
  • Event olarak isimlendirilen kaydedici, mikrodenetleyiciyi standby durumundan çıkaran (uyandırma) işlemi de yapılabilmektedir. EXTI_EMR kaydedicisi ile bu sağlanmaktadır.
  • EXTI_FTSR kaydedicisinin 0. biti EXTI0’ı temsil ettiği için değeri düşen kenarın tetiklemesini istiyorsak EXTI_FTSR=1, yükselen kenarın tetiklemesini istiyorsak EXTI_FTSR=0 yapıyoruz.
  • Bu uygulamada ya yükselen ya da düşen kenar seçilebilir. Yükselen kenar tetikleme istediğimizi düşünerek devam edelim.
  • EXTI_FTSR=0;
  • EXTI_RTSR=1;
  • EXTI_IMR ve EXTI_EMR; hem uyandırma hem kesme istenebilir.
  • Örnekte kesme istendi.

Timer Calculator

#define saniyeBir durum.B0
unsigned long GLCD_DataPort_Input at GPIOE_IDR;
unsigned long GLCD_DataPort_Output at GPIOE_ODR;
sbit GLCD_CS2 at GPIOE_ODR.B11;
sbit GLCD_CS1 at GPIOE_ODR.B12;
sbit GLCD_RS at GPIOE_ODR.B8;
sbit GLCD_RW at GPIOE_ODR.B9;
sbit GLCD_EN at GPIOE_ODR.B10;
sbit GLCD_RST at GPIOE_ODR.B13;
unsigned long sayi=0,temp=0,deneme=0;
char txt[12],durum=0;
//Timer7 Prescaler :1343; Preload = 62499; Actual Interrupt Time = 1

void InitTimer7(){
	RCC_APB1ENR.TIM7EN = 1;
	TIM7_CR1.CEN = 0;
	TIM7_PSC = 1343;
	TIM7_ARR = 62499;
	NVIC_IntEnable(IVT_INT_TIM7);
	TIM7_DIER.UIE = 1;
	TIM7_CR1.CEN = 1;
}

void Timer7_interrupt() iv IVT_INT_TIM7 {
	TIM7_SR.UIF = 0;
	temp=sayi;
	sayi=0;
	saniyeBir=1;
}

void palsKesme() iv IVT_INT_EXTI15_10 ics ICS_AUTO {
	EXTI_PR.B15=1;
	sayi++;
}

void main() {
	GPIO_Digital_Output(&GPIOE_BASE, _GPIO_PINMASK_9);
	GPIOE_ODR.B9=0;
	//GPIOAEN_bit=1;
	//GPIOA_MODER=0x00020000;
	//GPIOA_AFRH=0;
	GPIO_Alternate_function_Enable(&_GPIO_MODULE_MCO1);
	GPIO_Digital_Input(&GPIOA_IDR, _GPIO_PINMASK_15);
	GPIO_Config(&GPIOA_IDR, _GPIO_PINMASK_15, _GPIO_CFG_PULL_DOWN);
	SYSCFG_EXTICR4=0x00000000;
	EXTI_RTSR.B15=1;
	EXTI_IMR=1<<15;
	EXTI_EMR=1;
	EXTI_PR.B15=1;
	NVIC_IntEnable(IVT_INT_EXTI15_10);
	InitTimer7();
	Glcd_Init();
	Glcd_Fill(0);
	Glcd_Write_Text("Frekansmetre", 1, 0, 1);
	while(1){
		if(saniyeBir){
			LongWordToStr(temp,txt);
			Glcd_Write_Text(txt, 1, 1, 1);
			saniyeBir=0;
		}
	}
}
banner
banner