Bu yazımızda STM32VLDiscovery ile External Interrupt (Harici Kesme) uygulaması yapacağız.
Harici kesmeler, main fonksiyonu içinde sürekli gerçekleşen kodları dışarıdan müdahale ile (örneğin butona bastığımızda) keser ve belirttiğimiz işlemi yapmaya geçer.
Bu kodumuzda PC3 pinine bağlı butonumuzu yükselen kenar tetiklemeli interrupt buton olarak tanımladık. Main fonksiyonumuzda while(1) sonsuz döngünün içinde PB0 pinini set ettik ve ledimiz sürekli yanık halde. PC3 pinine bağlı butonumuza bastığımızda harici kesme gerçekleşecek ve yapılmasını istediğimiz fonksiyona girerek ledimiz 3 defa yanıp sönecek. Kesme fonksiyonumuz tamamlandıktan sonra kodumuz main içinde kaldığı yerden devam edecek.
Devre Şeması
Proje Kodu
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 |
#include "stm32f10x.h" // Device header #include "stm32f10x_rcc.h" // Keil::Device:StdPeriph Drivers:RCC #include "stm32f10x_gpio.h" // Keil::Device:StdPeriph Drivers:GPIO #include "stm32f10x_exti.h" // Keil::Device:StdPeriph Drivers:EXTI void InitGPIOs(void); void InitExti(void); void EXTI3_IRQHandler(void); void delay(uint32_t time); int main(){ InitGPIOs(); InitExti(); while(1){ GPIO_SetBits(GPIOB, GPIO_Pin_0); } } void InitGPIOs(){ GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // LED RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // BUTTON // LED GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStruct); // BUTTON GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3; GPIO_Init(GPIOC, &GPIO_InitStruct); } void InitExti(void){ EXTI_InitTypeDef EXTI_InitStruct; NVIC_InitTypeDef NVIC_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource3); // EXTERNAL INTERRUPT PART EXTI_InitStruct.EXTI_Line = EXTI_Line3; EXTI_InitStruct.EXTI_LineCmd = ENABLE; EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_Init(&EXTI_InitStruct); // NVIC PART NVIC_InitStruct.NVIC_IRQChannel = EXTI3_IRQn; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; NVIC_Init(&NVIC_InitStruct); } void EXTI3_IRQHandler(void){ if(EXTI_GetITStatus(EXTI_Line3) != RESET){ for(int i=0; i<3; i++){ GPIO_SetBits(GPIOB, GPIO_Pin_0); delay(900000); GPIO_ResetBits(GPIOB, GPIO_Pin_0); delay(300000); } EXTI_ClearITPendingBit(EXTI_Line3); } } void delay(uint32_t time){ while(time--); } |
Gerekli Malzemeler
- STM32VLDISCOVERY (STM32F100RB)
- Breadboard
- LED
- Buton
- 330 Ω ve 10k Ω direnç
- Jumper kablo