外部中斷實現步驟:
一、初始化,包括: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;
。。。
而不是隨意映射的。