(STM32F4) External Interrupt
外部中斷(External Interupt) 在MCU中是很常見而且很常用到的基本function,所以就不多做解釋。不過因為每顆MCU的配置都不太一樣所以在此記錄下來。
External Interrupt 配置
1 void EXIT_GPIO_Config(void) 2 { 3 GPIO_InitTypeDef GPIO_Config; 4 EXTI_InitTypeDef EXTI_Config; 5 NVIC_InitTypeDef NVIC_Config; 6 7 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); 8 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); 9 10 GPIO_Config.GPIO_Mode = GPIO_Mode_IN; 11 GPIO_Config.GPIO_OType = GPIO_OType_PP; 12 GPIO_Config.GPIO_Pin = GPIO_Pin_0; 13 GPIO_Config.GPIO_PuPd = GPIO_PuPd_NOPULL; 14 GPIO_Config.GPIO_Speed = GPIO_Speed_100MHz; 15 GPIO_Init(GPIOA, &GPIO_Config); 16 17 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0); 18 19 EXTI_Config.EXTI_Line = EXTI_Line0; 20 EXTI_Config.EXTI_Mode = EXTI_Mode_Interrupt; 21 EXTI_Config.EXTI_Trigger = EXTI_Trigger_Rising; 22 EXTI_Config.EXTI_LineCmd = ENABLE; 23 EXTI_Init(&EXTI_Config); 24 25 NVIC_Config.NVIC_IRQChannel = EXTI0_IRQn; 26 NVIC_Config.NVIC_IRQChannelSubPriority = 0x01; 27 NVIC_Config.NVIC_IRQChannelPreemptionPriority = 0x01; 28 NVIC_Config.NVIC_IRQChannelCmd = ENABLE; 29 NVIC_Init(&NVIC_Config); 30 31 printf("External interrupt initial finished !!\n"); 32 }
中斷向量內的程式碼
1 void EXTI0_IRQHandler(void) 2 { 3 if(EXTI_GetFlagStatus(EXTI_Line0) != RESET) 4 { 5 printf("interrupt test\n"); 6 EXTI_ClearITPendingBit(EXTI_Line0); 7 } 8 }
主程式
1 /* Private variables ---------------------------------------------------------*/ 2 __IO uint32_t status; 3 4 int main(void) 5 { 6 LED_Config(); 7 Delay_Init(); /* initialize delay function */ 8 USART_Config(); 9 EXIT_GPIO_Config(); 10 printf("STM32F4 External Function test\n"); 11 12 while(1) 13 { 14 status = GPIOA->IDR & GPIO_Pin_0; 15 if(status) 16 GPIOD->ODR |= GPIO_Pin_12; 17 else 18 GPIOD->ODR &= ~GPIO_Pin_12; 19 DelayMs(500); 20 } 21 }