在STM32使用外部中斷的基本步驟如下:
1. 設(shè)置好相應(yīng)的時(shí)鐘;
2.設(shè)置相應(yīng)的中斷;
3.IO口初始化;
4.把相應(yīng)的IO口設(shè)置為中斷線路(要在設(shè)置外部中斷之前)并初始化;
5.在選擇的中斷通道的響應(yīng)函數(shù)中中斷函數(shù)。
//配置EXTI 參數(shù)
PA0-PF0 共用中斷線源0
PA1-PF1 共用中斷線源1
.............................................
所以不能同時(shí)使用PA0和PB0引腳產(chǎn)生外部中斷,(查看官方程序stm32f30x_exti.c文件,下面是節(jié)選部分代碼)
===============================================================================
##### EXTI features #####
===============================================================================
[..] External interrupt/event lines are mapped as following:
(#)All available GPIO pins are connected to the 16 external
interrupt/event lines from EXTI0 to EXTI15.
(#) EXTI line 16 is connected to the PVD output
(#) EXTI line 17 is connected to the RTC Alarm event
(#) EXTI line 18 is connected to USB Device wakeup event
(#) EXTI line 19 is connected to the RTC Tamper and TimeStamp events
(#) EXTI line 20 is connected to the RTC wakeup event
(#) EXTI line 21 is connected to the Comparator 1 wakeup event
(#) EXTI line 22 is connected to the Comparator 2 wakeup event
(#) EXTI line 23 is connected to the I2C1 wakeup event
(#) EXTI line 24 is connected to the I2C2 wakeup event
(#) EXTI line 25 is connected to the USART1 wakeup event
(#) EXTI line 26 is connected to the USART2 wakeup event
(#) EXTI line 27 is reserved
(#) EXTI line 28 is connected to the USART3 wakeup event
(#) EXTI line 29 is connected to the Comparator 3 event
(#) EXTI line 30 is connected to the Comparator 4 event
(#) EXTI line 31 is connected to the Comparator 5 event
(#) EXTI line 32 is connected to the Comparator 6 event
(#) EXTI line 33 is connected to the Comparator 7 event
(#) EXTI line 34 is connected for thr UART4 wakeup event
(#) EXTI line 35 is connected for the UART5 wakeup event
/*****************************************************************************/
GPIO_InitTypeDef GPIO_InitStructure;//定義結(jié)構(gòu)體
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//outside inteput 引腳配置
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);//Enable the GPIOB clock
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);//Enable the SYSCFG clock
//打開PB時(shí)鐘 配置PB1 引腳為輸入
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
//GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB,&GPIO_InitStructure);
//配置對(duì)應(yīng)的 GPIO 為EXTI 線
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB,EXTI_PinSource1);
//GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);
EXTI_InitStructure.EXTI_Line=EXTI_Line1; //中斷線源
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //中斷
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising; //上升沿觸發(fā)中斷
EXTI_InitStructure.EXTI_LineCmd=ENABLE;//中斷線使能
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn;//外部中斷1
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//搶占優(yōu)先級(jí) 數(shù)字越小,優(yōu)先級(jí)越高,優(yōu)先級(jí)高的優(yōu)先執(zhí)行。
NVIC_InitStructure.NVIC_IRQChannelSubPriority=15; //響應(yīng)優(yōu)先級(jí)
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//使能外部中斷通道
NVIC_Init(&NVIC_InitStructure);//配置NVIC
搶占優(yōu)先級(jí)高的中斷可以打斷搶占優(yōu)先級(jí)低的中斷,這時(shí)是不用管響應(yīng)優(yōu)先級(jí)的;響應(yīng)優(yōu)先級(jí)只是在兩個(gè)或者多個(gè)搶占優(yōu)先級(jí)相同的中斷同時(shí)到來時(shí)進(jìn)入響應(yīng)優(yōu)先級(jí)高的中斷,而如果進(jìn)入這個(gè)中斷之后再來一個(gè)搶占優(yōu)先級(jí)相同但是響應(yīng)優(yōu)先級(jí)更高的中斷,則不會(huì)打斷已有的中斷。
總之就是搶占優(yōu)先級(jí)不同的時(shí)候看搶占優(yōu)先級(jí)級(jí)數(shù),先響應(yīng)搶占優(yōu)先級(jí)高的中斷,而且搶占優(yōu)先級(jí)高的中斷可以打斷搶占優(yōu)先級(jí)低的中斷;當(dāng)搶占優(yōu)先級(jí)相同的時(shí)候看響應(yīng)優(yōu)先級(jí)級(jí)數(shù),先響應(yīng)響應(yīng)優(yōu)先級(jí)高的中斷,但是響應(yīng)優(yōu)先級(jí)高的中斷不可以打斷正在執(zhí)行的響應(yīng)優(yōu)先級(jí)低的中斷。
注意: stm32官方給的中斷響應(yīng)函數(shù)(查看文件startup_stm32f30x.s),空函數(shù)名(自己編寫函數(shù)體),不要自己定義新的中斷響應(yīng)函數(shù)。
DCD WWDG_IRQHandler ; Window WatchDog
DCD PVD_IRQHandler ; PVD through EXTI Line detection
DCD TAMPER_STAMP_IRQHandler ; Tamper and TimeStamps through the EXTI line
DCD RTC_WKUP_IRQHandler ; RTC Wakeup through the EXTI line
DCD FLASH_IRQHandler ; FLASH
DCD RCC_IRQHandler ; RCC
DCD EXTI0_IRQHandler ; EXTI Line0
DCD EXTI1_IRQHandler ; EXTI Line1
DCD EXTI2_TS_IRQHandler ; EXTI Line2 and Touch
DCD EXTI3_IRQHandler ; EXTI Line3
DCD EXTI4_IRQHandler ; EXTI Line4
DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1
DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2
DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3
DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4
DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5
DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6
DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7