參考資料:STM32數據手冊、網絡資料
=========================================切割線=========================================
外部中斷/事件控制器由19個產生事件/中斷要求的邊沿檢測器組成。每一個輸入線能夠獨立地配置
輸入類型(脈沖或掛起)和相應的觸發事件(上升沿或下降沿或者雙邊沿都觸發)。每一個輸入線都能夠被獨
立的屏蔽。掛起寄存器保持着狀態線的中斷要求。
=========================================切割線=========================================
19個中斷例如以下:
17——EXTI線16連接到PVD輸出
18——EXTI線17連接到RTC鬧鍾事件
19——EXTI線18連接到USB喚醒事件
注:有上圖可知EXTI0連接的引腳為PA0、PB0、PC0、PD0、PE0、PF0、PG0,其它外部中斷EXTI1——
EXTI15類似。所以在使用時盡量將須要的外部中斷配置在不同的EXTIx上。
比如須要3個外部中斷,我們能夠配置到PA0、PB4、PG3上。此時每一個中斷都有自己的中斷處理程
序段。假設配置到PA0、PB0、PC1。則PA0和PB0將公用一個中斷程序段。
當然假設特殊須要,也
能夠這樣設計。
=========================================切割線=========================================
配置用法:
- 初始化對應的GPIO管腳
- 配置外部中斷源並進行中斷源和GPIO的連接
- 編寫對應中斷源的中斷處理程序
=========================================切割線=========================================
程序代碼
- 初始化對應的GPIO管腳
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
注:GPIO的復用功能必須打開,如紅字部分
- 配置外部中斷源並進行中斷源和GPIO的連接
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource0);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource1);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource8);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource9);
EXTI_InitStructure.EXTI_Line =EXTI_Line0|EXTI_Line1|EXTI_Line8|EXTI_Line9;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
- 編寫對應中斷源的中斷處理程序
void EXTI0_IRQHandler(void)
{
if(Sys_Status > MIN_STATUS)
{
Sys_Status--;
}
EXTI_ClearITPendingBit(EXTI_Line0);
}
void EXTI1_IRQHandler(void)
{
PEout(2) = ~PEout(2);
EXTI_ClearITPendingBit(EXTI_Line1);
}
#define Exti_From_Pin8 0x00000100
#define Exti_From_Pin9 0x00000200
void EXTI9_5_IRQHandler(void)
{
u32 Temp = 0x00;
PEout(2) = ~PEout(2);
Temp =EXTI->PR; //取讀是那個引腳的中斷
switch(Temp)
{
caseExti_From_Pin8:
EXTI_ClearITPendingBit(EXTI_Line8);
break;
caseExti_From_Pin9:
if(Sys_Status < MAX_STATUS)
{
Sys_Status ++;
}
EXTI_ClearITPendingBit(EXTI_Line9);
break;
default:break;
}
}
=========================================切割線=========================================
中斷處理程序說明。因為外部中斷EXTI5——EXTI9公用了一個中斷(EXTI10——EXTI15類似)所以要
區分不同的中斷源須要進行對應的推斷。
如上EXTI9_5_IRQHandler中,通過取讀EXTI->PR寄存器來判
斷中斷的來源。
轉自http://blog.sina.com.cn/s/blog_6623834301018woa.html

