STM32--外部中斷

m0_37768370發表於2020-10-12

STM32的每個IO都可以作為外部中斷的中斷輸入口,
F103支援19個外部中斷請求分別是:
線 0~15:對應外部 IO 口的輸入中斷。
線 16:連線到 PVD 輸出。
線 17:連線到 RTC 鬧鐘事件。
線 18:連線到 USB 喚醒事件。

每條中斷線對應GPIOx的對應位,具體x是多少需要具體設定,配置 GPIO 與中斷線的對映關係的函式 GPIO_EXTILineConfig()來實現的:
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
將中斷線 2 與 GPIOE 對映起來,那麼很顯然是 GPIOE.2 與 EXTI2 中斷線連線了
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);

中斷線上中斷的初始化通過EXTI_Init()實現。
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
示例:
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line=EXTI_Line4; //中斷線標號
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中斷模式(Interrupt和Event)
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //觸發方式(下降沿Falling,上升沿Rising或任意電平Rising_Falling)
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

涉及到中斷還得配置NVIC(看第三天串列埠)(EXTI2_IRQn)

中斷函式(6個)

EXPORT EXTI0_IRQHandler
EXPORT EXTI1_IRQHandler
EXPORT EXTI2_IRQHandler
EXPORT EXTI3_IRQHandler
EXPORT EXTI4_IRQHandler
EXPORT EXTI9_5_IRQHandler
EXPORT EXTI15_10_IRQHandler

中斷線 0-4 每個中斷線對應一箇中斷函式,中斷線 5-9 共用中斷函式 EXTI9_5_IRQHandler,中
斷線 10-15 共用中斷函式 EXTI15_10_IRQHandler。

判斷某個中斷線上的中斷是否發生(標誌位是否置位):
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
清除某個中斷線上的中斷標誌位:
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
常用的中斷服務函式格式:

void EXTI2_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line2)!=RESET)//判斷某個線上的中斷是否發生
	{
		中斷邏輯…
		EXTI_ClearITPendingBit(EXTI_Line2); //清除 LINE 上的中斷標誌位
	} 
}

總結
使用 IO 口外部中斷的一般步驟:
1)初始化 IO 口為輸入。
2)開啟 IO 口複用時鐘,設定 IO 口與中斷線的對映關係。
3)初始化線上中斷,設定觸發條件等。
4)配置中斷分組(NVIC),並使能中斷。
5)編寫中斷服務函式。

按鍵上拉輸入,中斷要配置下降沿,按鍵下拉輸入,中斷要配置上升沿
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//外部中斷,需要使能AFIO時鐘

相關文章