中斷教學(xué)講解課件_第1頁
中斷教學(xué)講解課件_第2頁
中斷教學(xué)講解課件_第3頁
中斷教學(xué)講解課件_第4頁
中斷教學(xué)講解課件_第5頁
已閱讀5頁,還剩55頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

第6章

中斷STM32第6章中斷STM32本章知識與能力要求理解和掌握中斷的概念和中斷處理過程;理解和掌握STM32F103微控制器的中斷類型、優(yōu)先級概念和中斷向量表;了解STM32F103微控制器的NVIC中斷結(jié)構(gòu)和特點;掌握STM32F103微控制器EXTI的內(nèi)部結(jié)構(gòu)、工作原理和特性;熟悉NVIC和EXTI相關(guān)的標(biāo)準(zhǔn)外設(shè)庫函數(shù)和HAL庫函數(shù);掌握STM32的中斷配置過程;掌握基于標(biāo)準(zhǔn)外設(shè)庫函數(shù)進行外部中斷的開發(fā)過程;掌握基于HAL庫進行外部中斷的開發(fā)過程。本章知識與能力要求理解和掌握中斷的概念和中斷處理過程;第6章中斷中斷的相關(guān)概念STM32中斷和異常STM32外部中斷EXTI6.4EXTI模塊的標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)及應(yīng)用6.5EXTI模塊的HAL庫接口函數(shù)及應(yīng)用第6章中斷中斷的相關(guān)概念STM32中斷和6.1中斷的相關(guān)概念16.1.1什么是中斷?26.1.2為什么使用中斷?36.1.3中斷處理流程6.1中斷的相關(guān)概念16.1.1什么是中斷?.1什么是中斷?看書取快遞去衛(wèi)生間取快遞、去衛(wèi)生間中斷服務(wù)程序快遞電話肚子疼快遞電話、肚子疼中斷源看書主程序6.1.1什么是中斷?看書取快遞去衛(wèi)生間取快遞、去衛(wèi)生間中6.1.1什么是中斷?計算機在執(zhí)行程序過程中,當(dāng)出現(xiàn)異常情況(斷電等)或特殊請求(數(shù)據(jù)傳輸?shù)龋r,計算機暫?,F(xiàn)行程序的運行,轉(zhuǎn)向?qū)@些異常情況或特殊請求進行處理,處理完畢后再返回到現(xiàn)行程序的中斷處,繼續(xù)執(zhí)行原程序,這就是“中斷”。中斷是單片機實時處理內(nèi)部或外部事件的一種機制。能夠打斷當(dāng)前正常執(zhí)行流程的事件中斷異常由外部事件觸發(fā)由CPU內(nèi)部事件產(chǎn)生中斷和異常其本質(zhì)都是對主程序的“中斷”6.1.1什么是中斷?計算機在執(zhí)行程序過程中,當(dāng)6.1.2為什么使用中斷?CPU的速度快外設(shè)速度慢降低CPU效率等待+中斷可提高CPU效率可實現(xiàn)對實時事件的及時處理(實時處理)可對突發(fā)故障進行及時處理(異常處理)

中斷在嵌入式系統(tǒng)占有極其重要的地位,中斷機制使得系統(tǒng)能更有效更合理地發(fā)揮效能和提高效率。6.1.2為什么使用中斷?CPU的速度快外設(shè)速度慢降低CP6.1.3中斷處理流程中斷處理流程:中斷請求、中斷響應(yīng)、中斷服務(wù)和中斷返回多重中斷的中斷處理流程單重中斷的中斷處理流程

