STM32學習之外部中斷
下面介紹一下今天的使用總結:
STM32中,每一個GPIO都可以觸發(fā)一個外部中斷,但是,GPIO的中斷是以組位一個單位的,同組間的外部中斷同一時間只能使用一個。比如說,PA0,PB0,PC0,PD0,PE0,PF0,PG0這些為1組,如果我們使用PA0作為外部中斷源,那么別的就不能夠再使用了,在此情況下,我們智能使用類似于PB1,PC2這種末端序號不同的外部中斷源。每一組使用一個中斷標志EXTIx。EXTI0 – EXTI4這5個外部中斷有著自己的單獨的中斷響應函數(shù),EXTI5-9共用一個中斷響應函數(shù),EXTI10-15共用一個中斷響應函數(shù)。
上面這一段話把外部中斷介紹的很詳細。要注意的是紅字部分,今天我使用的外部中斷管腳是PB.7 PB.8 PB.9 這幾個管腳正好對應在一個中斷響應函數(shù)里EXTI5-9。
//選擇中斷管腳PB.7 PB.8 PB.8
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource7);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource8);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource9);
EXTI_InitStructure.EXTI_Line = EXTI_Line7 | EXTI_Line8 | EXTI_Line9; //選擇中斷線路7 8 9
在這里我出錯了EXTI_InitStructure.EXTI_Line 選中的中斷管腳要和GPIO_EXTILineConfig 選中的管腳保持一致 也就是上面說的
我們智能使用類似于PB1,PC2這種末端序號不同的外部中斷源這句話。
源代碼如下
/*
********************************************************************************
** 函數(shù)名稱 : void EXTI_Configuration(void))
** 函數(shù)功能 : 外部中斷初始化
** 輸 入 : 無
** 輸 出 : 無
** 返 回 : 無
********************************************************************************
*/
void EXTI_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //復用時鐘
//清空中斷標志
EXTI_ClearITPendingBit(EXTI_Line2);
EXTI_ClearITPendingBit(EXTI_Line3);
EXTI_ClearITPendingBit(EXTI_Line5);
//選擇中斷管腳PB.7 PB.8 PB.8
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource7);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource8);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource9);
EXTI_InitStructure.EXTI_Line = EXTI_Line7 | EXTI_Line8 | EXTI_Line9; //選擇中斷線路7 8 9
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //設置為中斷請求,非事件請求
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //設置中斷觸發(fā)方式為下降沿觸發(fā)
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //外部中斷使能
EXTI_Init(&EXTI_InitStructure);
}
void EXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line7) != RESET)
{
//添加中斷處理程序
//點亮LED燈
PC1_H;
PC3_H;
PC13_L;
EXTI_ClearFlag(EXTI_Line7);
EXTI_ClearITPendingBit(EXTI_Line7);
}
if(EXTI_GetITStatus(EXTI_Line8) != RESET)
{
//添加中斷處理程序
//點亮LED燈
PC1_H;
PC3_L;
PC13_H;
EXTI_ClearFlag(EXTI_Line8);
EXTI_ClearITPendingBit(EXTI_Line8);
}
if(EXTI_GetITStatus(EXTI_Line9) != RESET)
{
//添加中斷處理程序
//點亮LED燈
PC1_L;
PC3_H;
PC13_H;
EXTI_ClearFlag(EXTI_Line9);
EXTI_ClearITPendingBit(EXTI_Line9);
}
}
評論