1 STM32中斷分組 STM32 的每一個GPIO都能配置成一個外部中斷觸發(fā)源,這點也是 STM32 的強大之處。STM32 通過根據(jù)引腳的序號不同將眾多中斷觸發(fā)源分成不同的組,比如:PA0,PB0,PC0,PD0,PE0,PF0,PG0為第一組,那么依此類推,我們能得出一共有16 組,STM32 規(guī)定,每一組中同時只能有一個中斷觸發(fā)源工作,那么,最多工作的也就是16個外部中斷。STM32F103 的中斷控制器支持 19 個外部中斷/事件請求。每個中斷設(shè)有狀態(tài)位,每個中斷/事件都有獨立的觸發(fā)和屏蔽設(shè)置。STM32F103 的19 個外部中斷為: 線 0~15:對應(yīng)外部 IO 口的輸入中斷。 線 16:連接到 PVD 輸出。 線 17:連接到 RTC 鬧鐘事件。 線 18:連接到 USB 喚醒事件。 2 外部中斷的配置過程 1.配置觸發(fā)源GPIO口 因為GPIO口作為觸發(fā)源使用,所以將GPIO口配置成輸入模式,觸發(fā)模式有以下幾種: a.GPIO_Mode_AIN ,模擬輸入(ADC模擬輸入,或者低功耗下省電) b.GPIO_Mode_IN_FLOATING ,浮空輸入 c.GPIO_Mode_IPD ,帶下拉輸入 d.GPIO_Mode_IPU ,帶上拉輸入 GPIO_InitTypeDef GPIO_InitStructure;//定義結(jié)構(gòu)體 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//使能時鐘 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//選擇IO口 PE2 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//設(shè)置成上拉輸入 GPIO_Init(GPIOE, &GPIO_InitStructure);//使用結(jié)構(gòu)體信息進行初始化IO口 2.使能AFIO復(fù)用時鐘功能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); 3.將GPIO口與中斷線映射起來 GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2); 4.中斷線上進行中斷初始化 EXTI_InitTypeDef EXTI_InitStructure;//定義初始化結(jié)構(gòu)體 EXTI_InitStructure.EXTI_Line=EXTI_Line2; //中斷線的標(biāo)號 取值范圍為EXTI_Line0~EXTI_Line15 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中斷模式,可選值為中斷 EXTI_Mode_Interrupt 和事件 EXTI_Mode_Event。 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//觸發(fā)方式,可以是下降沿觸發(fā) EXTI_Trigger_Falling,上升沿觸發(fā) EXTI_Trigger_Rising,或者任意電平(上升沿和下降沿)觸發(fā)EXTI_Trigger_Rising_Falling EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure);//根據(jù)結(jié)構(gòu)體信息進行初始化 5.中斷優(yōu)先級配置 NVIC_InitTypeDef NVIC_InitStructure;//定義結(jié)構(gòu)體 NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //使能外部中斷所在的通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //搶占優(yōu)先級 2, NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子優(yōu)先級 2 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道 NVIC_Init(&NVIC_InitStructure); //根據(jù)結(jié)構(gòu)體信息進行優(yōu)先級初始化 6.外部中斷服務(wù)函數(shù)的編寫 外部中斷函數(shù)分別為: EXPORT EXTI0_IRQHandler EXPORT EXTI1_IRQHandler EXPOR T EXTI2_IRQHandler EXPORT EXTI3_IRQHandler EXPORT EXTI4_IRQHandler EXPORT EXTI9_5_IRQHandler EXPORT EXTI15_10_IRQHandler 中斷線 0-4 每個中斷線對應(yīng)一個中斷函數(shù),中斷線 5-9 共用中斷函數(shù) ,EXTI9_5_IRQHandler,中斷線 10-15 共用中斷函數(shù) EXTI15_10_IRQHandler! void EXTI2_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line2)!=RESET)//判斷某個線上的中斷是否發(fā)生 { 中斷邏輯… EXTI_ClearITPendingBit(EXTI_Line2); //清除 LINE 上的中斷標(biāo)志位 } } 使用按鍵進行外部中斷的時候,一般都需要進行按鍵延時消抖以及松手檢測的相關(guān)處理,中斷函數(shù)可以參看以下代碼: void EXTI2_IRQHandler(void) { delay_ms(10);//延時消抖 if(KEY2==0) //按鍵真的被按下 { LED0=!LED0; } while(KEY2!=0);//等待松手 EXTI_ClearITPendingBit(EXTI_Line2); //清楚中斷標(biāo)志位 } 當(dāng)然,如果你的按鍵是允許長按功能的,那么就進行別的邏輯操作,這里不作研究。 信盈達靠技術(shù)打天下/以下課程可免費試聽C語言、電子、PCB、STM32、Linux、FPGA、JAVA、安卓等。 想學(xué)習(xí)的你和我聯(lián)系預(yù)約就可以免費聽課了qq35--24-65--90-88 Tel/WX:173--17--95--19--08 |