6.1.3中斷處理流程中斷處理流程:中斷請求、中6.1.3中斷處理流程中斷請求中斷請求是中斷源向CPU發(fā)出中斷請求信號,此時中斷控制系統(tǒng)的中斷請求寄存器被置位,向CPU請求中斷。中斷響應(yīng)CPU的中斷系統(tǒng)判斷中斷源的中斷請求是否符合中斷響應(yīng)條件,如果符合條件,則暫時中斷當(dāng)前程序并控制程序跳轉(zhuǎn)到中斷服務(wù)程序中斷服務(wù)為處理中斷而編寫的程序稱為中斷服務(wù)程序,是由開發(fā)人員針對具體中斷所要實現(xiàn)的功能進行設(shè)計和編寫的,需要由開發(fā)人員來實現(xiàn)。中斷返回CPU退出中斷服務(wù)程序,返回到中斷請求響應(yīng)之前被中止的位置繼續(xù)執(zhí)行主程序。這部分操作同樣由硬件來實現(xiàn),不需要開發(fā)人員進行處理。6.1.3中斷處理流程中斷請求中斷請求是中斷源向CPU發(fā)出6.2STM32中斷和異常STM32的內(nèi)部中斷處理機制6.2STM32中斷和異常STM32的內(nèi)部中斷處理機制6.2STM32中斷和異常STM32中斷和異常向量表6.2.1STM32中斷優(yōu)先級6.2.2STM32中斷服務(wù)程序STM32中斷和異常STM32中斷和異常向量表66.2.1STM32中斷和異常向量表STM32F10x系列產(chǎn)品有84個中斷通道,包括16個內(nèi)核中斷和68個可屏蔽中斷;STM32F103系列芯片只有60個可屏蔽中斷STM32F107系列有68個可屏蔽中斷。ARM公司設(shè)計的Cortex-M3內(nèi)核可支持256個中斷:15個內(nèi)核中斷240個外部中斷具有256級的可編程中斷優(yōu)先級設(shè)置,即除了3個固定的高優(yōu)先級(Reset、NMI、硬件失效),其他中斷和異常的優(yōu)先級是可以由用戶進行設(shè)置的使用Cortex-M3內(nèi)核的芯片制造商對中斷進行精簡6.2.1STM32中斷和異常向量表STM32F10x系列6.2.1STM32中斷和異常向量表當(dāng)發(fā)生了異?;蛑袛啵瑑?nèi)核要想響應(yīng)這些異?;蛑袛?,就需要知道這些異常或中斷的服務(wù)程序的入口地址,再由入口地址找到相應(yīng)的中斷服務(wù)程序,由中斷入口地址組成的表稱作中斷向量表。入口地址一般存放在程序存儲器(ROM),默認(rèn)情況下,Cortex-M3內(nèi)核的中斷向量表從零地址處開始,且每個向量占用4個字節(jié)。中斷向量表向量編號向量入口地址說明-0x00000000MSP的初始值10x00000004復(fù)位向量(PC初始值)20x00000008NMI異常服務(wù)程序的入口地址30x0000000C硬Fault異常服務(wù)程序的入口地址……其它中斷服務(wù)程序的入口地址6.2.1STM32中斷和異常向量表當(dāng)發(fā)生了異常6.2.1STM32中斷和異常向量表

STM32在標(biāo)準(zhǔn)外設(shè)庫stm32f10x.h文件中,通過宏定義將中斷通道號(中斷號)與宏名聯(lián)系起來,這樣在使用中斷時,直接引用宏名即可。typedefenumIRQn{/*Cortex-M3ProcessorExceptionsNumbers*/NonMaskableInt_IRQn=-14,

/*!<2NonMaskableInterrupt

*/

MemoryManagement_IRQn=-12,

/*!<4Cortex-M3MemoryManagementInterrupt*/BusFault_IRQn=-11,

/*!<5Cortex-M3BusFaultInterrupt*/……}IRQn_Type;6.2.1STM32中斷和異常向量表STM32在6.2.2STM32中斷優(yōu)先級

