外部中断实现步骤:
一、初始化,包括:1.AFIO时钟中断和GPIO时钟使能;
2.GPIO初始化
3.设置EXTI线
4.中断向量初始化
二、中断服务函数
采用PB9作为外部中断源,具体实现程序如下:
一、初始化
1 void EXTI_PB9_Init(void) 2 3 { 4 5 GPIO_InitTypeDef GPIO_InitStructure; 6 7 NVIC_InitTypeDef NVIC_InitStructure; 8 9 EXTI_InitTypeDef EXTI_InitStructure; 10 11 //1.使能GPIO和AFIO时钟,值得注意的是,当使用外部中断的时候必须使能AFIO时钟。 12 13 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE); 14 15 //2.GPIO初始化 16 17 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; 18 19 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入 20 21 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO速度为50MHz 22 23 GPIO_Init(GPIOB,&GPIO_InitStructure); 24 25 //3.设置EXTI线 26 27 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource9); //将EXIT线9连接到PB9 28 29 EXTI_InitStructure.EXTI_Line = EXTI_Line9; 30 31 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; 32 33 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //上升下降沿触发 34 35 EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能中断线 36 37 EXTI_Init(&EXTI_InitStructure);//初始化中断 38 39 //4.中断向量 40 41 NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; 42 43 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 44 45 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; 46 47 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 48 49 NVIC_Init(&NVIC_InitStructure); 50 51 }
二、中断服务函数
1 void EXTI9_5_IRQHandler(void) 2 3 { 4 5 if(EXTI_GetITStatus(EXTI_Line9) != RESET) //EXTI9产生了中断 6 7 { 8 9 。。。。。。。。。。//中断处理,自行脑补~~~~ 10 11 } 12 13 EXTI_ClearITPendingBit(EXTI_Line9);//清除中断 14 15 }
注意:
1.外部中断5~外部中断9都是使用同一个中断函数EXTI9_5_IRQHandler ,若想同时使用,需要在中断函数中区分不同的中断线,如:
if(EXTI_GetITStatus(EXTI_Line9) != RESET) //EXTI9产生了中断2.外部中断线和管脚号是一一对应的,如:EXTI1 ——> Pin1;EXTI2 ——> Pin2;EXTI3 ——> Pin3;EXTI4 ——> Pin4;。。。而不是随意映射的。
时间: 2024-10-20 16:14:45