外部中斷概述
STM32的中斷控制器支持19個外部中斷/事件請求:
- 線0-15:對應外部IO口的輸入中斷
- 線16:連接到PVD輸出
- 線17:連接到RTC鬧鐘事件
- 線18:連接到USB喚醒事件
STM32每個IO口都有可以作為外部中斷輸入,IO口有很多,STM32供IO使用的中斷線只有16個,那么中斷線怎么跟IO口對應呢?
這個時候就要用到端口重映射了
GPIOx.0映射到EXTI0(外部中斷線0)
GPIOx.1映射到EXTI1(外部中斷線1)
…
GPIOx.15映射到EXTI15(外部中斷線15)
怎么使用函數把GPIO口映射到外部中斷線呢?
GPIO_EXTILineConfig可以配置,比如說把PE2映射到EXTI2(中斷線2)
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);//PE2映射到中斷線2
對于每個中斷線,我們可以設置相應的觸發方式以及使能,觸發方式有三種:
- 上升沿觸發
- 下降沿觸發
- 邊沿觸發
一共16個外部中斷線,STM32是否分配16個中斷處理函數呢?
答案是否定的,外部中斷在中斷向量表中只分配了7個中斷向量,也就是說16個外部中斷只分配了7個外部中斷服務函數
外部中斷線5-9分配一個中斷向量,外部中斷線15-10分配一個中斷向量
中斷服務函數如下:
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
EXTI9_5_IRQHandler
EXTI15_10_IRQHandler
外部中斷常用庫函數
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);//設置IO口與中斷線的映射關系exp: GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
//初始化中斷線:觸發方式等ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
//判斷中斷線中斷狀態,是否發生void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
//清除中斷線上的中斷標志位
外部中斷庫函數設置
1.使能外設以及初始化IO口為輸入
GPIO_Init()
- 開啟IO口復用時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE)
- 設置IO口與中斷線的映射關系
void GPIO_EXTILineConfig();
- 初始化線上中斷,設置觸發條件等
EXTI_Init();
- 配置中斷分組(NVIC),并使能中斷
NVIC_Init();
- 編寫中斷服務函數
EXYIx_IRQHandler();
- 清除中斷標志位
EXTI_ClearITPendingBit();