外部中断
使用IO口外部中断的一般步骤:
1、初始化IO口为输入
2、开启AFIO时钟
3、设置IO口与中断线的映射关系
4、初始化线上中断,设置触发条件等
5、配置中断分组(NVIC),并使能中断
6、编写中断服务函数
1 #include "exti.h" 2 #include "key1.h" 3 #include "delay.h" 4 #include "beep.h" 5 #include "led.h" 6 7 /* 8 使用IO口外部中断的一般步骤: 9 1、初始化IO口为输入 10 2、开启AFIO时钟 11 3、设置IO口与中断线的映射关系 12 4、初始化线上中断,设置触发条件等 13 5、配置中断分组(NVIC),并使能中断 14 6、编写中断服务函数 15 */ 16 17 void EXTIX_Init(void) 18 { 19 EXTI_InitTypeDef EXTI_InitStructure; 20 NVIC_InitTypeDef NVIC_InitStructure; 21 22 key_init();//1、初始化IO口为输入 23 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//2、开启AFIO时钟 24 25 GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource8);//key0 3、设置IO口与中断线的映射关系 26 EXTI_InitStructure.EXTI_Line=EXTI_Line8; 27 EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; 28 EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling; 29 EXTI_InitStructure.EXTI_LineCmd=ENABLE; 30 EXTI_Init(&EXTI_InitStructure);//4、初始化线上中断,设置触发条件等 31 32 GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource9);//key1 33 EXTI_InitStructure.EXTI_Line=EXTI_Line9; 34 EXTI_Init(&EXTI_InitStructure); 35 36 GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource2);//key2 37 EXTI_InitStructure.EXTI_Line=EXTI_Line2; 38 EXTI_Init(&EXTI_InitStructure); 39 40 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//key_up 41 EXTI_InitStructure.EXTI_Line=EXTI_Line0; 42 EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising; 43 EXTI_Init(&EXTI_InitStructure); 44 45 NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn; 46 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02; 47 NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x01; 48 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; 49 NVIC_Init(&NVIC_InitStructure);//5、配置中断分组(NVIC),并使能中断 50 51 52 53 NVIC_InitStructure.NVIC_IRQChannel=EXTI2_IRQn; 54 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02; 55 NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02; 56 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; 57 NVIC_Init(&NVIC_InitStructure); 58 59 60 61 NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn; 62 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02; 63 NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; 64 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; 65 NVIC_Init(&NVIC_InitStructure); 66 67 } 68 69 void EXTI9_5_IRQHandler(void)//6、编写中断服务函数 70 { 71 delay_ms(10); 72 if(KEY0==0) 73 { 74 LED0=!LED0; 75 EXTI_ClearITPendingBit(EXTI_Line8); 76 } 77 if(KEY1==0) 78 { 79 LED1=!LED1; 80 EXTI_ClearITPendingBit(EXTI_Line9); 81 } 82 } 83 84 void EXTI0_IRQHandler(void) 85 { 86 delay_ms(10); 87 if(WK_UP==1) 88 { 89 LED1=!LED1; 90 // EXTI_ClearITPendingBit(EXTI_Line0); 91 } 92 EXTI_ClearITPendingBit(EXTI_Line0); 93 94 } 95 96 void EXTI2_IRQHandler(void) 97 { 98 delay_ms(10); 99 if(KEY2==0) 100 { 101 LED5=!LED5; 102 } 103 EXTI_ClearITPendingBit(EXTI_Line2); 104 105 }