STM32使用Cortex-M3的8位優(yōu)先級寄存器中的4位來配置中斷優(yōu)先級,即STM32中的NVIC只支持16級中斷優(yōu)先級的管理。voidNVIC_PriorityGroupConfig(uint32_tNVIC_PriorityGroup);voidNVIC_Init(NVIC_InitTypeDef*NVIC_InitStruct);voidNVIC_SetVectorTable(uint32_tNVIC_VectTab,uint32_tOffset);voidNVIC_SystemLPConfig(uint8_tLowPowerMode,FunctionalStateNewState);voidSysTick_CLKSourceConfig(uint32_tSysTick_CLKSource);NVIC中斷配置的相關(guān)函數(shù)存放在標(biāo)準(zhǔn)外設(shè)庫misc.c和misc.h文件中,共定義了5個相關(guān)函數(shù)及NVIC初始化結(jié)構(gòu)體6.2.2STM32中斷優(yōu)先級STM32使用Co6.2.2STM32中斷優(yōu)先級用于設(shè)置中斷的優(yōu)先級分組,此函數(shù)只有一個參數(shù)NVIC_PriorityGroup,其取值共有5組,每組的搶占優(yōu)先級和響應(yīng)優(yōu)先級所占位數(shù)均不同,取值范圍不同中斷分組管理函數(shù)voidNVIC_PriorityGroupConfig(uint32_tNVIC_PriorityGroup)NVIC_PriorityGroup搶占優(yōu)先級取值范圍響應(yīng)優(yōu)先級取值范圍描述NVIC_PriorityGroup_000~15搶占優(yōu)先級占0位,響應(yīng)優(yōu)先級占4位NVIC_PriorityGroup_10,10~7搶占優(yōu)先級占1位,響應(yīng)優(yōu)先級占3位NVIC_PriorityGroup_20,1,2,30,1,2,3搶占優(yōu)先級占2位,響應(yīng)優(yōu)先級占2位NVIC_PriorityGroup_30,1,2,3,4,5,6,70,1搶占優(yōu)先級占3位,響應(yīng)優(yōu)先級占1位NVIC_PriorityGroup_40~150搶占優(yōu)先級占4位,響應(yīng)優(yōu)先級占0位6.2.2STM32中斷優(yōu)先級用于設(shè)置中斷的優(yōu)先6.2.2STM32中斷優(yōu)先級typedefstruct{uint8_tNVIC_IRQChannel;//配置中斷源,IRQ通道

uint8_tNVIC_IRQChannelPreemptionPriority;//配置搶占優(yōu)先級

uint8_tNVIC_IRQChannelSubPriority;//配置響應(yīng)優(yōu)先級

FunctionalStateNVIC_IRQChannelCmd;//使能中斷通道}NVIC_InitTypeDef;中斷初始化函數(shù):voidNVIC_Init(NVIC_InitTypeDef*NVIC_InitStruct)作用:設(shè)置搶占優(yōu)先級和響應(yīng)優(yōu)先級結(jié)構(gòu)體指向NVIC_InitTypeDef結(jié)構(gòu)體的指針6.2.2STM32中斷優(yōu)先級typedefstruct6.2.2STM32中斷優(yōu)先級高搶先優(yōu)先級的中斷可以打斷低搶先優(yōu)先級的中斷服務(wù),構(gòu)成中斷嵌套;中斷優(yōu)先級判斷:先判斷搶占優(yōu)先級的大小,如果搶占優(yōu)先級相同,則比較響應(yīng)優(yōu)先級的大小,若搶占優(yōu)先級和響應(yīng)優(yōu)先級均相同,則根據(jù)中斷向量表中的順序來決定;搶占優(yōu)先級的優(yōu)先級總是高于響應(yīng)優(yōu)先級;ResetNMIHardFault的優(yōu)先級為負,且不可修改,高于普通的中斷優(yōu)先級。規(guī)則1規(guī)則4規(guī)則3規(guī)則2規(guī)則5填寫標(biāo)題中斷優(yōu)先級的數(shù)值越小,優(yōu)先級級別越高;中斷優(yōu)先級判斷原則6.2.2STM32中斷優(yōu)先級高搶先優(yōu)先級的中斷可以打斷低6.2.3STM32中斷服務(wù)程序STM32將中斷服務(wù)程序統(tǒng)一放在標(biāo)準(zhǔn)外設(shè)庫stm32f10x_it.c文件中,其中的每個中斷服務(wù)函數(shù)都只有函數(shù)名,函數(shù)體都是空的,需要用戶自己編寫相應(yīng)的函數(shù)體,但中斷服務(wù)程序的函數(shù)名是不能更改的stm32f10x_it.c中斷處理函數(shù)6.2.3STM32中斷服務(wù)程序STM32將中斷服6.3STM32外部中斷EXTIEXTI(Externalinterrupt/eventcontroller,外部中斷/事件控制器)支持19個外部中斷/事件請求,每個中斷/事件都有獨立的觸發(fā)和屏蔽設(shè)置,具有中斷模式和事件模式兩種設(shè)置模式。

STM32芯片之外的外設(shè)的中斷(I/O端口)由EXTI和NVIC共同負責(zé),即STM32的每一個GPIO引腳都可以配置成一個外部中斷觸發(fā)源設(shè)置模式中斷模式事件模式通過外部信號的邊沿產(chǎn)生中斷信號傳送給NVIC,觸發(fā)中斷,最終實現(xiàn)中斷服務(wù)程序的執(zhí)行產(chǎn)生脈沖將系統(tǒng)從睡眠和停止模式中喚醒,從而產(chǎn)生相應(yīng)外設(shè)的觸發(fā)信號供外設(shè)電路使用事件屬于硬件觸發(fā)執(zhí)行的過程由軟件實現(xiàn)相應(yīng)功能6.3STM32外部中斷EXTIEXTI(External6.3STM32外部中斷EXTISTM32EXTI內(nèi)部功能框圖6.3STM32外部中斷EXTISTM32EXTI內(nèi)部功6.3STM32外部中斷EXTI19條外部中斷線線0~15對應(yīng)I/O引腳的外部中斷;線16連接到PVD輸出線17連接到RTC鬧鐘事件線18連接到USB喚醒事件STM32中,每一個GPIO都可以觸發(fā)一個外部中斷6.3STM32外部中斷EXTI19條外部中斷線線0~156.3STM32外部中斷EXTIGPIO的中斷是以組為單位的,同組的外部中斷公用一條外部中斷線。

例如:PA0、PB0、PC0、PD0、PE0、PF0、PG0這些為一組,如果使用PA0作為外部中斷源,那么PB0、PC0、PD0、PE0、PF0、PG0就不能同時再作為外部中斷使用了,在此情況下,只能使用類似于PB1、PC2這種末端序號不同的外部中斷源。GPIO引腳和外部中斷線的映射關(guān)系圖6.3STM32外部中斷EXTIGPIO的中斷是6.3STM32外部中斷EXTIEXTI0-EXTI4這5個外部中斷有著各自獨立的中斷服務(wù)函數(shù),如EXTI3的中斷服務(wù)函數(shù)為

voidEXTI3_IRQHandler(void);EXTI5-9共用一個中斷服務(wù)函數(shù)

voidEXTI9_5_IRQHandler(void);EXTI10-15共用一個中斷服務(wù)函數(shù)voidEXTI15_10_IRQHandler(void);中斷標(biāo)志中斷服務(wù)函數(shù)EXTI0voidEXTI0_IRQHandler(void)EXTI1voidEXTI1_IRQHandler(void)EXTI2voidEXTI2_IRQHandler(void)EXTI3voidEXTI3_IRQHandler(void)EXTI4voidEXTI4_IRQHandler(void)EXTI5-9voidEXTI9_5_IRQHandler(void)EXTI10-15voidEXTI15_10_IRQHandler(void)6.3STM32外部中斷EXTIEXTI0-EXTI4這56.4EXTI模塊的標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)及應(yīng)用6.4.1EXTI標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)

