一、前言
在之前針對STM32的GPIO相關(guān)API函數(shù)及配置使用進(jìn)行了詳細(xì)的介紹,GPIO作為輸入引腳時,調(diào)用相關(guān)讀信號引腳函數(shù)接口就可以在程序的循環(huán)中,輪詢的對輸入信號進(jìn)行讀取檢測操作,除了輪詢的方式訪問輸入引腳,還可以通過另外一種叫做外部中斷的方式來對引腳的輸入信號進(jìn)行檢測,本篇首先介紹下EXTI的結(jié)構(gòu),接著介紹外部中斷的相關(guān)概念, 對STM32的IO外部中斷EXTI有個初步的了解,在此基礎(chǔ)上重點圍繞IO外部中斷EXTI的使用展開分析。
圖1 外部中斷設(shè)計
二、EXTI結(jié)構(gòu)
EXTI(External interrupt/event controller)—外部中斷/事件控制器,管理了控制器的 20個中斷/事件線。 每個中斷/事件線都對應(yīng)有一個邊沿檢測器,可以實現(xiàn)輸入信號的上升沿檢測和下降沿的檢測。 EXTI 可以實現(xiàn)對每個中斷/事件線進(jìn)行單獨配置,可以單獨配置為中斷或者事件,以及觸發(fā)事件的屬性。
在圖2可以看到很多在信號線上打一個斜杠并標(biāo)注“20”字樣,這個表示在控制器內(nèi)部類似的信號線路有 20 個,這與 EXTI 總共有 20 個中斷/事件線是吻合的。 所以我們只要明白其中一個的原理,那其他 19 個線路原理也就知道了。
圖2 EXTI結(jié)構(gòu)
EXTI 可分為兩大部分功能,一個是產(chǎn)生中斷,另一個是產(chǎn)生事件,這兩個功能從硬件上就有所不同。
中斷和事件的區(qū)別:
事件:某一信號出現(xiàn),比如上升沿或者下降沿。 不一定觸發(fā)中斷。
中斷:某一的事件發(fā)生,并產(chǎn)生中斷,然后跳到相應(yīng)的中斷服務(wù)函數(shù)中進(jìn)行相應(yīng)的處理。
首先我們來看圖中紅色虛線指示的電路流程。 它是一個產(chǎn)生中斷的線路,最終信號流入到 NVIC 控制器內(nèi)。
編號 1 是輸入線,EXTI 控制器有 19 個中斷/事件輸入線,這些輸入線可以通過寄存器設(shè)置為任意一個 GPIO,也可以是一些外設(shè)的事件,這部分內(nèi)容我們將在后面專門講解。 輸入線一般是存在電平變化的信號。
編號 2 是一個邊沿檢測電路,它會根據(jù)上升沿觸發(fā)選擇寄存(EXTI_RTSR)和下降沿觸發(fā)選擇寄存器(EXTI_FTSR)對應(yīng)位的設(shè)置來控制信號觸發(fā)。 邊沿檢測電路以輸入線作為信號輸入端,如果檢測到有邊沿跳變就輸出有效信號 1 給編號 3 電路,否則輸出無效信號0。 而 EXTI_RTSR 和 EXTI_FTSR 兩個寄存器可以控制器需要檢測哪些類型的電平跳變過程,可以是只有上升沿觸發(fā)、只有下降沿觸發(fā)或者上升沿和下降沿都觸發(fā)。
編號 3 電路實際就是一個或門電路,它一個輸入來自編號 2 電路,另外一個輸入來自軟件中斷事件寄存器(EXTI_SWIER)。 EXTI_SWIER允許我們通過程序控制就可以啟動中斷/事件線,這在某些地方非常有用。 我們知道或門的作用就是有 1 就為 1,所以這兩個輸入隨便一個有有效信號 1就可以輸出 1 給編號 4和編號 6電路。
編號 4 電路是一個與門電路,它一個輸入是編號 3 電路,另外一個輸入來自中斷屏蔽寄存器(EXTI_IMR)。 與門電路要求輸入都為 1 才輸出 1,導(dǎo)致的結(jié)果是如果EXTI_IMR 設(shè)置為 0 時,那不管編號 3 電路的輸出信號是 1 還是 0,最終編號 4 電路輸出的信號都為 0;如果EXTI_IMR設(shè)置為1時,最終編號4電路輸出的信號才由編號3電路的輸出信號決定,這樣我們可以簡單的控制 EXTI_IMR 來實現(xiàn)是否產(chǎn)生中斷的目的。 編號 4 電路輸出的信號會被保存到掛起寄存器(EXTI_PR)內(nèi),如果確定編號 4 電路輸出為 1 就會把 EXTI_PR 對應(yīng)位置1。
編號 5 是將 EXTI_PR 寄存器內(nèi)容輸出到 NVIC 內(nèi),從而實現(xiàn)系統(tǒng)中斷事件控制。
接下來我們來看看綠色虛線指示的電路流程。 它是一個產(chǎn)生事件的線路,最終輸出一個脈沖信號。 產(chǎn)生事件線路是在編號3電路之后與中斷線路有所不同,之前電路都是共用的。
編號6電路是一個與門,它一個輸入來自編號 3 電路,另外一個輸入來自事件屏蔽寄存器(EXTI_EMR)。 如果 EXTI_EMR設(shè)置為 0時,那不管編號 3電路的輸出信號是 1還是 0,最終編號 6 電路輸出的信號都為 0;如果EXTI_EMR 設(shè)置為 1 時,最終編號 6 電路輸出的信號才由編號 3 電路的輸出信號決定,這樣我們可以簡單的控制 EXTI_EMR 來實現(xiàn)是否產(chǎn)生事件的目的。
編號 7 是一個脈沖發(fā)生器電路,當(dāng)它的輸入端,即編號 6 電路的輸出端,是一個有效信號 1 時就會產(chǎn)生一個脈沖; 如果輸入端是無效信號就不會輸出脈沖。
編號 8 是一個脈沖信號,就是產(chǎn)生事件的線路最終的產(chǎn)物,這個脈沖信號可以給其他外設(shè)電路使用,比如定時器 TIM、模擬數(shù)字轉(zhuǎn)換器 ADC等等,這樣的脈沖信號一般用來觸發(fā) TIM 或者 ADC開始轉(zhuǎn)換。
產(chǎn)生中斷線路目的是把輸入信號輸入到 NVIC,進(jìn)一步會運行中斷服務(wù)函數(shù),實現(xiàn)功能,這樣是軟件級的。 而產(chǎn)生事件線路目的就是傳輸一個脈沖信號給其他外設(shè)使用,并且是電路級別的信號傳輸,屬于硬件級的。
另外,EXTI是在 APB2總線上的,在編程時候需要注意到這點。
三、IO外部中斷概念
外部中斷是單片機實時地處理外部事件的一種內(nèi)部機制。 當(dāng)某種外部事件發(fā)生時,單片機的中斷系統(tǒng)將迫使CPU暫停正在執(zhí)行的程序,轉(zhuǎn)而去進(jìn)行中斷事件的處理; 中斷處理完畢后. 又返回被中斷的程序處,繼續(xù)執(zhí)行下去。
圖3 外部中斷概念內(nèi)容
1、外部中斷映射
外部中斷/事件控制器EXTI包含多達(dá) 23 個用于產(chǎn)生事件/中斷請求的邊沿檢測器。 每根輸入線都可單獨進(jìn)行配置,以選擇類型(中斷或事件)和相應(yīng)的觸發(fā)事件(上升沿觸發(fā)、下降沿觸發(fā)或邊沿觸發(fā))。 每根輸入線還可單獨屏蔽。
以STM32F407為例,支持多達(dá) 23 個軟件事件/中斷請求,這些事件/中斷請求通過EXTI線輸入到EXTI控制器中去,其中各EXTI線連接如下:
EXTI_Line0~15:連接外部 GPIO 口的輸入中斷。
EXTI_Line16:連接到 PVD 輸出
EXTI_Line17:連接到 RTC 鬧鐘事件
EXTI_Line18:連接到 USB OTG FS 喚醒事件
EXTI_Line19:連接到以太網(wǎng)喚醒事件
EXTI_Line20:連接到 USB OTG HS(在 FS 中配置)喚醒事件
EXTI_Line21:連接到 RTC 入侵和時間戳事件
EXTI_Line22:連接到 RTC 喚醒事件
我們在這里重點討論的是GPIO口的輸入中斷,因此EXTI_Line16 ~ EXTI_Line22不是本文討論的重點。 STM32的每個GPIO引腳都可以作為外部中斷輸入,STM32的GPIO口引腳多達(dá)幾十個甚至上百個,因此既然每個GPIO引腳都可以作為外部中斷輸入,而EXTI_Line0 ~15只有16個,因此IO引腳和外部中斷線的對應(yīng)關(guān)系如下:
圖4 外部中斷/事件 GPIO 映射
從圖4中可以看出,由于STM32每個GPIO端口都有16個pin引腳,因此EXTI_Line0 ~ 15對應(yīng)的是引腳pin0 ~ pin15。 例如EXTI_Line0對應(yīng)GPIOA0 ~ GPIOI0,因此類推EXTI_Line1對應(yīng)GPIOA1~ GPIOI1,因此每個EXTI_Line可以對應(yīng)最多9個pin引腳,具體映射到那個pin引腳上,需要進(jìn)行相應(yīng)的配置。
2、外部中斷寄存器
(1)、中斷屏蔽寄存器EXTI_IMR
圖5為斷屏蔽寄存器定義,本寄存器用于打開和關(guān)閉外部中斷的請求,0~22位有效,對應(yīng)之前提到的23個外部中斷請求,對應(yīng)的位寫0時,關(guān)閉外部中斷請求; 對應(yīng)位寫1時,打開外部中斷請求。
圖5 中斷屏蔽寄存器定義
(2)、事件屏蔽寄存器EXTI_EMR
圖6為事件屏蔽寄存器定義,本寄存器用于打開和關(guān)閉外部事件的請求,0~22位有效,對應(yīng)之前提到的23個外部事件請求,對應(yīng)的位寫0時,關(guān)閉外部事件請求; 對應(yīng)位寫1時,打開外部事件請求。 事件只是一個觸發(fā)信號,它作為中斷的觸發(fā)源,可以觸發(fā)中斷,也可以不觸發(fā)中斷,打開對應(yīng)EXTI_IMR的中斷屏蔽位,那么事件可以觸發(fā)對應(yīng)的中斷。 只有觸發(fā)了中斷后,程序才會跳轉(zhuǎn)到對應(yīng)的中斷處理程序中去。
圖6 事件屏蔽寄存器定義
(3)、上升沿觸發(fā)選擇寄存器EXTI_RTSR
圖7為上升沿觸發(fā)選擇寄存器定義,本寄存器用于設(shè)置外部中斷的觸發(fā)事件是信號的上升沿,0~22位有效,對應(yīng)之前提到的23個外部事件請求,對應(yīng)的位寫0時,關(guān)閉外部事件信號上升沿請求,不可以觸發(fā)信號上升沿中斷; 對應(yīng)位寫1時,打開外部信號上升沿請求,可以觸發(fā)信號上升沿中斷。
圖7 上升沿觸發(fā)選擇寄存器定義
(4)、下降沿觸發(fā)選擇寄存器EXTI_FTSR
圖8為下降沿觸發(fā)選擇寄存器定義,本寄存器用于設(shè)置外部中斷的觸發(fā)事件是信號的下降沿,0~22位有效,對應(yīng)之前提到的23個外部事件請求,對應(yīng)的位寫0時,關(guān)閉外部事件信號下降沿請求,不可以觸發(fā)信號下降沿中斷; 對應(yīng)位寫1時,打開外部信號下降沿請求,可以觸發(fā)信號下降沿中斷。
圖8 下降沿觸發(fā)選擇寄存器定義
(5)、軟件中斷事件寄存器EXTI_SWIER
圖9為軟件中斷事件寄存器定義,本寄存器可以用軟件程序的方式來觸發(fā)事件中斷的產(chǎn)生,用來模擬外部實際事件中斷的產(chǎn)生,0~22位有效,對應(yīng)之前提到的23個外部事件請求,對應(yīng)位寫1時,用于模擬外部事件的產(chǎn)生,對應(yīng)位寫0時,用于復(fù)位事件狀態(tài),下次可以再寫1產(chǎn)生事件。 因此,這個寄存器是用軟件程序模擬外部實際事件的產(chǎn)生從而觸發(fā)中斷,當(dāng)然前提是打開了IMR和EMR。
圖9 軟件中斷事件寄存器定義
(6)、掛起寄存器EXTI_PR
圖10為掛起寄存器寄存器定義,本寄存器可以標(biāo)志是否產(chǎn)生了外部中斷事件請求,同時可以通過向?qū)?yīng)位寫1來清除中斷事件,0~22位有效,對應(yīng)之前提到的23個外部事件請求,讀到對應(yīng)位為1時,表示發(fā)生了外部事件中斷; 讀到對應(yīng)位為1時,表示沒有發(fā)生外部事件中斷。 因此一旦觸發(fā)中斷條件就對應(yīng)位被置為1,不過要在中斷服務(wù)函數(shù)里面向?qū)?yīng)位寫1清除中斷,不然就導(dǎo)致會一直進(jìn)入中斷。
圖10 掛起寄存器定義
3、外部中斷API函數(shù)
本節(jié)所介紹的STM32的EXTI函數(shù)接口是STM32標(biāo)準(zhǔn)庫的函數(shù)接口,在詳細(xì)介紹各個API函數(shù)接口功能之前,我們需要對函數(shù)接口中使用到的關(guān)鍵的參數(shù)進(jìn)行分析。
EXTI_InitTypeDef* EXTI_InitStruct
這個參數(shù)是EXTI函數(shù)端口需要初始化的功能參數(shù)的結(jié)構(gòu)體指針,下面我們看看這個結(jié)構(gòu)體的定義。
typedef struct
{
uint32_t EXTI_Line; //外部中斷事件連接線
EXTIMode_TypeDef EXTI_Mode; //外部中斷事件模式
EXTITrigger_TypeDef EXTI_Trigger; //邊沿事件觸發(fā)方式
FunctionalState EXTI_LineCmd; //外部中斷事件連接線開關(guān)
}EXTI_InitTypeDef;
(a)、外部中斷事件連接線:可選范圍為EXTI_Line0~EXTI_Line15。
(b)、外部中斷事件模式:用于選擇發(fā)生EXTI的模式,可選的模式如下。
typedef enum
{
EXTI_Mode_Interrupt = 0x00, //中斷模式
EXTI_Mode_Event = 0x04 //事件模式
}EXTIMode_TypeDef;
(c)、邊沿事件觸發(fā)方式:用于選擇外部IO輸入時信號邊沿觸發(fā)事件的方式。
typedef enum
{
EXTI_Trigger_Rising = 0x08, //信號上升沿觸發(fā)
EXTI_Trigger_Falling = 0x0C, //信號下降沿觸發(fā)
EXTI_Trigger_Rising_Falling = 0x10 //信號雙邊沿觸發(fā)
}EXTITrigger_TypeDef;
(d)、外部中斷事件連接線開關(guān):用于打開和關(guān)閉外部中斷事件連接線。
typedef enum
{
DISABLE = 0, //關(guān)閉外部中斷事件連接線
ENABLE = !DISABLE //打開外部中斷事件連接線
} FunctionalState;
下面就對具體的函數(shù)接口進(jìn)行逐個的介紹。 由于使用的是STM32的標(biāo)準(zhǔn)庫,EXTI相關(guān)的函數(shù)及配置定義和可以調(diào)用的接口放置在官方提供的標(biāo)準(zhǔn)庫文件 stm32fxx_exti.c和頭文件 stm32fxx_exti.h 文件中。
(1)、無效EXTI_DeInit(無效);
作用:將EXTI的各個寄存器值恢復(fù)到復(fù)位值,各個寄存器復(fù)位值如下。
EXTI->IMR = 0x00000000;
EXTI->EMR = 0x00000000;
EXTI->RTSR = 0x00000000;
EXTI->FTSR = 0x00000000;
EXTI->PR = 0x007FFFFF;
(2)、無效EXTI_Init(EXTI_InitTypeDef EXTI_InitStruct); *
作用:對外部中斷的中斷線進(jìn)行初始化操作。
舉例:
EXTI_InitStructure.EXTI_Line = EXTI_Line2; //外部中斷事件連接線為EXTI2
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//EXTI模式為外部中斷模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //外部IO輸入信號為下降沿觸發(fā)
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//打開外部中斷事件連接線
EXTI_Init(&EXTI_InitStructure);
(3)、無效EXTI_StructInit(EXTI_InitTypeDef EXTI_InitStruct); *
作用:獲取EXTI的一個默認(rèn)狀態(tài),可應(yīng)用于某個外部中斷事件上。 該函數(shù)內(nèi)部默認(rèn)狀態(tài)如下。
EXTI_InitStruct->EXTI_Line = EXTI_LINENONE; //外部中斷事件連接線為無
EXTI_InitStruct->EXTI_Mode = EXTI_Mode_Interrupt;//EXTI模式為外部中斷模式
EXTI_InitStruct->EXTI_Trigger = EXTI_Trigger_Falling;//外部IO輸入信號為下降沿觸發(fā)
EXTI_InitStruct->EXTI_LineCmd = DISABLE;//關(guān)閉外部中斷事件連接線
舉例:EXTI_StructInit(&exti_InitStruct),使用exti_InitStruct快速獲取到了外部中斷事件默認(rèn)狀態(tài)值。
(4)、無效EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);
作用:使用軟件的方式模擬產(chǎn)生一個外部中斷,前提是使能了EXTI_IMR和EXTI_EMR。
舉例:EXTI_GenerateSWInterrupt(EXTI_Line2),通過軟件方式在EXTI_Line2上產(chǎn)生了一個中斷。
(5)、國旗狀態(tài)EXTI_GetFlagStatus(uint32_t EXTI_Line);
作用:檢測外部事件標(biāo)志位,判斷外部事件是否產(chǎn)生。 FlagStatus=RESET,事件未產(chǎn)生; FlagStatus=SET,事件產(chǎn)生。
舉例:status = EXTI_GetFlagStatus(EXTI_Line2),檢測EXTI_Line2上外部事件標(biāo)志位。
(6)、無效EXTI_ClearFlag(uint32_t EXTI_Line);
作用:清除外部事件標(biāo)志位。
舉例:EXTI_ClearFlag(EXTI_Line2),清除EXTI_Line2外部事件標(biāo)志位。
(7)、ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
作用:檢測外部中斷標(biāo)志位,判斷外部中斷是否產(chǎn)生。 ITStatus =RESET,中斷未產(chǎn)生; ITStatus=SET,中斷產(chǎn)生。
舉例:status = EXTI_GetITStatus(EXTI_Line2),檢測EXTI_Line2上外部中斷標(biāo)志位。
(8)、無效EXTI_ClearITPendingBit(uint32_t EXTI_Line);
作用:清除外部中斷標(biāo)志位。
舉例:EXTI_ClearITPendingBit(EXTI_Line2),清除EXTI_Line2外部中斷標(biāo)志位。
四、IO外部中斷使用
圖11 IO外部中斷配置使用內(nèi)容
(1)、初始化相應(yīng)的GPIO引腳
需要按照GPIO的普通IO輸入進(jìn)行引腳的初始化,同時使能對用GPIO的外設(shè)時鐘。
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA的外設(shè)時鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//設(shè)置使用引腳
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通IO輸入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//根據(jù)實際應(yīng)用配置輸出速度
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//根據(jù)實際應(yīng)用配置上拉或下拉電阻
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化PA1引腳
(2)、初始系統(tǒng)配置控制器SYSCFG
系統(tǒng)配置控制器SYSCFG可以用于管理GPIO外部中斷線連接。 需要開啟SYSCFG 時鐘,同時需要將外部中斷事件線 EXTI_Line和GPIO的引腳pin進(jìn)行關(guān)系映射。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能 SYSCFG 時鐘
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource1);//PA1連接到中斷線1
將中斷線 1 與GPIOA 映射起來,那么此處很顯然是 GPIOA的pin1與 EXTI_Line1中斷線連接了。
(3)、初始化外部中斷事件線
即調(diào)用EXTI_Init接口對中斷線進(jìn)行配置,設(shè)置好EXTI_Line的參數(shù)。
EXTI_InitStructure.EXTI_Line = EXTI_Line1; //外部中斷事件連接線為EXTI1,根據(jù)實際情況設(shè)置
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//EXTI模式為外部中斷模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //外部IO輸入信號為下降沿觸發(fā)根據(jù)實際情況設(shè)置
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//打開外部中斷事件連接線
EXTI_Init(&EXTI_InitStructure);
(4)、初始化NVIC
NVIC是嵌套向量中斷控制器,屬于內(nèi)核外設(shè),管理著包括內(nèi)核和片上所有外設(shè)的中斷相關(guān)的功能。 關(guān)于NVIC的知識,可以回顧明解STM32中斷系統(tǒng)的內(nèi)容進(jìn)行詳細(xì)的了解。
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; //使能外部中斷EXTI1,根據(jù)實際情況設(shè)置
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //搶占優(yōu)先級2,根據(jù)實際情況設(shè)置
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //響應(yīng)優(yōu)先級2,根據(jù)實際情況設(shè)置
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道
NVIC_Init(&NVIC_InitStructure); //中斷優(yōu)先級分組初始化
(5)、中斷服務(wù)函數(shù)編寫
雖然EXTI的外部中斷事件線有16個為EXTI_Line0~EXTI_Line15,但是STM32規(guī)定好的GPIO外部中斷服務(wù)函數(shù)只有7個:
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
EXTI9_5_IRQHandler
EXTI15_10_IRQHandler
可以看出EXTI_Line0 ~ EXTI_Line4每個中斷線對應(yīng)一個中斷函數(shù),中斷線EXTI_Line5 ~ EXTI_Line9共用中斷函數(shù) EXTI9_5_IRQHandler,EXTI_Line10~EXTI_Line15 共用中斷函數(shù) EXTI15_10_IRQHandler。
一個標(biāo)準(zhǔn)的GPIO外部中斷服務(wù)函數(shù)模板如下:
void EXTI1_IRQHandle(void)
{
if(EXTI_GetITStatus(EXTI_Line1)!=RESET)//判斷某個EXTI_Line上的中斷是否發(fā)生
{
................ //此處用戶自行定義中斷處理邏輯
EXTI_ClearITPendingBit(EXTI_Line3); //清除EXTI_Line上的中斷標(biāo)志位
}
}
需要注意的是:EXTI9_5_IRQHandler和EXTI15_10_IRQHandler這兩個中斷由于是多個中斷線共用,因此中斷服務(wù)函數(shù)中可以分別放置多個EXTI_Line的處理邏輯。
五、總結(jié)
本篇在GPIO基本API和配置使用流程基礎(chǔ)之前,對EXTI的結(jié)構(gòu)功能,普通IO輸入使用成外部中斷的方式進(jìn)行了詳細(xì)介紹。 圍繞外部中斷概念和外部中斷的配置使用分別進(jìn)行了介紹分析,通過分析外部中斷相關(guān)API和寄存器,了解外部中斷和GPIO引腳的映射關(guān)系,功能特性等,從而能更好的應(yīng)用外部中斷的接口完成一系列外部中斷的配置使用工作。
評論
查看更多