(stm32f103學習總結)—stm32外部中斷


一、外部中斷介紹

1.1 EXTI簡介

  EXTI簡介 STM32F10x外部中斷/事件控制器(EXTI)包含多達 20 個用於產生事 件/中斷請求的邊沿檢測器。EXTI的每根輸入線都可單獨進行配置,以選 擇類型(中斷或事件)和相應的觸發事件(上升沿觸發、下降沿觸發或 邊沿觸發),還可獨立地被屏蔽。(stm32f103有19個)

1.2 EXTI結構框圖

 

1.3 外部中斷/事件線映射

  STM32F10x的EXTI具有20個中斷/事件線,如下:(stm32f103有19個以太網喚醒事件沒有;stm32f107有20個)

   STM32F10x 的 EXTI 供外部 IO 口使用的中斷線有 16 根,但是我們使用的 STM32F103 芯片卻遠遠不止 16 個 IO 口,那么 STM32F103 芯片怎么解決這個問題的呢?
  因為 STM32F103 芯片每個 GPIO 端口均有 16 個管腳,因此把每個 端 口 的 16 個 IO 對 應 那 16 根 中 斷 線 EXTI0-EXTI15 。 比 如 :GPIOx.0-GPIOx.15(x=A,B,C,D,E,F,G)分別對應中斷線 EXTI0-EXTI15,這樣一來每個中斷線就對應了最多 7 個 IO 口,比如:GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。但是中斷線每次只能連接一個在 IO 口上,這樣就需要通過 AFIO 的外部中斷配置寄存器 1 的 EXTIx[3:0]位來決定對應的中斷線映射到哪個 GPIO 端口上,對於中斷線映射到 GPIO 端口上的配置函數在stm32f10x_gpio.c 和 stm32f10x_gpio.h 中,所以使用到外部中斷時要把這個文件加入到工程中,在創建庫函數模板的時候我們默認已經添加。EXTI 的 GPIO 映 射圖如圖 18.1.3 所示:

 

二、外部中斷配置步驟

  要使用外部中斷我們就需要先配置它,通常都需經過這幾步:

(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 }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM