EXTI中斷使用

EXTI中斷初始化
GPIO端口初始化(使用輸入模式)。
打開(kāi)AFIO時(shí)鐘。AFIO的時(shí)鐘接在APB2上,使用函數(shù)RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE)打開(kāi)時(shí)鐘。
EXTI初始化。
選擇GPIO端口作為EXTI的線路。使用函數(shù)GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) 。例如:????
? ? ? 函數(shù)說(shuō)明
定義結(jié)構(gòu)體變量。與GPIO的初始化類(lèi)似,EXTI的初始化也需要定義結(jié)構(gòu)體變量。結(jié)構(gòu)? ? 體名為EXTI_InitTypeDef,一般命名為EXTI_InitStruct。同樣,該結(jié)構(gòu)體變量里有四個(gè)成員,? 對(duì)四個(gè)成員分別進(jìn)行賦值即可。例如圖。
注意, .EXTI_Trigger 該成員控制中斷的觸發(fā)條件,有三個(gè)可選項(xiàng):上升沿觸發(fā)、下降沿觸發(fā)、上升下降沿觸發(fā)。
EXTI初始化。直接使用函數(shù)?EXTI_Init(&EXTI_InitStruct); 對(duì)EXTI進(jìn)行初始化。

NVIC
選定NVIC的優(yōu)先級(jí)模式。NVIC的優(yōu)先級(jí)分為搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)。搶占優(yōu)先級(jí)高的中斷程序先執(zhí)行,若搶占優(yōu)先級(jí)相同,則比較響應(yīng)優(yōu)先級(jí)。優(yōu)先級(jí)寄存器有四位,存在四種分配模式,按需選擇。
? ? ? ?優(yōu)先級(jí)可選模式:
2.定義結(jié)構(gòu)體變量。與GPIO、EXTI類(lèi)似,定義一個(gè)結(jié)構(gòu)體變量以便進(jìn)行初始化。
其中.NVIC_IRQChannelPreemptionPriority與.NVIC_IRQChannelSubPriority分別為搶占優(yōu)先級(jí)與響應(yīng)優(yōu)先級(jí)。不同的模式存在不同的賦值,但數(shù)字越小優(yōu)先級(jí)越高。
3.初始化。

中斷函數(shù)
中斷函數(shù)的定義可以在startup文件中找到。由于在起始文件中有所定義,所以在模塊化編程時(shí)可以不在頭文件中聲明即可在主函數(shù)中使用。
找到對(duì)應(yīng)中斷函數(shù)。例如EXTI_Line0對(duì)應(yīng)的中斷函數(shù)為EXTI0_IRQHandler()。以此類(lèi)推。
注意:
(1)中斷函數(shù)的名字不可變更。
(2)中斷函數(shù)沒(méi)有返回值,括號(hào)內(nèi)也沒(méi)有參數(shù)。
(3)10~15號(hào)端口使用同一個(gè)中斷函數(shù) EXTI15_10_IRQHandler() 。
進(jìn)行 if 判斷(有時(shí)可有可無(wú))。主要針對(duì)?EXTI15_10_IRQHandler() 。對(duì)于10~15號(hào)端口引起的中斷,避免不同端口進(jìn)入同一程序造成混亂,可以進(jìn)行 if 判斷。如果對(duì)應(yīng)端口的標(biāo)志位為SET,證明時(shí)該端口引發(fā)的中斷,可以進(jìn)入相應(yīng)的程序。
其中 EXTI_GetITStatus(uint32_t EXTI_Line); 用于檢測(cè)中斷標(biāo)志位,返回值為 SET或RESET
注意:該函數(shù)只能在中斷函數(shù)中使用。
同時(shí) EXTI_GetFlagStatus(uint32_t EXTI_Line); 有相同的功能,但在外部或中斷函數(shù)內(nèi)都可使用。建議在外部時(shí)使用該函數(shù),在中斷內(nèi)部時(shí)用?EXTI_GetITStatus(uint32_t EXTI_Line);?
3.標(biāo)志位清除。用軟件對(duì)標(biāo)志位進(jìn)行清除,防止中斷永遠(yuǎn)進(jìn)行下去。

說(shuō)明:
1.對(duì)于不同GPIO的相同端口(如GPIOA的Pin1和GPIOB的Pin1),不能同時(shí)使用中斷函數(shù)。