STM32 外部中斷使用方法總結

richardgann發表於2018-03-23

STM32 中斷分為外部中斷,定時器中斷、串列埠中斷。雖然名字不同,但是原理都是相同的,這一節我們將主要介紹一下外部中斷以及中斷函式的編寫。

按照如下步驟去編寫函式和配置函式即可完成對外部中斷函式的配置。

第一步:配置GPIO,設定為中斷模式。

第二部:配置中斷函式

            1、使能IO口複用功能,選擇帶有中斷的引腳。

            2、設定外部中斷結構體成員。

            3、設定中斷優先順序。

            4、配置中斷服務函式。

例子:按鍵觸發的中斷函式

//GPIO 初始化
void Init_LED(void)
{
GPIO_InitTypeDef GPIO_InitStructure;	//定義一個GPIO結構體變數

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOG, ENABLE);
//使能各個埠時鐘,
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_13;	//板上LED編號 D2、D5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOG, &GPIO_InitStructure);
GPIO_Init(GPIOD, &GPIO_InitStructure);
}



中斷函式編寫
void Init_EXTIX_TI(void)
{

EXTI_InitTypeDef EXTI_InitStructure;	//定義一個EXTI結構體變數
NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);	//使能IO複用功能,使用中斷功能重要!!!

/* 引腳選擇 */
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);//配置埠C的13引腳為中斷源	重要!! 板上標號INT2
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource0); //配置埠E的0引腳為中斷源	重要!! 板上標號INT1


/* 設定外部中斷結構體的成員*/
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;	//中斷模式為中斷模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;	//下降沿觸發
EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line13;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;	//使能中斷線
EXTI_Init(&EXTI_InitStructure);	//根據引數初始化中斷暫存器
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	//設定中斷優先順序分組2

NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;	//設定中斷源為PC13
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;	//中斷佔優先順序為2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;	//副優先順序為0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;	//使能中斷
NVIC_Init(&NVIC_InitStructure);	//根據引數初始化中斷暫存器

NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;	//設定中斷源為PE0
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;	//中斷佔優先順序為1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;	//副優先順序為0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;	//使能中斷
NVIC_Init(&NVIC_InitStructure);	//根據引數初始化中斷暫存器

}

最後為配置中斷服務函式(入口函式、中斷處理函式)

最後一步了,也是很重要的一步,配置中斷服務函式,也有叫什麼入口函式的。說白了,就是你想讓你的這個中斷做什麼。

/*************************************************************
注意,中斷服務程式雖然簡單,但是在寫入口函式的時候,注意函式名的寫法,只有如下3種命名方式。
(1)EXTI0_IRQHandler;EXTI Line 0
EXTI1_IRQHandler;EXTI Line 1
EXTI2_IRQHandler;EXTI Line 2
EXTI3_IRQHandler;EXTI Line 3
EXTI4_IRQHandler;EXTI Line 4
(2)
EXTI9_5_IRQHandler;EXTI Line 5-9
(3)
EXTI15_10_IRQHandler;EXTI Line 10-15

只要是中斷線5後的就不能像前四個那樣命名,他們有自己的方式。
************************************************************/

void EXTI15_10_IRQHandler(void) //pc13中斷服務程式,也是中斷子函式
{
//檢測按鍵之前一般有個消抖延時,直接呼叫下面的延時函式即可

if(EXTI_GetITStatus(EXTI_Line13)!= RESET) //判斷是否發生中斷,發生則中斷標誌置1
{
//	LED1=0;

//	LED2=1;

GPIO_ResetBits(GPIOG, GPIO_Pin_14); //GPIOG設定為低電平,
GPIO_SetBits(GPIOD, GPIO_Pin_13); //GPIOD設定為高電平,其實這一部分也是可以寫在主函式中的,在while那個死迴圈中。

}

EXTI_ClearITPendingBit(EXTI_Line13);	//利用庫函式清除中斷標誌位,進入中斷服務程式之後。首先就是清除標誌位,	
} //否則他會不響應中斷,不進入中斷函式
這就是整個完整的外部中斷處理函式,直接照葫蘆畫瓢就行。

相關文章