-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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
#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.
1 |
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.