External Interrupt on STM32VL Discovery

-Genelde Harici kesme kullanarak kesme işlemine başlarım. Nedense hocalar hep Timer la başlarlar.Çalışma sırası EXTI yani external interrupt a geldiğinde biraz tırmaladım. sebebini kodlarla beraber yazarım. STM32VLDISCOVERY kartıyla gerçekleştireceğiz. Cortex M3 lerde interruptları yönetmek için NVIC (Nested vectored interrupt controller) adında bir yapı vardır. NVIC ile 60 adet (low ve medium seri işlemcilerde 56) interrup ı kontrol edebilirsiniz.
Bu kesmeleri ve sıralamalarını datasheet in “8.1.2 Interrupt and exception vectors” tablosunda görebilirsiniz.
Biz buarad EXTI0 kanalını kullanacağız, bunun  sebebi ise, kartımızın üzerinde bulunan iki adet butonumuz var biri RESET diğeri USER.  Adresinden şemasını inceleyecek olursak USER butonun PA0 a bağlı ve (2. sayfa) PullDown yapıldığını görüyoruz. Yani Butona bastığımızda Lojik 1 gönderiyor. Biz interrupt ımızı buna göre ayarlayacağız.

Isınma hareketlerini bitirdikten sonra maça başlayabiliriz.
ilk önce kullanacağımız kütüphanelerden misc.h ve stm32f10x_exti.h  dikkatinizi çekmiştir. exti dosyası external int için kullanılan misc ise NVIC ayarlama için kullanılan dosyalardır.

#include "cmsis_boot/stm32f10x.h"
#include "stm_lib/inc/misc.h"
#include "stm_lib/inc/stm32f10x_exti.h"
#include "stm_lib/inc/stm32f10x_flash.h"
#include "stm_lib/inc/stm32f10x_gpio.h"
#include "stm_lib/inc/stm32f10x_rcc.h"
#define EXTI0_IRQChannel  ((u8)0x06)  //  Line[0] Interrupts NVIC SIRASI diğer kesmeler için NVIC tablosuna bakınız
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
void Delay(__IO uint32_t);
void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void SetSysClockTo24(void)
{
	int i;
	RCC_DeInit();
	RCC_HSEConfig(RCC_HSE_ON);
  for(i=0;i<0x000FFFF;i++);
  	FLASH_SetLatency(FLASH_Latency_0);
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
    RCC_PCLK2Config(RCC_HCLK_Div1);
    RCC_PCLK1Config(RCC_HCLK_Div1);
    RCC_PREDIV1Config(RCC_PREDIV1_Source_HSE,RCC_PREDIV1_Div1);
    RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_3);
    RCC_PLLCmd(ENABLE);
    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    while (RCC_GetSYSCLKSource() != 0x08)
    {
    }
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC
            | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);
}
void GPIO_Configuration(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
}
void NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}
void Delay(__IO uint32_t nCount)
{
    for (; nCount != 0; nCount--);
}
void EXTI0_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_Line0) != RESET)
    {
        Delay(0xFFFFF);
        GPIO_WriteBit(GPIOC,GPIO_Pin_8,Bit_SET);
        Delay(0xFFFFF);
        GPIO_WriteBit(GPIOC, GPIO_Pin_8,Bit_RESET);
        Delay(0xFFFFF);
        GPIO_WriteBit(GPIOC,GPIO_Pin_8,Bit_SET);
        Delay(0xFFFFF);
        GPIO_WriteBit(GPIOC, GPIO_Pin_8, Bit_RESET);
        Delay(0xFFFFF);
        GPIO_WriteBit(GPIOC,GPIO_Pin_8,Bit_SET);
        Delay(0xFFFFF);
        GPIO_WriteBit(GPIOC, GPIO_Pin_8, Bit_RESET);
        EXTI_ClearITPendingBit(EXTI_Line0);
    }
}
int main(void)
{
	SetSysClockTo24();
	NVIC_Configuration();
	GPIO_Configuration();
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //EXTI line olarak GPIOA.0 ayarlanıyor. Daha Önce Bu pin giriş olarak ayarlanmalı
	EXTI_InitStructure.EXTI_Line =EXTI_Line0;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; // Yükselen yada düşen kenar seçimi yapılıyor.
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);
	while(1)
	{
	Delay(0xFFFFF);
	GPIO_WriteBit(GPIOC,GPIO_Pin_9,Bit_SET);
	Delay(0xFFFFF);
        GPIO_WriteBit(GPIOC, GPIO_Pin_9,Bit_RESET);
	}
}

kesmenin oluşması için girişin yükselen kenar yada düşen kenar da tetiklenmesini sağlayan komut aşağıda.

EXTI_InitStructure.EXTI_Trigger

denemelerimde hernekadar değiştirsemde hem yükselen hemde düşen kenarda tetikleme aldığını gözlemledim. bunu Bouncing etkisine bağladım.
Çalışmalarınızda başarılar dilerim.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google fotoğrafı

Google hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d blogcu bunu beğendi: