EXTI 簡介
EXTI(External interrupt/event controller)—外部中斷/事件控制器,管理了控制器的 23個中斷/事件線。每個中斷/事件線都對應有一個邊沿檢測器,可以實現輸入信號的上升沿檢測和下降沿的檢測。EXTI可以實現對每個中斷/事件線進行單獨配置,可以單獨配置為中斷或者事件,以及觸發事件的屬性。
EXTI 功能框圖
EXTI的功能框圖包含了 EXTI最核心內容,EXTI可分為兩大部分功能,一個是產生中斷,另一個是產生事件。EXTI功能框圖如下:
中斷/事件線
EXTI有23個中斷/事件線,每個GPIO都可以被設置為輸入線,占用EXTI0至EXTI15,還有另外七根用于特定的外設事件。
EXTI0至EXTI15用于GPIO,通過編程控制可以實現任意一個GPIO作為 EXTI的輸入源。由上圖可知,EXTI0可以通過AFIO的外部中斷配置寄存器 1(AFIO_EXTICR1)的EXTI0[3:0]位選擇配置為PA0、PB0、PC0、PD0、PE0、PF0、PG0、PH0 或者PI0,其他EXTI線(EXTI中斷/事件線)使用配置都是類似的。
外設事件連接模式:
EXTI line 16 連接PVD輸出
EXTI line 17 連接RTC鬧鐘事件
EXTI line 18 連接USB OTG FS喚醒事件
EXTI line 19 連接以太網喚醒事件
EXTI line 20 連接USB OTG HS喚醒事件
EXTI line 21 連接RTC 篡改和時標事件
EXTI line 22 RTC喚醒事件
EXTI 初始化結構體
標準庫函數對每個外設都建立了一個初始化結構體,比如 EXTI_InitTypeDef,結構體成員用于設置外設工作參數,并由外設初始化配置函數,比如 EXTI_Init()調用,這些設定參數將會設置外設相應的寄存器,達到配置外設工作環境的目的。
初始化結構體和初始化庫函數配合使用是標準庫精髓所在,理解了初始化結構體每個成員意義基本上就可以對該外設運用自如了。初始化結構體定義在 cks32f4xx_exti.h 文件中,初始化庫函數定義在 cks32f4xx_exti.c 文件中,編程時我們可以結合這兩個文件內注釋使用。
EXTI操作流程
a)首先配置GPIO引腳模式:
RCC_APB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); /* 配置GPIOA.0 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; /* 配置為輸入模式 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; /* 配置速率為高速模式 */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; /* 使能下拉模式 */ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; /* 調用初始化函數 */ GPIO_Init(GPIOA, &GPIO_InitStructure);typedefstruct
b)配置EXTI line0中斷線連接GPIOA.0:
typedefstrucSYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, GPIO_PinSource0); t
c)配置中斷線為中斷模式,上升沿觸發模式并使能:
EXTI_InitTypeDefEXTI_Structure; EXTI_StructInit(&EXTI_Structure); /* 配置中斷線0 */ EXTI_Structure.EXTI_Line = EXTI_Line0; /* 使用中斷模式 */ EXTI_Structure.EXTI_Mode = EXTI_Mode_Interrupt; /* 電壓低于閥值時產生中斷 */ EXTI_Structure.EXTI_Trigger = EXTI_Trigger_Raising; /* 使能中斷線 */ EXTI_Structure.EXTI_LineCmd = ENABLE; /* 初始化中斷 */ EXTI_Init(&EXTI_Structure);
d)配置中斷管理器NVIC,設置EXTI0_IRQn中斷源優先級并初始化:
Svoid NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; /* 嵌套向量中斷控制器組選擇 */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /* 配置EXTI0_IRQn中斷源 */ NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; /* 搶斷優先級為1 */ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; /* 子優先級為1 */ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; /* 使能中斷 */ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /* 初始化配置NVIC */ NVIC_Init(&NVIC_InitStructure); } NVIC_PriorityGroupConfig(NVYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, GPIO_PinSource0);
e)當產生 EXTI0中斷,在中斷程序中進行相應的處理:
typvoid EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0) != RESET) { EXTI_ClearITPendingBit(EXTI_Line0); /*添加用戶處理代碼*/ } } edefstruct
審核編輯:湯梓紅
-
控制器
+關注
關注
112文章
16445瀏覽量
179454 -
中斷
+關注
關注
5文章
900瀏覽量
41753 -
GPIO
+關注
關注
16文章
1216瀏覽量
52379 -
輸入信號
+關注
關注
0文章
469瀏覽量
12608 -
EXTI
+關注
關注
0文章
27瀏覽量
3707
原文標題:MCU微課堂 | CKS32F4xx系列產品EXTI應用
文章出處:【微信號:中科芯MCU,微信公眾號:中科芯MCU】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論