Stm32f103rb ile Exti10_15 kesmesi

20130805044906_2288374_300[1]İki gündür bir şey yazmıyordum. sanırım bir müddet sonra bağımlılık yapıyor.  Sabah titreyerek uyandım ve laptop u kucağıma alınca kendime geldim. Kucağa bir şeyler almak gerekiyor sanırım.
Daha önceden yaptığımız bir çalışmanın biraz farklı bir uygulamasını yapacağız. EXTI0 ile PA0,PB0,PC0,PD0,PE0 pinlerinin herhangi birine ilişkilendirerek kullanabiliyoruz bunu daha önce görmüştük. bir zorunluluktan dolayı PC12 yi interrupt girişi olarak kullanmam gerekti. Biraz data incelemesinden sonra işin içinden çıkamayınca http://www.picproje.com adresindeki dostlara sordum. hala cevap gelmedi. yazıyı bitirince orayada çözümü aktaracağım.

stm32f103rb nin reference manuel in içeriğini ve  NVIC bölümünde tabloyu incelediğimizde EXTI12 gibi bir kesme vektörünün olmadığı, bunun yanısıra exti15_10 kesme vektörünün olduğu görülür. (40. sırada)

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_exti.h"
#include "stm32f10x_flash.h"
#include "misc.h"
#define EXTI15_10_IRQChannel  ((u8)0x28)  // NVIC tablo 40.sıra hex 28
#define LED_PORT GPIOD
//Global değişkenler
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
//Prototipler
void Delay(__IO uint32_t);
void SetSysClockHSI(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void SetSysClockHSI(void)
	{
	   RCC_DeInit();
	   RCC_HSICmd(ENABLE);
	   RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCKL(AHB) 64mhz
	   RCC_PCLK1Config(RCC_HCLK_Div2);  //PCLK2(APB2) 32Mhz
	   RCC_PCLK1Config(RCC_HCLK_Div1);	//PCLK1(APB1) 64Mhz
	   FLASH_SetLatency(FLASH_Latency_2);
	   FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
	   RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_CFGR_PLLMULL12);//64mhz
	   RCC_PLLCmd( ENABLE);
			while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
			{
			}
			RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK);
			while (RCC_GetSYSCLKSource() != 0x08)
			{
			}
/*
 * GPIOA,B,C,D,E ile AFIO ya clock uygulanıyor
 */
			RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC| RCC_APB2Periph_GPIOD
            | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);
}
void GPIO_Configuration(void)
{
/*
 * GPIOC12 giriş olarak GPIOD.2 çıkış olarak ayarlanıyor
 */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_Init(GPIOD, &GPIO_InitStructure);
}
/*
 * kesme ayarları
 */
void NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/*
 * Kesme NVIC ayarlamaları
 */
    NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}
/*
 * Zaman Geeçikmesi
 */
void Delay(__IO uint32_t nCount)
{
    for (; nCount != 0; nCount--);
}
/*
 * interrupt alt programı
 * GPIOC.12 ye basıldığında buraya dallanacak
 */
void EXTI15_10_IRQHandler()
{
    if (EXTI_GetITStatus(EXTI_Line12) != RESET)
    {
        Delay(0xFFFFF);
        GPIO_WriteBit(LED_PORT, GPIO_Pin_2, Bit_SET);
        Delay(0xFFFFF);
        GPIO_WriteBit(LED_PORT, GPIO_Pin_2, Bit_RESET);
        Delay(0xFFFFF);
        GPIO_WriteBit(LED_PORT, GPIO_Pin_2, Bit_SET);
        Delay(0xFFFFF);
        GPIO_WriteBit(LED_PORT, GPIO_Pin_2, Bit_RESET);
        Delay(0xFFFFF);
        GPIO_WriteBit(LED_PORT, GPIO_Pin_2, Bit_SET);
        Delay(0xFFFFF);
        GPIO_WriteBit(LED_PORT, GPIO_Pin_2, Bit_RESET);
/*
 * kesme bayrağının temizlenmesi
 */
        EXTI_ClearITPendingBit(EXTI_Line12);
    }
}
void main() {
	SetSysClockHSI(); // Clock ayarları
	NVIC_Configuration(); //kesme ayarları
	GPIO_Configuration();//pin ayarları
	//EXTI line i GPIOC12 ile ilişkilendir
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource12);
	EXTI_InitStructure.EXTI_Line = EXTI_Line12;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);
	//sistemin çalıştığını anlamak için konulmuş boş bir led yakma söndürme işlemi
	Delay(0xFFFFF);
	GPIO_WriteBit(LED_PORT, GPIO_Pin_2, Bit_SET);
	Delay(0xFFFFF);
	GPIO_WriteBit(LED_PORT, GPIO_Pin_2, Bit_RESET);
	Delay(0xFFFFF);
	GPIO_WriteBit(LED_PORT, GPIO_Pin_2, Bit_SET);
	Delay(0xFFFFF);
	GPIO_WriteBit(LED_PORT, GPIO_Pin_2, Bit_RESET);
	Delay(0xFFFFF);
	GPIO_WriteBit(LED_PORT, GPIO_Pin_2, Bit_SET);
	Delay(0xFFFFF);
	GPIO_WriteBit(LED_PORT, GPIO_Pin_2, Bit_RESET);
	while(1);
}

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: