新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32 外部中斷簡介

        STM32 外部中斷簡介

        作者: 時間:2016-11-20 來源:網絡 收藏
        STM32IO口中斷的一些基礎概念。STM32的每個IO都可以作為外部中斷的中斷輸入口,這點也是STM32的強大之處。STM32F103的中斷控制器支持19個外部中斷/事件請求。每個中斷設有狀態位,每個中斷/事件都有獨立的觸發和屏蔽設置。STM32F103的19個外部中斷為:

        線0~15:對應外部IO口的輸入中斷。

        本文引用地址:http://www.104case.com/article/201611/318698.htm

        線16:連接到PVD輸出。

        線17:連接到RTC鬧鐘事件。

        線18:連接到USB喚醒事件。

        在庫函數中,配置GPIO與中斷線的映射關系的函數GPIO_EXTILineConfig()來實現的:

        voidGPIO_EXTILineConfig(uint8_tGPIO_PortSource,uint8_tGPIO_PinSource)

        該函數將GPIO端口與中斷線映射起來,使用范例是:

        GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);

        將中斷線2與GPIOE映射起來,那么很顯然是GPIOE.2與EXTI2中斷線連接了。設置好中斷線映射之后,那么到底來自這個IO口的中斷是通過什么方式觸發的呢?接下來我們就要設置該中斷線上中斷的初始化參數了。

        中斷線上中斷的初始化是通過函數EXTI_Init()實現的。EXTI_Init()函數的定義是:

        voidEXTI_Init(EXTI_InitTypeDef*EXTI_InitStruct);

        下面我們用一個使用范例來說明這個函數的使用:

        點擊(此處)折疊或打開

        1.   EXTI_InitTypeDef EXTI_InitStructure;
        2.   EXTI_InitStructure.EXTI_Line=EXTI_Line4;//中斷線的標號 取值范圍為EXTI_Line0~EXTI_Line15
        3.   EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//中斷模式,可選值為中斷 EXTI_Mode_Interrupt 和事件 EXTI_Mode_Event。
        4.   EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//觸發方式,可以是下降沿觸發 EXTI_Trigger_Falling,上升沿觸發 EXTI_Trigger_Rising,或者任意電平(上升沿和下降沿)觸發EXTI_Trigger_Rising_Falling
        5.   EXTI_InitStructure.EXTI_LineCmd=ENABLE;
        6. EXTI_Init(&EXTI_InitStructure);

        既然是外部中斷,涉及到中斷我們當然還要設置NVIC中斷優先級。

        點擊(此處)折疊或打開

        1.   NVIC_InitTypeDef NVIC_InitStructure;
        2.   NVIC_InitStructure.NVIC_IRQChannel=EXTI2_IRQn;//使能按鍵外部中斷通道
        3.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02;//搶占優先級 2,
        4.   NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;//子優先級 2
        5.   NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//使能外部中斷通道
        6.   NVIC_Init(&NVIC_InitStructure);

        配置完中斷優先級之后,接著我們要做的就是編寫中斷服務函數。中斷服務函數的名字是在MDK中事先有定義的。這里需要說明一下,STM32的IO口外部中斷函數只有6個,分別為:

        EXPORTEXTI0_IRQHandler

        EXPORTEXTI1_IRQHandler

        EXPORTEXTI2_IRQHandler

        EXPORTEXTI3_IRQHandler

        EXPORTEXTI4_IRQHandler

        EXPORTEXTI9_5_IRQHandler

        EXPORTEXTI15_10_IRQHandler

        中斷線0-4每個中斷線對應一個中斷函數,中斷線5-9共用中斷函數EXTI9_5_IRQHandler,中斷線10-15共用中斷函數EXTI15_10_IRQHandler。

        在編寫中斷服務函數的時候會經常使用到兩個函數,

        第一個函數是判斷某個中斷線上的中斷是否發生(標志位是否置位):

        ITStatusEXTI_GetITStatus(uint32_tEXTI_Line);

        這個函數一般使用在中斷服務函數的開頭判斷中斷是否發生。另一個函數是清除某個中斷線上的中斷標志位:

        voidEXTI_ClearITPendingBit(uint32_tEXTI_Line);

        這個函數一般應用在中斷服務函數結束之前,清除中斷標志位。

        常用的中斷服務函數格式為:

        voidEXTI2_IRQHandler(void)

        {

        if(EXTI_GetITStatus(EXTI_Line3)!=RESET)//判斷某個線上的中斷是否發生

        {

        中斷邏輯…

        EXTI_ClearITPendingBit(EXTI_Line3);//清除LINE上的中斷標志位

        }

        }

        使用IO口外部中斷的一般步驟:

        1)初始化IO口為輸入。

        2)開啟IO口復用時鐘,設置IO口與中斷線的映射關系。

        3)初始化線上中斷,設置觸發條件等。

        4)配置中斷分組(NVIC),并使能中斷。

        5)編寫中斷服務函數。



        關鍵詞: stm32外部中

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 壤塘县| 裕民县| 沂水县| 辽阳市| 沂源县| 谢通门县| 称多县| 浠水县| 泸州市| 汾阳市| 广宁县| 临湘市| 连州市| 溆浦县| 天等县| 宣城市| 内黄县| 贺兰县| 陇南市| 星座| 陆川县| 平顶山市| 资溪县| 四子王旗| 晴隆县| 临澧县| 阿克| 西畴县| 五台县| 崇信县| 昭平县| 静海县| 攀枝花市| 苏尼特左旗| 宁夏| 合水县| 汤原县| 新津县| 昌平区| 南宫市| 辽阳市|