6.4.2EXTI標(biāo)準(zhǔn)外設(shè)庫中斷配置步驟6.4.3EXTI標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實例6.4EXTI模塊的標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)及應(yīng)用6.4.1E6.4.1EXTI標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)標(biāo)準(zhǔn)外設(shè)庫的stm32f10x_exti.c文件定義了EXTI相關(guān)的庫函數(shù)。EXTI標(biāo)準(zhǔn)外設(shè)庫函數(shù)stm32f10x_exti.h頭文件中聲明了EXTI相關(guān)的庫函數(shù),共有8種。6.4.1EXTI標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)標(biāo)準(zhǔn)外設(shè)庫的stm326.4.1EXTI標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)EXTI相關(guān)的庫函數(shù)EXTI_Init函數(shù)EXTI_GetITStatus函數(shù)EXTI_ClearITPendingBit函數(shù)GPIO_EXTILineConfig函數(shù)定義了EXTI_InitTypeDef結(jié)構(gòu)體用于檢查指定的EXTI線路觸發(fā)請求發(fā)生與否,返回值:SET或RESET用于清除EXTI線路掛起位用于選擇GPIO管腳用作外部中斷線路6.4.1EXTI標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)EXTI相關(guān)的庫函數(shù)Etypedefstruct{uint32_tEXTI_Line;

//中斷/事件線

EXTIMode_TypeDefEXTI_Mode;

//EXTI模式

EXTITrigger_TypeDefEXTI_Trigger;

//觸發(fā)類型

FunctionalStateEXTI_LineCmd;

//EXTI使能}EXTI_InitTypeDef;EXTI_InitTypeDef結(jié)構(gòu)體指定某個具體的外部中斷線路,如外部中斷線0,EXTI_Line0用于設(shè)置EXTI線路是中斷請求模式還是事件模式,取值可以是EXTI_Mode_Interrupt或EXTI_Mode_Event用于設(shè)置外部中斷的觸發(fā)方式,上升沿觸發(fā)或下降沿觸發(fā)等用于使能或失能外部中斷線路,取值為ENABLE或DISABLE6.4.1EXTI標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)typedefstructEXTI_InitTypeDef6.4.2EXTI標(biāo)準(zhǔn)外設(shè)庫中斷配置步驟21GPIO_InitTypeDefGPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;

//初始化I/O口為浮空輸入模式GPIO初始化配置GPIO用作EXTI外部中斷功能引腳,必須開啟復(fù)用功能,打開相應(yīng)引腳的AFIO時鐘,通過調(diào)用RCC_APB2PeriphClockCmd()函數(shù)實現(xiàn):RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO,ENABLE);開啟I/O端口的時鐘和復(fù)用時鐘6.4.2EXTI標(biāo)準(zhǔn)外設(shè)庫中斷配置步驟21GPIO_In6.4.2EXTI標(biāo)準(zhǔn)外設(shè)庫中斷配置步驟43EXTI_InitStructure.EXTI_Line=EXTI_Line3;//設(shè)置外部中斷線3中斷EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;

//設(shè)置為中斷模式EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising_Falling;

//設(shè)置為下降沿觸發(fā)EXTI_InitStructure.EXTI_LineCmd=ENABLE;//使能該外部中斷線EXTI_Init(&EXTI_InitStructure);設(shè)置I/O引腳與中斷線路的映射關(guān)系GPIO引腳作為中斷功能引腳用來觸發(fā)外部中斷時,需將GPIO的引腳與相應(yīng)的中斷線關(guān)聯(lián)在一起,使用庫函數(shù)GPIO_EXTILineConfig來實現(xiàn)這種映射關(guān)系。如GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);初始化EXTI,配置EXTI相關(guān)參數(shù)并使能6.4.2EXTI標(biāo)準(zhǔn)外設(shè)庫中斷配置步驟43EXTI_In6.4.2EXTI標(biāo)準(zhǔn)外設(shè)庫中斷配置步驟5NVIC相關(guān)的配置主要包括配置中斷優(yōu)先級的中斷分組,確定各具體中斷的搶占優(yōu)先級和響應(yīng)優(yōu)先級的大小。NVIC_InitTypeDefNVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel=EXTI3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);初始化NVIC,配置NVIC參數(shù)并使能6.4.2EXTI標(biāo)準(zhǔn)外設(shè)庫中斷配置步驟5NV6.4.2EXTI標(biāo)準(zhǔn)外設(shè)庫中斷配置步驟6中斷服務(wù)程序主要包括檢測中斷線路的狀態(tài)、中斷處理的內(nèi)容和清除相關(guān)的中斷。例如EXTI2的中斷服務(wù)程序:voidEXTI2_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line2)!=RESET)

//判斷某個線上的中斷是否發(fā)生{中斷邏輯…EXTI_ClearITPendingBit(EXTI_Line2);//清除中斷標(biāo)志}}編寫中斷服務(wù)程序6.4.2EXTI標(biāo)準(zhǔn)外設(shè)庫中斷配置步驟6中斷服6.4.3EXTI標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實例通過一個按鍵控制LED燈狀態(tài)翻轉(zhuǎn),每按下按鍵一次,LED燈的狀態(tài)變化一次。功能硬件設(shè)計

LED連接在STM32F103的PB5引腳上,按鍵K1連接在STM32F103的PE3引腳上6.4.3EXTI標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實例通過一個在BSP文件夾下新建exti_key.h和exti_key.c文件,并加入到工程中,添加方法為:在快捷功能欄中找到,單擊進入,在“Groups”一欄中找到“BSP”,選中,然后單擊“AddFiles”,添加要加入工程的.c文件,具體操作如圖所示。6.4.3EXTI標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實例軟件設(shè)計添加exti_key.c到工程中在BSP文件夾下新建exti_key.h和exti6.4.3EXTI標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實例#ifndef__EXTI_KEY_H#define__EXTI_KEY_H#include"stm32f10x.h"voidEXTI_Key_Init(void);#endif1.新建exti_key.h文件關(guān)鍵詞6.4.3EXTI標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實例#ifndef__E#include"exti_key.h"#include"misc.h"voidEXTI_Key_Init(void){ GPIO_InitTypeDefGPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOE,&GPIO_InitStructure);NVIC_InitTypeDefNVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel=EXTI3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;6.4.3EXTI標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實例2.新建exti_key.c文件

NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);EXTI_InitTypeDefEXTI_InitStructure;EXTI_ClearITPendingBit(EXTI_Line3);GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);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);}#include"exti_key.h"6.4.3EXT#include"stm32f10x.h"#include"led.h"#include"exti_key.h"intmain(void){LED_Init();GPIO_ResetBits(GPIOB,GPIO_Pin_5);EXTI_Key_Init();while(1){}}6.4.3EXTI標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實例3.main.c文件voidEXTI3_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line3)!=RESET){GPIO_WriteBit(GPIOB,GPIO_Pin_5,(BitAction)((1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5))));EXTI_ClearITPendingBit(EXTI_Line3);}}#include"stm32f10x.h"6.4.3EXuint8_tled=1;voidEXTI3_IRQHandler(void){

