版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第4章NVIC和EXTI-2-本章目標(biāo)理解CM3內(nèi)核的異常/中斷處理機(jī)制理解CM3的優(yōu)先級(jí)概念理解(異常)向量表掌握中斷配置掌握NVIC庫函數(shù)配置理解外部中斷概念掌握EXTI庫函數(shù)配置-3-CM3異常和中斷系統(tǒng)所有能打斷正常執(zhí)行流程的事件都稱為異常,中斷也是一種異常。在本書中,經(jīng)常混合使用術(shù)語“中斷”與“異?!薄H绮患诱f明,則強(qiáng)調(diào)的都是它們對(duì)主程序所體現(xiàn)出來的“中斷”性質(zhì)。對(duì)于“中斷”與“異?!钡募?xì)微差別,則指的是中斷一般來自CM3內(nèi)核外部事件驅(qū)動(dòng),而異常則是CM3內(nèi)核內(nèi)部事件產(chǎn)生。-4-CM3異常和中斷系統(tǒng)--嵌套向量中斷控制器NVIC
CM3內(nèi)核搭載了一個(gè)異常響應(yīng)系統(tǒng),通過嵌套向量中斷控制器(NestedVectoredInterruptController,NVIC)來管理和配置。NVIC是一個(gè)總的中斷控制器,不管是來自CM3內(nèi)部的異常還是來自外設(shè)的中斷,都將進(jìn)入該控制器進(jìn)行處理和邏輯控制。此外NVIC還通過優(yōu)先級(jí)系統(tǒng)控制中斷的嵌套和調(diào)度。-5-CM3異常和中斷系統(tǒng)--中斷優(yōu)先級(jí)
在NVIC中,優(yōu)先級(jí)對(duì)于中斷來說很關(guān)鍵,它會(huì)決定一個(gè)中斷是否能被掩蔽,以及在未掩蔽的情況下何時(shí)可以響應(yīng)。優(yōu)先級(jí)的數(shù)值越小,則優(yōu)先級(jí)越高。NVIC支持中斷嵌套,使得高優(yōu)先級(jí)異常會(huì)搶占低優(yōu)先級(jí)異常。有3個(gè)系統(tǒng)異常:復(fù)位、NMI(不可屏蔽中斷)以及硬件失效(Hardfault),它們有固定的優(yōu)先級(jí),并且它們的優(yōu)先級(jí)號(hào)是負(fù)數(shù),從而高于所有其他異常。-6-CM3異常和中斷系統(tǒng)--中斷優(yōu)先級(jí)
原則上,NVIC支持3個(gè)固定的高優(yōu)先級(jí)和多達(dá)256級(jí)的可設(shè)置優(yōu)先級(jí),用一個(gè)字節(jié)的8個(gè)比特位來表示STM32F107采用最高有效位對(duì)齊,在設(shè)計(jì)時(shí)裁掉表達(dá)優(yōu)先級(jí)的4個(gè)低端有效位,所以只支持16級(jí)優(yōu)先級(jí)。Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0用于表達(dá)優(yōu)先級(jí)沒有實(shí)現(xiàn),讀出值是0-7-CM3異常和中斷系統(tǒng)--中斷優(yōu)先級(jí)
LSB(最低有效位)對(duì)齊MSB(最高有效位)對(duì)齊四位有效位0x10110x01010x101100000x01010000比較結(jié)果0x1011>0x01010x10110000>0x01010000三位有效位0x0110x1010x101000000x01000000比較結(jié)果0x011<0x1010x10100000>0x01000000結(jié)論發(fā)生優(yōu)先級(jí)翻轉(zhuǎn)未發(fā)生優(yōu)先級(jí)翻轉(zhuǎn)Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0用于表達(dá)優(yōu)先級(jí)沒有實(shí)現(xiàn),讀出值是0-8-CM3異常和中斷系統(tǒng)--搶占優(yōu)先級(jí)與從優(yōu)先級(jí)
NVIC中有一個(gè)寄存器是“應(yīng)用程序中斷及復(fù)位控制寄存器”,它里面有一個(gè)位段名為“優(yōu)先級(jí)組”。該位段的值對(duì)每一個(gè)優(yōu)先級(jí)可配置的中斷都有影響,它把優(yōu)先級(jí)分為2個(gè)位段:MSB所在的位段對(duì)應(yīng)搶占優(yōu)先級(jí),搶占優(yōu)先級(jí)決定了搶占行為。LSB所在的位段對(duì)應(yīng)從優(yōu)先級(jí),從優(yōu)先級(jí)則處理“內(nèi)務(wù)”。在STM32F107中,只使用4個(gè)位來表達(dá)優(yōu)先級(jí)([7:4]),如果搶占優(yōu)先級(jí)組從比特5處分組,則得到4級(jí)搶占優(yōu)先級(jí),且在每個(gè)搶占優(yōu)先級(jí)的內(nèi)部有4個(gè)從優(yōu)先級(jí)。-9-CM3異常和中斷系統(tǒng)--中斷輸入與懸起
當(dāng)中斷輸入腳被置為有效后,該中斷就被“懸起”。所謂“懸起”,也就是等待、就緒的意思。即使后來中斷源撤消了中斷請(qǐng)求,已經(jīng)被標(biāo)記成懸起的中斷也被記錄下來。當(dāng)某中斷的服務(wù)程序開始執(zhí)行時(shí),就稱此中斷進(jìn)入了“活躍”狀態(tài),并且其懸起位會(huì)被硬件自動(dòng)清除。在一個(gè)中斷活躍后,直到其服務(wù)例程執(zhí)行完畢,并且返回后,才能對(duì)該中斷的新請(qǐng)求予以響應(yīng)。-10-CM3異常和中斷系統(tǒng)--中斷輸入與懸起
以下幾種情況需要特別注意:如果在某個(gè)中斷得到響應(yīng)之前,其懸起狀態(tài)被清除了,則中斷被取消。新請(qǐng)求在得到響應(yīng)時(shí),由硬件自動(dòng)清零其懸起標(biāo)志位。如果中斷源咬住請(qǐng)求信號(hào)不放,該中斷就會(huì)在其上次服務(wù)例程返回后再次被置為懸起狀態(tài)。如果某個(gè)中斷在得到響應(yīng)之前,其請(qǐng)求信號(hào)以若干的脈沖的方式呈現(xiàn),則被視為只有一次中斷請(qǐng)求如果在服務(wù)例程執(zhí)行時(shí),中斷請(qǐng)求釋放了,但是在服務(wù)例程返回前又重新被置為有效,則NVIC會(huì)記住此動(dòng)作,重新懸起該中斷。-11-CM3異常和中斷系統(tǒng)--中斷響應(yīng)序列
當(dāng)NVIC響應(yīng)一個(gè)中斷時(shí),會(huì)自動(dòng)完成以下三項(xiàng)工作,以便安全、準(zhǔn)確地跳轉(zhuǎn)到相應(yīng)的中斷服務(wù)程序:入棧:把8個(gè)寄存器的值壓入棧。取向量:從向量表中找出對(duì)應(yīng)的服務(wù)程序入口地址。選擇堆棧指針MSP/PSP,更新堆棧指針SP,更新連接寄存器LR,更新程序計(jì)數(shù)器PC。-12-CM3異常和中斷系統(tǒng)--中斷返回
中斷返回序時(shí),NVIC自動(dòng)完成以下兩步:出棧:先前壓入棧中的寄存器在這里恢復(fù)。內(nèi)部的出棧順序與入棧時(shí)的相對(duì)應(yīng),堆棧指針的值也改回先前的值。更新NVIC寄存器:伴隨著中斷的返回,它的活動(dòng)位也被硬件清除。對(duì)于外部中斷,倘若中斷輸入再次被置為有效,懸起位也將再次置位,新一次的中斷響應(yīng)序列也可隨之再次開始。-13-CM3異常和中斷系統(tǒng)--SYSTICK定時(shí)器
SysTick定時(shí)器被捆綁在NVIC中,用于產(chǎn)生SysTick異常(異常號(hào):15)。在STM32F107中,系統(tǒng)嘀嗒校準(zhǔn)值固定為9000,當(dāng)系統(tǒng)嘀嗒時(shí)鐘設(shè)定為9MHz(HCLK/8的最大值)時(shí)產(chǎn)生1ms時(shí)間基準(zhǔn)。對(duì)于SysTick,庫函數(shù)文件misc.c中也有一個(gè)函數(shù)可以對(duì)其時(shí)鐘源進(jìn)行配置,該函數(shù)的原型如下。函數(shù)4-1】SysTick_CLKSourceConfig()voidSysTick_CLKSourceConfig(uint32_tSysTick_CLKSource);SysTick_CLKSource描述SysTick_CLKSource_HCLK_Div8SysTick時(shí)鐘源為AHB時(shí)鐘除以8SysTick_CLKSource_HCLKSysTick時(shí)鐘源為AHB時(shí)鐘-14-中斷向量
當(dāng)發(fā)生了異?;蛑袛?,并且要響應(yīng)它時(shí),CM3需要定位其服務(wù)程序的入口地址。通過入口地址找到相應(yīng)的中斷服務(wù)程序。這些入口地址存儲(chǔ)在“(異常)向量表”中。-15-中斷向量--(異常)向量表
缺省情況下,CM3認(rèn)為(異常)向量表位于零地址處,且各向量占用4字節(jié)。STM32F107的異常響應(yīng)系統(tǒng)是CM3的裁剪和細(xì)化在STM32F107中,這種映射關(guān)系具體體現(xiàn)在啟動(dòng)代碼startup_stm32f10x_cl.s文件中。該文件已經(jīng)對(duì)這些向量表等進(jìn)行了映射和配置,并指定了中斷服務(wù)程序的名稱,出于標(biāo)準(zhǔn)化和固件庫的要求,一般不建議進(jìn)行修改。該文件由匯編寫成-16-中斷向量--(異常)向量表
【代碼4-1】startup_stm32f10x_cl.s;定義Heap_Size為0x200Heap_SizeEQU0x00000200
;定義棧,分配空間可初始化為0,按8字節(jié)對(duì)齊
AREAHEAP,NOINIT,READWRITE,ALIGN=3__heap_base;從地址0開始分配0x200個(gè)連續(xù)字節(jié)Heap_MemSPACEHeap_Size__heap_limit
;指定當(dāng)前堆棧8字節(jié)對(duì)齊
PRESERVE8
;THUMB指令
THUMB ;定義復(fù)位向量段,類型為數(shù)據(jù),只讀
AREARESET,DATA,READONLY ;輸出一個(gè)可以在其他文件中使用的全局標(biāo)號(hào),此處表示中斷地址
EXPORT__VectorsEXPORT__Vectors_EndEXPORT__Vectors_Size ;DCD偽指令是分配一片連續(xù)的字存儲(chǔ)單元,在CM3中,字都是32位的,但是存儲(chǔ)器 ;字節(jié)為單位,所以每分配一個(gè)字,存儲(chǔ)器地址需要加4
;給初始化堆棧initial_sp分配一個(gè)32位空間存放棧頂?shù)刂穇_VectorsDCD__initial_sp
;0x04-0x07存放ResetHandler,以下向量地址可以此類推
DCDReset_Handler;異常服務(wù)程序名,即入口地址
DCDNMI_Handler;NMIHandler
-17-中斷向量--(異常)向量表
……
DCDTIM5_IRQHandler;TIM5DCDSPI3_IRQHandler;SPI3DCDUART4_IRQHandler;UART4DCDUART5_IRQHandler;UART5DCDTIM6_IRQHandler;TIM6DCDTIM7_IRQHandler;TIM7DCDDMA2_Channel1_IRQHandler;DMA2Channel1DCDDMA2_Channel2_IRQHandler;DMA2Channel2DCDDMA2_Channel3_IRQHandler;DMA2Channel3DCDDMA2_Channel4_IRQHandler;DMA2Channel4DCDDMA2_Channel5_IRQHandler;DMA2Channel5DCDETH_IRQHandler;EthernetDCDETH_WKUP_IRQHandler;EthernetWakeupthroughEXTIlineDCDCAN2_TX_IRQHandler;CAN2TXDCDCAN2_RX0_IRQHandler;CAN2RX0DCDCAN2_RX1_IRQHandler;CAN2RX1DCDCAN2_SCE_IRQHandler;CAN2SCEDCDOTG_FS_IRQHandler;USBOTGFS__Vectors_End
上述代碼為所有異常和中斷服務(wù)程序固定了存放入口地址的內(nèi)存空間,并指定了服務(wù)程序名稱,編譯器將會(huì)查找相應(yīng)的服務(wù)程序名稱,并將其入口地址填入向量表的相應(yīng)內(nèi)存。-18-中斷向量--(異常)向量表
【代碼4-2】startup_stm32f10x_cl.s;復(fù)位異常服務(wù)函數(shù),函數(shù)名為Reset_HandlerReset_HandlerPROC
;輸出一個(gè)標(biāo)號(hào),供全局使用 ;[WEAK]表示如果其他文件定義了該標(biāo)號(hào),則本標(biāo)號(hào)不使用
EXPORTReset_Handler[WEAK]
;從其他文件讀入一個(gè)標(biāo)號(hào)SystemInit IMPORTSystemInit
;從其他文件讀入一個(gè)標(biāo)號(hào)main IMPORT__main
將SystemInit標(biāo)號(hào)地址賦值給R0并跳轉(zhuǎn)
LDRR0,=SystemInitBLXR0
;將main標(biāo)號(hào)地址賦值給R0并跳轉(zhuǎn)
LDRR0,=__mainBXR0ENDP在啟動(dòng)代碼中,還特別編寫了復(fù)位異常的服務(wù)程序,代碼如下所示。STM32F107復(fù)位后,會(huì)到(異常)向量表中的0x04-0x07處,查找復(fù)位異常服務(wù)程序地址,通過地址找到標(biāo)號(hào)為Reset_Handler的服務(wù)程序,在此程序內(nèi),先執(zhí)行一個(gè)名為SystemInit(定義于system_stm32f10x.c文件中)的初始化程序,再跳轉(zhuǎn)執(zhí)行main函數(shù)。
-19-中斷向量--(異常)向量表
【代碼4-3】startup_stm32f10x_cl.s;系統(tǒng)異常服務(wù)程序,主體為B.即跳轉(zhuǎn)到自身,相當(dāng)于while(1){}NMI_HandlerPROCEXPORTNMI_Handler[WEAK]B.ENDPHardFault_Handler\PROCEXPORTHardFault_Handler[WEAK]B.ENDPMemManage_Handler\PROCEXPORTMemManage_Handler[WEAK]B.ENDPBusFault_Handler\PROCEXPORTBusFault_Handler[WEAK]B.ENDP除此之外,啟動(dòng)代碼還定義了其他系統(tǒng)異常和中斷的程序標(biāo)號(hào)和主體,代碼如下所示:-20-中斷向量--(異常)向量表
;其他中斷服務(wù)程序標(biāo)號(hào)及程序主體Default_HandlerPROC
;輸出標(biāo)號(hào),以便全局使用,下述可以此類推
EXPORTWWDG_IRQHandler[WEAK]EXPORTPVD_IRQHandler[WEAK]EXPORTTAMPER_IRQHandler[WEAK]EXPORTRTC_IRQHandler[WEAK]EXPORTFLASH_IRQHandler[WEAK]EXPORTRCC_IRQHandler[WEAK]EXPORTEXTI0_IRQHandler[WEAK]EXPORTEXTI1_IRQHandler[WEAK]EXPORTEXTI2_IRQHandler[WEAK]EXPORTEXTI3_IRQHandler[WEAK]EXPORTEXTI4_IRQHandler[WEAK]EXPORTDMA1_Channel1_IRQHandler[WEAK]EXPORTDMA1_Channel2_IRQHandler[WEAK]EXPORTDMA1_Channel3_IRQHandler[WEAK]EXPORTDMA1_Channel4_IRQHandler[WEAK]EXPORTDMA1_Channel5_IRQHandler[WEAK]EXPORTDMA1_Channel6_IRQHandler[WEAK]EXPORTDMA1_Channel7_IRQHandler[WEAK]除此之外,啟動(dòng)代碼還定義了其他系統(tǒng)異常和中斷的程序標(biāo)號(hào)和主體,代碼如下所示:-21-中斷向量--(異常)向量表
;所有外部中斷標(biāo)號(hào)使用同一個(gè)服務(wù)程序主體WWDG_IRQHandlerPVD_IRQHandlerTAMPER_IRQHandlerRTC_IRQHandlerFLASH_IRQHandlerRCC_IRQHandlerEXTI0_IRQHandlerEXTI1_IRQHandlerEXTI2_IRQHandlerEXTI3_IRQHandlerEXTI4_IRQHandler……CAN2_SCE_IRQHandlerOTG_FS_IRQHandler;中斷服務(wù)程序主體
B.ENDP啟動(dòng)代碼定義好了所有異常和中斷的向量表及服務(wù)程序入口地址,還定義了默認(rèn)的服務(wù)程序主體,這些都是基于固件庫和CMSIS標(biāo)準(zhǔn)的。只要是基于固件庫的程序設(shè)計(jì),可以直接調(diào)用。-22-中斷向量--stm32f10x_it.c文件
【代碼4-4】stm32f10x_it.c#include"stm32f10x_it.h"/*定義了系統(tǒng)異常服務(wù)程序主體,用戶也可自行添加代碼*/voidNMI_Handler(void){}voidHardFault_Handler(void){/*當(dāng)發(fā)生HardFault異常時(shí),會(huì)跳到此處,以下以此類推*/while(1){}}……/*預(yù)留位置給其他中斷服務(wù)程序,并給出模板*//*voidPPP_IRQHandler(void){}*/雖然啟動(dòng)代碼定義了中斷服務(wù)程序,但是由于是匯編語言編寫,所以用戶自己編寫的中斷服務(wù)程序一般不放在啟動(dòng)代碼中,而是放在stm32f10x_it.c文件中。-23-NVIC庫函數(shù)配置NVIC涉及的庫函數(shù)存放在misc.c文件中,并非類似stm32f10x_nvic.c的命名,這是因?yàn)镹VIC屬于CM3內(nèi)核部件,遵從CMSIS接口協(xié)議。就其庫函數(shù)來看,NVIC主要是設(shè)置中斷的優(yōu)先級(jí),以達(dá)到控制其運(yùn)行先后及嵌套等功能。-24-NVIC庫函數(shù)配置--NVIC配置
下述函數(shù)代碼用于實(shí)現(xiàn)任務(wù)描述4.D.1,配置EXTI3中斷的搶占優(yōu)先級(jí)為0x07,從優(yōu)先級(jí)為0x07,并使能該中斷?!久枋?.D.1】NVIC_Config()voidNVIC_Config(void){ /*定義一個(gè)NVIC_InitTypeDef類型的結(jié)構(gòu)體,該類型在misc.h中定義*/ NVIC_InitTypeDefNVIC_InitStructure; /*在NVIC_InitStructure中配置中斷通道為EXTI3*/ NVIC_InitStructure.NVIC_IRQChannel=EXTI3_IRQn; /*在NVIC_InitStructure中配置中斷搶占優(yōu)先級(jí)為7*/ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x07; /*在NVIC_InitStructure中配置中斷從優(yōu)先級(jí)為7*/ NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x07; /*在NVIC_InitStructure中使能該中斷*/ NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; /*NVIC_Init函數(shù)根據(jù)NVIC_InitStructure設(shè)置進(jìn)行NVIC初始化*/
NVIC_Init(&NVIC_InitStructure);}-25-NVIC庫函數(shù)配置--NVIC配置
NVIC的配置,可以調(diào)用固件庫的NVIC_Init(NVIC_InitTypeDef*NVIC_InitStruct)函數(shù)進(jìn)行,該函數(shù)可對(duì)NVIC進(jìn)行設(shè)置,需要參數(shù)NVIC_InitStruct。NVIC_InitStruct參數(shù)
NVIC_InitStruct為NVIC_InitTypeDef類型的指針,其結(jié)構(gòu)原型為:【結(jié)構(gòu)體4-1】NVIC_InitTypeDeftypedefstruct{ /*需要配置的異?;蛑袛嗤ǖ?/ uint8_tNVIC_IRQChannel;
/*中斷的搶占優(yōu)先級(jí)*/ uint8_tNVIC_IRQChannelPreemptionPriority; /*中斷的從優(yōu)先級(jí)*/ uint8_tNVIC_IRQChannelSubPriority;
/*選擇中斷的開啟或關(guān)閉*/ FunctionalStateNVIC_IRQChannelCmd;}NVIC_InitTypeDef;-26-NVIC庫函數(shù)配置--NVIC配置
NVIC_IRQChannel成員
NVIC_IRQChannel描述NonMaskableInt_IRQn無可屏蔽異常MemoryManagement_IRQn內(nèi)存管理異常BusFault_IRQn總線錯(cuò)誤異常UsageFault_IRQn應(yīng)用錯(cuò)誤異常DebugMonitor_IRQn調(diào)試監(jiān)控異常PendSV_IRQn可懸起請(qǐng)求異常SysTick_IRQn滴答時(shí)鐘異常WWDG_IRQn窗口看門狗中斷PVD_IRQn電源電壓檢測(cè)中斷TAMPER_IRQn侵入檢測(cè)中斷RTC_IRQnRTC中斷FLASH_IRQnFLASH中斷RCC_IRQnRCC中斷EXTI0_IRQn外部中斷0EXTI1_IRQn外部中斷1EXTI2_IRQn外部中斷2EXTI3_IRQn外部中斷3EXTI4_IRQn外部中斷4-27-NVIC庫函數(shù)配置--NVIC配置
NVIC_IRQChannelPreemptionPriority和NVIC_IRQChannelSubPriority成員NVIC_IRQChannelPreemptionPriority和NVIC_IRQChannelSubPriority結(jié)構(gòu)體成員分別代表了終端的搶占優(yōu)先級(jí)和從優(yōu)先級(jí)的設(shè)置,其可取值受到優(yōu)先級(jí)分組的影響NVIC_PriorityGroupPreemptionPrioritySubPriority描述NVIC_PriorityGroup_000-15搶占優(yōu)先級(jí)0位從優(yōu)先級(jí)4位NVIC_PriorityGroup_10-10-7搶占優(yōu)先級(jí)1位從優(yōu)先級(jí)3位NVIC_PriorityGroup_20-30-3搶占優(yōu)先級(jí)2位從優(yōu)先級(jí)2位NVIC_PriorityGroup_30-70-1搶占優(yōu)先級(jí)3位從優(yōu)先級(jí)1位NVIC_PriorityGroup_40-150搶占優(yōu)先級(jí)4位從優(yōu)先級(jí)0位-28-NVIC庫函數(shù)配置--NVIC配置
NVIC_IRQChannelCmd成員NVIC_IRQChannelCmd是選擇開啟或關(guān)閉中斷的選項(xiàng)NVIC_IRQChannelCmd描述ENABLE開啟、使能DISABLE關(guān)閉、除能-29-外部中斷/事件控制器EXTI與NVIC不同,外部中斷/事件控制器EXTI是STM32F107的一個(gè)外設(shè),不屬于CM3內(nèi)核的范疇,主要用于外部中斷和事件的控制。EXTI由20個(gè)產(chǎn)生事件/中斷請(qǐng)求的邊沿檢測(cè)器組成,有以下幾個(gè)特點(diǎn):每個(gè)輸入線可以獨(dú)立地配置輸入類型(脈沖或掛起)和對(duì)應(yīng)的觸發(fā)事件(上升沿或下降沿或者雙邊沿都觸發(fā))。每個(gè)輸入線都可以獨(dú)立地被屏蔽。掛起寄存器保持著狀態(tài)線的中斷請(qǐng)求。-30-外部中斷/事件控制器EXTI--功能說明
EXTI控制器的主要特性如下:每個(gè)中斷/事件都有獨(dú)立的觸發(fā)和屏蔽。每個(gè)中斷線都有專用的狀態(tài)位。支持多達(dá)20個(gè)軟件的中斷/事件請(qǐng)求。檢測(cè)脈沖寬度低于APB2時(shí)鐘寬度的外部信號(hào)。-31-外部中斷/事件控制器EXTI--功能說明
喚醒事件管理
STM32F107可以處理外部或內(nèi)部事件來喚醒內(nèi)核(WFE)。喚醒事件可以通過下述配置產(chǎn)生:在外設(shè)的控制寄存器使能一個(gè)中斷,但不在NVIC中使能。配置一個(gè)外部或內(nèi)部EXTI線為事件模式以太網(wǎng)喚醒事件同樣具有WFE喚醒功能。使用外部I/O端口作為喚醒事件,要產(chǎn)生中斷,必須先配置好并使能中斷線。硬件中斷選擇通過下面的過程來配置20個(gè)線路作為中斷源:配置20個(gè)中斷線的屏蔽位。配置所選中斷線的觸發(fā)選擇位。配置對(duì)應(yīng)到外部中斷控制器(EXTI)的NVIC中斷通道的使能和屏蔽位-32-外部中斷/事件控制器EXTI--功能說明
硬件事件選擇
通過下面的過程,可以配置20個(gè)線路為事件源:配置20個(gè)事件線的屏蔽位。配置事件線的觸發(fā)選擇位。軟件中斷/事件的選擇20個(gè)線路可以被配置成軟件中斷/事件線。下面是產(chǎn)生軟件中斷的過程:配置20個(gè)中斷/事件線屏蔽位。設(shè)置軟件中斷寄存器的請(qǐng)求位。-33-外部中斷/事件控制器EXTI--外部中斷/事件線路映像
80個(gè)通用I/O端口連接到16個(gè)外部中斷/事件線上配置GPIO線上的外部中斷/事件,必須先使能AFIO時(shí)鐘。其他EXTI線如下所述:EXTI線16連接到PVD輸出。EXTI線17連接到RTC鬧鐘事件。EXTI線18連接到USB喚醒事件。EXTI線19連接到以太網(wǎng)喚醒事件。-34-EXTI庫函數(shù)配置
EXTI作為STM32F107的一個(gè)外設(shè),主要用于配置GPIO的外部中斷線。對(duì)于一個(gè)中斷來說,還需要配合NVIC設(shè)置其優(yōu)先級(jí)才能真正正常工作。-35-EXTI庫函數(shù)配置--EXTI配置
下述函數(shù)代碼用于實(shí)現(xiàn)任務(wù)描述4.D.2,配置PD3管腳作為EXTI線3,中斷模式,下降沿有效,并使能該配置?!久枋?.D.2】EXTI_Config()voidEXTI_Config(void){ /*定義一個(gè)EXTI_InitTypeDef類型的結(jié)構(gòu)體,該類型在stm32f10x_exti.h中定義*/ EXTI_InitTypeDefEXTI_InitStructure; /*使能AFIO時(shí)鐘*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); /*配置PD3管腳作為EXTI線3*/ GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource3); /*在EXTI中配置EXTI線3為中斷模式,下降沿有效,并使能該配置*/ EXTI_InitStructure.EXTI_Line=EXTI_Line3;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd=ENABLE; EXTI_Init(&EXTI_InitStructure);}-36-EXTI庫函數(shù)配置--EXTI配置
EXTI_Line成員
EXTI_Line描述EXTI_Line0選擇設(shè)置外部中斷0EXTI_Line1選擇設(shè)置外部中斷1EXTI_Line2選擇設(shè)置外部中斷2EXTI_Line3選擇設(shè)置外部中斷3EXTI_Line4選擇設(shè)置外部中斷4EXTI_Line5選擇設(shè)置外部中斷5EXTI_Line6選擇設(shè)置外部中斷6EXTI_Line7選擇設(shè)置外部中斷7EXTI_Line8選擇設(shè)置外部中斷8EXTI_Line9選擇設(shè)置外部中斷9EXTI_Line10選擇設(shè)置外部中斷10EXTI_Line11選擇設(shè)置外部中斷11EXTI_Line12選擇設(shè)置外部中斷12EXTI_Line13選擇設(shè)置外部中斷13EXTI_Line14選擇設(shè)置外部中斷14EXTI_Line15選擇設(shè)置外部中斷15EXTI_Line16選擇設(shè)置外部中斷16EXTI_Line17選擇設(shè)置外部中斷17EXTI_Line18選擇設(shè)置外部中斷18EXTI_Line19選擇設(shè)置外部中斷19-37-EXTI庫函數(shù)配置--EXTI配置
EXTI_Mode成員
EXTI_Mode描述EXTI_Mode_Interrupt中斷模式EXTI_Mode_Event事件模式-38-EXTI庫函數(shù)配置--EXTI配置
EXTI_Trigger成員
EXTI_Trigger描述EXTI_Trigger_Rising上升沿觸發(fā)EXTI_Trigger_Falling下降沿觸發(fā)EXTI_Trigger_Rising_Falling上升沿和下降沿都觸發(fā)-39-EXTI庫函數(shù)配置--EXTI配置
EXTI_LineCmd成員
EXTI_LineCmd是選擇開啟或關(guān)閉中斷的選項(xiàng)EXTI_LineCmd描述ENABLE開啟、使能DISABLE關(guān)閉、除能-40-中斷應(yīng)用實(shí)例
下述內(nèi)容用于實(shí)現(xiàn)任務(wù)描述4.D.3,將PD3管腳接一個(gè)按鍵,作為外部中斷線3的輸入源,每次按下該按鍵產(chǎn)生一個(gè)中斷,在中斷服務(wù)函數(shù)中驅(qū)動(dòng)PC9管腳控制LED4燈翻轉(zhuǎn)輸出狀態(tài)。-41-中斷應(yīng)用實(shí)例--main函數(shù)
main函數(shù)中主要實(shí)現(xiàn)相關(guān)GPIO管腳的配置,EXTI外部中斷線的配置和NVIC中斷優(yōu)先級(jí)的配置,其代碼如下所示:【描述4.D.3】main.c#include "stm32f10x.h"/*定義GPIO設(shè)置函數(shù)*/voidGPIO_Config(void);/*定義NVIC設(shè)置函數(shù)*/voidNVIC_Config(void);/*定義EXTI設(shè)置函數(shù)*/voidEXTI_Config(void);intmain(void){ GPIO_Config(); NVIC_Config(); EXTI_Config(); /*等待中斷*/ while(1) {}}
-42-中斷應(yīng)用實(shí)例--main函數(shù)
voidGPIO_Config(void){ /*定義一個(gè)GPIO_InitTypeDef類型的結(jié)構(gòu)體,該類型在stm32f10x_gpio.h中定義*/ GPIO_InitTypeDefGPIO_InitStructure; /*使能GPIOC和GPIOD時(shí)鐘*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD,ENABLE);
/*配置PC9管腳作為推挽輸出*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOC,&GPIO_InitStructure);
/*配置PD3作為浮空輸入,為外部中斷做準(zhǔn)備*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOD,&GPIO_InitStructure);}
-43-中斷應(yīng)用實(shí)例--main函數(shù)
voidEXTI_Config(void){ /*定義一個(gè)EXTI_InitTypeDef類型的結(jié)構(gòu)體,該類型在stm32f10x_exti.h中定義*/ EXTI_InitTypeDefEXTI_InitStructure; /*使能AFIO時(shí)鐘*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); /*配置PD3管腳作為EXTI線3*/
GPIO_EXTILineConfig(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 餐飲業(yè)食品安全管理與監(jiān)督手冊(cè)(標(biāo)準(zhǔn)版)
- 金融風(fēng)險(xiǎn)管理理論與方法(標(biāo)準(zhǔn)版)
- 會(huì)議安全管理與應(yīng)急預(yù)案制度
- 公共交通服務(wù)設(shè)施管理制度
- 車站環(huán)境衛(wèi)生管理制度
- 養(yǎng)老院檔案信息管理制度
- 2026年柳州銀行股份有限公司招聘?jìng)淇碱}庫及完整答案詳解一套
- 中信證券股份有限公司分支機(jī)構(gòu)2026年校園招聘?jìng)淇碱}庫有答案詳解
- 養(yǎng)老院入住老人健康監(jiān)測(cè)制度
- 2026年重慶飛駛特人力資源管理有限公司派往某單位黨建工作輔助崗招聘?jìng)淇碱}庫及完整答案詳解1套
- GB/T 14977-2025熱軋鋼板表面質(zhì)量的一般要求
- 抖店客服培訓(xùn)知識(shí)課件
- 2025年國家開放大學(xué)(電大)《中國法律史》期末考試備考試題及答案解析
- 2025年國家開放大學(xué)(電大)《政治學(xué)原理》期末考試備考題庫及答案解析
- 《北京市科學(xué)技術(shù)獎(jiǎng)勵(lì)辦法》及其實(shí)施細(xì)則的解讀
- 2025國企性格測(cè)試題及答案
- 基層全民健康體檢課件
- 2025年全國中考真題匯編專題11:議論文閱讀【含答案】
- VFP表單控件的使用
- 化學(xué)月考卷子講解
- 婦幼保健員考試試題題庫及答案
評(píng)論
0/150
提交評(píng)論