/* p6_1.c using User Switch B1 interrupt * * User Switch B1 is used to generate interrupt through PC13. * The user button is connected to PC13. It has a pull-up resitor * so PC13 stays high when the button is not pressed. * When the button is pressed, PC13 becomes low. * The falling-edge of PC13 (when switch is pressed) triggers an * interrupt from External Interrupt Controller (EXTI). * In the interrupt handler, the user LD2 is blinked twice. * The green LED (LD2) is connected to PA5. * * This program was tested with Keil uVision v5.23 with DFP v2.0.0. */ #include "stm32f0xx.h" void delayMs(int n); int main(void) { __disable_irq(); /* global disable IRQs */ RCC->AHBENR |= 0x00080000; /* enable GPIOC clock */ RCC->AHBENR |= 0x00020000; /* enable GPIOA clock */ RCC->APB2ENR |= 0x00000001; /* enable SYSCFG clock */ /* configure PA5 for LED */ GPIOA->MODER &= ~0x00000C00; /* clear pin mode */ GPIOA->MODER |= 0x00000400; /* set pin to output mode */ /* configure PC13 for push button interrupt */ GPIOC->MODER &= ~0x0C000000; /* clear pin mode to input mode */ SYSCFG->EXTICR[3] &= ~0x00F0; /* clear port selection for EXTI13 */ SYSCFG->EXTICR[3] |= 0x0020; /* select port C for EXTI13 */ EXTI->IMR |= 0x2000; /* unmask EXTI13 */ EXTI->FTSR |= 0x2000; /* select falling edge trigger */ NVIC_EnableIRQ(EXTI4_15_IRQn); __enable_irq(); /* global enable IRQs */ while (1) { } } void EXTI4_15_IRQHandler(void) { GPIOA->BSRR = 0x00000020; /* turn on green LED */ delayMs(250); GPIOA->BRR = 0x00000020; /* turn off green LED */ delayMs(250); GPIOA->BSRR = 0x00000020; /* turn on green LED */ delayMs(250); GPIOA->BRR = 0x00000020; /* turn off green LED */ delayMs(250); EXTI->PR = (1 << 13); /* clear interrupt pending flag */ } /* 8 MHz SYSCLK */ void delayMs(int n) { int i; for (; n > 0; n--) for (i = 0; i < 1142; i++) ; }