外部中斷控制:
STM32的每個IO 都可以作為外部中斷的中斷輸入口,這點也是STM32的強大之處。STM32F103的中斷控制器支持19個外部中斷/事件請求。每個中斷設(shè)有狀態(tài)位,每個中斷/事件都有獨立的觸發(fā)和屏蔽設(shè)置。STM32F103 的19個外部中斷為:
線0~15:對應(yīng)外部IO 口的輸入中斷。
線16:連接到PVD輸出。
線17:連接到RTC鬧鐘事件。
線18:連接到USB喚醒事件。
STM32供IO 口使用的中斷線只有16個,但是STM32的IO 口卻遠(yuǎn)遠(yuǎn)不止16個,STM32就這樣設(shè)計,GPIO的管教GPIOx.0~GPIOx.15(x=A,B,C,D,E,F(xiàn),G)分別對應(yīng)中斷線15~0。這樣每個中斷線對應(yīng)了最多7個IO 口,以線0為例:它對應(yīng)了GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。而中斷線每次只能連接到1個IO 口上,這樣就需要通過配置來決定對應(yīng)的中斷線配置到哪個GPIO上了。
AFIO(alternate-function I/O),指GPIO端口的復(fù)用功能,GPIO除了用作普通的輸入輸出(主功能),還可以作為片上外設(shè)的復(fù)用輸入輸出,如串口、ADC、這些就是復(fù)用功能。大多數(shù)GPIO都有一個默認(rèn)復(fù)用功能,有的GPIO還有重映射功能,重映射功能是指把原來屬于A引腳的默認(rèn)復(fù)用功能,轉(zhuǎn)移到了B引腳進行使用,前提是B引腳具有這個重映射功能。當(dāng)把GPIO用作EXTI外部中斷或使用重映射功能的時候,必須開啟AFIO時鐘,而使用默認(rèn)復(fù)用功能的時候,就不必開啟AFIO時鐘了。
主要步驟:1、使能EXTIx線的時鐘和第二功能AFIO時鐘
2、配置EXTIx先得中斷優(yōu)先級
3、配置EXTI中斷線IO
4、選定要配置為EXTI的IO口線和IO口的工作模式
5、EXTI中短線工作模式配置
另外:NVIC_PriorityGroupConfig()庫函數(shù),把NVIC中的中斷優(yōu)先級分組設(shè)置;然后再向NVIC初始化結(jié)構(gòu)體寫入?yún)?shù)。NVIC_IRQChannel=EXTI9_5_IRQn,表示要配置的為EXTI第5-9線的中斷向量。這些寫入的參數(shù)在stm32f10x.h文件的IRQn類型定義中查到。
中短線0-4每個中斷線對應(yīng)一個中斷函數(shù),中斷線5-9共用中斷函數(shù)EXTI9_5_IRQHandler,中斷線10-15共用中斷函數(shù)EXTI15-10-IRQHandler。在編寫中斷服務(wù)函數(shù)的時候會經(jīng)常使用到兩個函數(shù),第一個函數(shù)是判斷某個中斷線上的中斷是否發(fā)生(標(biāo)志位是否置位):
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
這個函數(shù)一般使用在中斷服務(wù)函數(shù)的開頭判斷中斷是否發(fā)生。另一個函數(shù)是清除某個中斷線上的中斷標(biāo)志位:
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
這個函數(shù)一般應(yīng)用在中斷服務(wù)函數(shù)結(jié)束之前,清除中斷標(biāo)志位