一、外部中斷介紹
1.1 EXTI簡介
EXTI簡介 STM32F10x外部中斷/事件控制器(EXTI)包含多達 20 個用於產生事 件/中斷請求的邊沿檢測器。EXTI的每根輸入線都可單獨進行配置,以選 擇類型(中斷或事件)和相應的觸發事件(上升沿觸發、下降沿觸發或 邊沿觸發),還可獨立地被屏蔽。(stm32f103有19個)
1.2 EXTI結構框圖
1.3 外部中斷/事件線映射
STM32F10x的EXTI具有20個中斷/事件線,如下:(stm32f103有19個以太網喚醒事件沒有;stm32f107有20個)
二、外部中斷配置步驟
(1)使能IO口時鍾,配置IO口模式為輸入
(2)開啟 AFIO 時鍾,設置 IO 口與中斷線的映射關系
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //開啟AFIO時鍾
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource); //設置IO 口與中斷線的映射關系即哪個io口哪一個管腳作為中斷輸入線
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //這里以配置GPIOA口 GPIOA的第0管腳作為中斷輸入線
(3)配置中斷分組(NVIC),使能中斷
(4)初始化EXTI,選擇觸發方式
1 void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct); 2 typedef struct
3 { 4 uint32_t EXTI_Line; //中斷/事件線
5 EXTIMode_TypeDef EXTI_Mode; //EXTI模式
6 EXTITrigger_TypeDef EXTI_Trigger; //EXTI觸發方式
7 FunctionalState EXTI_LineCmd; //中斷線使能或失能
8 }EXTI_InitTypeDef;
(5)編寫EXTI中斷服務函數(中斷函數固件庫中已經定義必須使用下列函數名不能自己定義)
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
EXTI9_5_IRQHandler
EXTI15_10_IRQHandler
三、編寫外部中斷控制程序 要實現外部中斷方式控制LED,程序框架如下:
(1)初始化對應端口的EXTI(第三部分中的1-4小步)
(2)編寫EXTI中斷函數
(3)編寫主函數
1 /******************************************************************************* 2 * 函 數 名 : My_EXTI_Init 3 * 函數功能 : 外部中斷初始化 4 * 輸 入 : 無 5 * 輸 出 : 無 6 *******************************************************************************/ 7 void My_EXTI_Init(void) 8 { 9 NVIC_InitTypeDef NVIC_InitStructure; 10 EXTI_InitTypeDef EXTI_InitStructure; 11 12 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //AFIO使能 13 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//選擇GPIO管腳用作外部中斷線路 14 //EXTI0 NVIC 配置 15 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//EXTI0中斷通道 16 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//搶占優先級 17 NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子優先級 18 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 19 NVIC_Init(&NVIC_InitStructure); //根據指定的參數初始化VIC寄存器 20 //初始化EXTI 配置 21 EXTI_InitStructure.EXTI_Line=EXTI_Line0; 22 EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; 23 EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising; 24 EXTI_InitStructure.EXTI_LineCmd=ENABLE; 25 EXTI_Init(&EXTI_InitStructure); 26 }
1 /******************************************************************************* 2 * 函 數 名 : EXTI0_IRQHandler 3 * 函數功能 : 外部中斷0函數 4 * 輸 入 : 無 5 * 輸 出 : 無 6 *******************************************************************************/
7 void EXTI0_IRQHandler(void) 8 {
9 if(EXTI_GetITStatus(EXTI_Line3)==1) //判斷EXTI中斷標志位狀態函數
10 {
11 //填寫中斷中需要完成的程序
12 }
13 EXTI_ClearITPendingBit(EXTI_Line3); //在結束中斷服務函數前,清楚中斷標志位 14
15 }