外部中断


使用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 }
exti.c

 

posted @ 2023-09-14 14:40  HuangWQ289  阅读(36)  评论(0编辑  收藏  举报