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