if(EXTI_GetITStatus(EXTI_Line3)!=RESET)

{led=~led;//狀態(tài)翻轉(zhuǎn)//如果等于1,則PB5復(fù)位點亮,否則置1熄滅

if(led==1)GPIO_ResetBits(GPIOB,GPIO_Pin_5);elseGPIO_SetBits(GPIOB,GPIO_Pin_5);}EXTI_ClearITPendingBit(EXTI_Line3);//清除EXTI3的中斷標(biāo)志位}6.4.3EXTI標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實例另外一種中斷處理程序,實現(xiàn)LED燈翻轉(zhuǎn)uint8_tled=1;6.4.3EXTI標(biāo)準(zhǔn)外設(shè)庫6.4.3EXTI標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實例使用RCC_APB2PeriphClockCmd()函數(shù)配置時鐘,初始化GPIO引腳為復(fù)用功能使用GPIO_EXTILineConfig()函數(shù)配置I/O引腳與外部中斷線路的映射關(guān)系使用EXTI_Init()函數(shù)配置外部中斷使用NVIC_Init()配置中斷優(yōu)先級等編寫中斷服務(wù)函數(shù)使用STM32的外部中斷步驟6.4.3EXTI標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實例使用RCC_APB2P嵌入式系統(tǒng)開發(fā)的程序架構(gòu)由初始化部分和主程序部分組成,初始化部分涉及到系統(tǒng)所用外設(shè)的初始化配置程序,主程序部分一般是由while(1){}構(gòu)成的無限循環(huán),程序?qū)嶓w一直循環(huán)不停地輪流執(zhí)行6.4.3EXTI標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實例

結(jié)構(gòu)簡單,容易實現(xiàn),但由于主程序部分是一個輪流執(zhí)行的無限循環(huán)體,遇到突發(fā)事件,無法保證系統(tǒng)響應(yīng)的及時性嵌入式系統(tǒng)開發(fā)的程序架構(gòu)由初始化部分和主程序部分組成前臺程序通過中斷來處理事件,后臺程序是一個無限循環(huán)的應(yīng)用程序?qū)嶓w,負責(zé)嵌入式系統(tǒng)軟、硬件資源的分配、管理等日常事務(wù)。6.4.3EXTI標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實例前后臺系統(tǒng)的程序架構(gòu)圖前臺程序通過中斷來處理事件,后臺程序是一個無限循環(huán)6.5EXTI模塊的HAL庫接口函數(shù)及應(yīng)用目錄6.5.1EXTI的HAL庫接口函數(shù)6.5.2EXTI的HAL庫應(yīng)用實例6.5EXTI模塊的HAL庫接口函數(shù)及應(yīng)用目錄.1EXTI的HAL庫接口函數(shù)EXTI的HAL庫接口函數(shù)的源碼定義在stm32f1xx_hal_exti.c源文件中,其對應(yīng)的頭文件stm32f1xx_hal_exti.h聲明了EXTI所有的庫函數(shù)類型函數(shù)及功能描述配置函數(shù)HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef*hexti,EXTI_ConfigTypeDef*pExtiConfig);功能描述:設(shè)置外部中斷EXTI的外部中斷線路HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef*hexti,EXTI_ConfigTypeDef*pExtiConfig);功能描述:獲取已配置好的外部中斷EXTI的外部中斷線路HAL_StatusTypeDefHAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef*hexti);功能描述:將已設(shè)置好的外部中斷線路清除HAL_EXTI_GetHandle(EXTI_HandleTypeDef*hexti,uint32_tExtiLine);功能描述:獲取EXTI的句柄引腳功能操作函數(shù)voidHAL_EXTI_IRQHandler(EXTI_HandleTypeDef*hexti);功能描述:外部中斷EXTI的中斷處理函數(shù)uint32_tHAL_EXTI_GetPending(EXTI_HandleTypeDef*hexti,uint32_tEdge);功能描述:獲取被掛起的外部中斷線/事件線voidHAL_EXTI_ClearPending(EXTI_HandleTypeDef*hexti,uint32_tEdge);功能描述:清除被掛起的外部中斷/事件線voidHAL_EXTI_GenerateSWI(EXTI_HandleTypeDef*hexti);功能描述:產(chǎn)生一個軟件中斷6.5.1EXTI的HAL庫接口函數(shù)EXTI的HA6.5.2EXTI的HAL庫應(yīng)用實例按鍵WAKE_UP連接在STM32F103的PA0引腳上,按下時PA0為高電平,按鍵S2連接在STM32F103的PE3引腳上。采用基于HAL庫設(shè)計方式,通過兩個按鍵分別控制兩個LED燈狀態(tài)翻轉(zhuǎn)。功能硬件設(shè)計6.5.2EXTI的HAL庫應(yīng)用實例按鍵WAKE新建STM32CubeMX工程,選擇MCUSTM32CubeMX功能參數(shù)配置生成工程代碼編寫應(yīng)用程序下載調(diào)試驗證軟件設(shè)計流程RCC和時鐘配置MCU引腳選擇GPIO引腳參數(shù)配置配置外部中斷參數(shù)6.5.2EXTI的HAL庫應(yīng)用實例新建STM32CubeMX工程,選擇MCUSTM32Cube軟件設(shè)計——新建STM32CubeMX工程,選擇MCU在D盤或其他盤符目錄下新建一個文件夾,用來存放后面建立的STM32CubeMX工程。需要注意的是:所建工程文件名最好是英文名稱,且最好是英文路徑。這里采用STM32F103ZET6芯片。軟件設(shè)計——新建STM32CubeMX工程,選擇MCU軟件設(shè)計——STM32CubeMX功能參數(shù)配置HSE選擇“Crystal/CeramicResonator”(晶振/陶瓷諧振器),LSE選擇“Disable”RCC配置軟件設(shè)計——STM32CubeMX功能參數(shù)配置HSE選擇“C軟件設(shè)計——STM32CubeMX功能參數(shù)配置LED2連接在PE5引腳上,LED3連接在PB5引腳上,設(shè)置為GPIO_Output;設(shè)置PA0為GPIO_EXTI0外部中斷線作為WAKE_UP按鍵使用,用于控制LED3燈閃爍;設(shè)置PE3為GPIO_EXTI3作為按鍵S2使用,用于控制LED2燈閃爍。MCU引腳選擇軟件設(shè)計——STM32CubeMX功能參數(shù)配置LED2連接在軟件設(shè)計——STM32CubeMX功能參數(shù)配置在“GPIO”參數(shù)配置中設(shè)置PA0為上升沿觸發(fā);PE3的“GPIOmode”設(shè)置為下降沿觸發(fā),添加用戶標(biāo)簽S2。PB5和PE5兩個LED燈設(shè)置為推挽輸出,分別添加用戶標(biāo)簽為LED2和LED3。GPIO引腳參數(shù)配置軟件設(shè)計——STM32CubeMX功能參數(shù)配置在“GPIO”軟件設(shè)計——STM32CubeMX功能參數(shù)配置通過圖形化方式直觀對系統(tǒng)時鐘進行配置,系統(tǒng)時鐘采用外部高速時鐘,配置STM32F103系列芯片最大時鐘為72MHz,配置APB2為72MHz,配置APB1為36MHz。時鐘配置軟件設(shè)計——STM32CubeMX功能參數(shù)配置通過圖形化方式軟件設(shè)計——STM32CubeMX功能參數(shù)配置在“NVIC”選項頁中,設(shè)置“PriorityGroup”進行優(yōu)先級分組;勾選“EXIT_Line0interrupt”使能PA0外部中斷線;類似地,勾選“EXTI_Line3interrupt”使能PE3外部中斷線。配置外部中斷參數(shù)軟件設(shè)計——STM32CubeMX功能參數(shù)配置在“NVIC”軟件設(shè)計——生成工程代碼定義“ProjectName”為“MyProject_EXTI”,“Toolchain/IDE”選擇“MDK-ARMV5”

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論