嵌入式系統(tǒng)設(shè)計(jì)與工程實(shí)踐 課件 第4章 外部中斷與應(yīng)用實(shí)例_第1頁(yè)
嵌入式系統(tǒng)設(shè)計(jì)與工程實(shí)踐 課件 第4章 外部中斷與應(yīng)用實(shí)例_第2頁(yè)
嵌入式系統(tǒng)設(shè)計(jì)與工程實(shí)踐 課件 第4章 外部中斷與應(yīng)用實(shí)例_第3頁(yè)
嵌入式系統(tǒng)設(shè)計(jì)與工程實(shí)踐 課件 第4章 外部中斷與應(yīng)用實(shí)例_第4頁(yè)
嵌入式系統(tǒng)設(shè)計(jì)與工程實(shí)踐 課件 第4章 外部中斷與應(yīng)用實(shí)例_第5頁(yè)
已閱讀5頁(yè),還剩54頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第4章外部中斷與應(yīng)用實(shí)例《嵌入式系統(tǒng)設(shè)計(jì)與工程實(shí)踐》配套課件《嵌入式系統(tǒng)設(shè)計(jì)》教研組本章概述本章主要講述了STM32F103的外部中斷系統(tǒng),包括中斷控制器NVIC的嵌套結(jié)構(gòu)和中斷優(yōu)先級(jí)設(shè)置,以及中斷向量表和中斷服務(wù)函數(shù)的定義。詳細(xì)介紹了STM32F103的外部中斷/事件控制器EXTI的內(nèi)部結(jié)構(gòu)、工作原理和主要特性。此外,還涵蓋了外部中斷的HAL驅(qū)動(dòng)函數(shù)及設(shè)計(jì)流程,并通過(guò)應(yīng)用實(shí)例展示了外部中斷的實(shí)際應(yīng)用。重點(diǎn)講述的內(nèi)容如下:(1)STM32F103中斷系統(tǒng)的基本結(jié)構(gòu)與優(yōu)先級(jí)設(shè)置。(2)STM32F103的EXTI內(nèi)部結(jié)構(gòu)及工作原理。(3)外部中斷的HAL驅(qū)動(dòng)函數(shù)及其設(shè)置。(4)STM32F103外部中斷設(shè)計(jì)流程。(5)外部中斷應(yīng)用實(shí)例的硬件與軟件設(shè)計(jì)。本章目錄4.1STM32F103中斷系統(tǒng)4.2STM32F103外部中斷/事件控制器EXTI4.5STM32F103的外部中斷應(yīng)用實(shí)例4.4STM32F103外部中斷設(shè)計(jì)流程4.3外部中斷的HAL驅(qū)動(dòng)函數(shù)本章目錄4.1STM32F103中斷系統(tǒng)4.2STM32F103外部中斷/事件控制器EXTI4.5STM32F103的外部中斷應(yīng)用實(shí)例4.4STM32F103外部中斷設(shè)計(jì)流程4.3外部中斷的HAL驅(qū)動(dòng)函數(shù)4.1STM32F103中斷系統(tǒng)中斷是計(jì)算機(jī)在執(zhí)行程序時(shí),CPU暫時(shí)停止當(dāng)前任務(wù)以處理更緊急事件的機(jī)制。它提高了工作效率,支持實(shí)時(shí)處理、故障處理和分時(shí)操作。中斷源引發(fā)中斷,程序可通過(guò)中斷屏蔽控制響應(yīng)。中斷處理包括請(qǐng)求、響應(yīng)、服務(wù)和返回,優(yōu)先級(jí)和嵌套機(jī)制確保緊急事件及時(shí)處理。(1)中斷的定義中斷是CPU在執(zhí)行任務(wù)中被更緊急事件打斷,轉(zhuǎn)去處理外設(shè)請(qǐng)求,完成后返回原任務(wù)。類似看書(shū)被門(mén)鈴打斷,提升系統(tǒng)并行與效率。(2)中斷的應(yīng)用用于提升CPU效率、實(shí)時(shí)響應(yīng)、故障搶救與分時(shí)協(xié)作。外設(shè)運(yùn)行時(shí)CPU可做他事;實(shí)時(shí)系統(tǒng)迅速響應(yīng)變化;故障中斷便于保存狀態(tài);協(xié)調(diào)多外設(shè)。(3)中斷源與屏蔽中斷源如按鍵、定時(shí)器溢出等,對(duì)應(yīng)標(biāo)志位置位表征事件。屏蔽功能可臨時(shí)禁止某些中斷,保障關(guān)鍵流程。中斷分為可屏蔽與不可屏蔽兩類。4.1STM32F103中斷系統(tǒng)(4)中斷處理過(guò)程流程含請(qǐng)求、響應(yīng)、服務(wù)與返回四步。處理中需保存斷點(diǎn)與上下文,以便恢復(fù)。現(xiàn)代MCU多由硬件自動(dòng)入棧與出棧,簡(jiǎn)化保護(hù)與恢復(fù)。這個(gè)處理過(guò)程稱為中斷處理過(guò)程,如圖4-1所示,其大致可以分為四步:中斷請(qǐng)求、中斷響應(yīng)、中斷服務(wù)和中斷返回。圖4-1中斷處理過(guò)程示意圖4.1STM32F103中斷系統(tǒng)(5)優(yōu)先級(jí)與嵌套優(yōu)先級(jí)決定多源先后,高優(yōu)先級(jí)先響應(yīng)。嵌套指處理中斷時(shí)遇更高優(yōu)先級(jí)再入中斷,完成后返回原中斷,確保緊急事件及時(shí)處理。4.1STM32F103中斷系統(tǒng)嵌套向量中斷控制器,簡(jiǎn)稱NVIC,是ARMCortex-M3不可分離的一部分。NVIC與Cortex-M3緊耦合協(xié)同響應(yīng)中斷。M3支持256中斷與256級(jí)優(yōu)先級(jí);STM32含84中斷與16級(jí)優(yōu)先級(jí)。68通道固定映射,每通道1字節(jié)優(yōu)先級(jí)(高4位有效),每4通道組成1個(gè)32位寄存器,共≥17個(gè)。4.1.1嵌套向量中斷控制器NVIC4.1STM32F103中斷系統(tǒng)中斷優(yōu)先級(jí)決定了一個(gè)中斷是否能被屏蔽,以及在未屏蔽的情況下何時(shí)可以響應(yīng)。優(yōu)先級(jí)的數(shù)值越小,則優(yōu)先級(jí)越高。STM32(Cortex-M3)中有兩個(gè)優(yōu)先級(jí)的概念:搶占式優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí),也把響應(yīng)優(yōu)先級(jí)稱作“亞優(yōu)先級(jí)”或“副優(yōu)先級(jí)”,每個(gè)中斷源都需要被指定這兩種優(yōu)先級(jí)。1.何為搶占式優(yōu)先級(jí)(preemptionpriority)高搶占式優(yōu)先級(jí)的中斷事件會(huì)打斷當(dāng)前的主程序/中斷程序運(yùn)行,俗稱中斷嵌套。2.何為響應(yīng)優(yōu)先級(jí)(subpriority)在搶占式優(yōu)先級(jí)相同的情況下,高響應(yīng)優(yōu)先級(jí)的中斷優(yōu)先被響應(yīng)。在搶占式優(yōu)先級(jí)相同的情況下,如果有低響應(yīng)優(yōu)先級(jí)中斷正在執(zhí)行,高響應(yīng)優(yōu)先級(jí)的中斷要等待已被響應(yīng)的低響應(yīng)優(yōu)先級(jí)中斷執(zhí)行結(jié)束后才能得到響應(yīng)(不能嵌套)。4.1.2STM32F103中斷優(yōu)先級(jí)4.1STM32F103中斷系統(tǒng)3.判斷中斷是否會(huì)被響應(yīng)的依據(jù)首先是搶占式優(yōu)先級(jí),其次是響應(yīng)優(yōu)先級(jí)。搶占式優(yōu)先級(jí)決定是否會(huì)有中斷嵌套。4.優(yōu)先級(jí)沖突的處理高搶占優(yōu)先級(jí)中斷可打斷低搶占級(jí)中斷服務(wù),實(shí)現(xiàn)中斷嵌套;即高搶占級(jí)可嵌套低搶占級(jí)。同搶占級(jí)無(wú)嵌套:后到需等待先到完成;若同時(shí)到達(dá),先比響應(yīng)優(yōu)先級(jí),相同則按向量表順序處理。4.1STM32F103中斷系統(tǒng)5.STM32中對(duì)中斷優(yōu)先級(jí)的定義STM32中指定中斷優(yōu)先級(jí)的寄存器位有4位,這4個(gè)寄存器位的分組方式如下:(1)第0組:所有4位用于指定響應(yīng)優(yōu)先級(jí)。(2)第1組:最高1位用于指定搶占式優(yōu)先級(jí),最低3位用于指定響應(yīng)優(yōu)先級(jí)。(3)第2組:最高2位用于指定搶占式優(yōu)先級(jí),最低2位用于指定響應(yīng)優(yōu)先級(jí)。(4)第3組:最高3位用于指定搶占式優(yōu)先級(jí),最低1位用于指定響應(yīng)優(yōu)先級(jí)。(5)第4組:所有4位用于指定搶占式優(yōu)先級(jí)。優(yōu)先級(jí)分組方式所對(duì)應(yīng)的搶占式優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)寄存器位數(shù)和所表示的優(yōu)先級(jí)數(shù)如圖4-2所示。8.2具身智能和具身人工智能圖4-2STM32F103優(yōu)先級(jí)位數(shù)和級(jí)數(shù)分配圖4.1STM32F103中斷系統(tǒng)中斷向量表是中斷系統(tǒng)中非常重要的概念。它是一塊存儲(chǔ)區(qū)域,通常位于存儲(chǔ)器的地址處,在這塊區(qū)域上按中斷號(hào)從小到大依次存放著所有中斷處理程序的入口地址。當(dāng)某中斷產(chǎn)生且經(jīng)判斷其未被屏蔽,CPU會(huì)根據(jù)識(shí)別到的中斷號(hào)到中斷向量表中找到該中斷的所在表項(xiàng),取出該中斷對(duì)應(yīng)的中斷服務(wù)程序的入口地址,然后跳轉(zhuǎn)到該地址執(zhí)行STM32F103產(chǎn)品的中斷向量表,如書(shū)中表4-1所示。STM32F1系列微控制器不同產(chǎn)品支持可屏蔽中斷的數(shù)量略有不同。互聯(lián)型的STM32F105系列和STM32F107系列共支持68個(gè)可屏蔽中斷通道。其他非互聯(lián)型的產(chǎn)品(包括STM32F103系列)支持60個(gè)可屏蔽中斷通道。4.1.3STM32F103中斷向量表4.1STM32F103中斷系統(tǒng)中斷服務(wù)程序類似函數(shù)但無(wú)參無(wú)返,僅在中斷觸發(fā)時(shí)被隱式調(diào)用;需與啟動(dòng)文件中斷名一致以正確覆蓋默認(rèn)處理。(1)ISR命名形式為PPP_IRQHandler,PPP對(duì)應(yīng)外設(shè)名,啟動(dòng)文件中已預(yù)定義默認(rèn)空實(shí)現(xiàn)。(2)用戶在stm32f10x_it.c中用同名C函數(shù)重定義,即可在鏈接時(shí)覆蓋默認(rèn)中斷處理程序。(3)務(wù)必確保函數(shù)名與startup_stm32f10x_xx.s一致,如EXTI1_IRQHandler,否則無(wú)法正確綁定。(4)ISR內(nèi)只做必要處理,快速退出;將耗時(shí)邏輯轉(zhuǎn)移至主循環(huán)或RTOS任務(wù),避免阻塞中斷。4.1.4STM32F103中斷服務(wù)函數(shù)4.1STM32F103中斷系統(tǒng)(5)在ISR中避免使用阻塞API與復(fù)雜庫(kù)函數(shù);若需通信,采用標(biāo)志位、環(huán)形緩沖或輕量消息。(6)如需使用C++,將ISR聲明為extern"C"以禁用名稱修飾,確保與向量表符號(hào)匹配。(7)調(diào)試建議:開(kāi)啟對(duì)應(yīng)外設(shè)與NVIC,清中斷標(biāo)志位;若ISR不進(jìn),優(yōu)先核對(duì)函數(shù)名與啟動(dòng)文件。本章目錄4.1STM32F103中斷系統(tǒng)4.2STM32F103外部中斷/事件控制器EXTI4.5STM32F103的外部中斷應(yīng)用實(shí)例4.4STM32F103外部中斷設(shè)計(jì)流程4.3外部中斷的HAL驅(qū)動(dòng)函數(shù)4.2STM32F103外部中斷/事件控制器EXTISTM32F103微控制器的外部中斷/事件控制器(EXTI)由19個(gè)產(chǎn)生事件/中斷請(qǐng)求邊沿檢測(cè)器組成,每個(gè)輸入線可以獨(dú)立地配置輸入類型(脈沖或掛起)和對(duì)應(yīng)的觸發(fā)事件升沿或下降沿或者雙邊沿都觸發(fā))。每個(gè)輸入線都可以獨(dú)立地被屏蔽。掛起寄存器保持狀態(tài)線的中斷請(qǐng)求。4.2STM32F103外部中斷/事件控制器EXTI在STM32F103微控制器中,外部中斷/事件控制器EXTI,由19根外部輸入線、19個(gè)生中斷/事件請(qǐng)求的邊沿檢測(cè)器和APB外設(shè)接口等部分組成,如圖4-3所示。4.2.1STM32F103的EXTI內(nèi)部結(jié)構(gòu)4.2STM32F103外部中斷/事件控制器EXTI圖4-3STM32F103外部中斷/事件控制器內(nèi)部結(jié)構(gòu)圖4.2STM32F103外部中斷/事件控制器EXTI1.外部中斷與事件輸入從圖4-3可以看出,STM32F103外部中斷/事件控制器EXTI內(nèi)部信號(hào)線上畫(huà)有一斜線,旁邊標(biāo)有19,表示這樣的線路共有19套。(1)線路總數(shù)與命名:EXTI共有19根外部中斷/事件輸入線,命名為EXTI0、EXTI1~EXTI18。(2)特殊通道:EXTI16連接PVD輸出,EXTI17連接RTC鬧鐘,EXTI18連接USB喚醒信號(hào)。(3)通用通道映射:EXTI0~EXTI15可分別映射到STM32F103任一端口的對(duì)應(yīng)引腳Px0~Px15。(4)支持的端口:端口字母x可為A/B/C/D/E/F/G,實(shí)現(xiàn)跨端口的同號(hào)引腳復(fù)用至相同EXTI線。4.2STM32F103外部中斷/事件控制器EXTI(5)典型用法:通過(guò)AFIO_EXTICR選擇具體Pxn映射到EXTIn,并在EXTI與NVIC中配置觸發(fā)與使能。STM32F103微控制器最多有112個(gè)引腳,可以以下方式連接到16根外部中斷/事件輸入線上,如圖4-4所示。(1)按號(hào)映射規(guī)則:任一端口的0號(hào)腳(PA0/PB0~PG0)映射到EXTI0;1號(hào)腳到EXTI1;…;15號(hào)腳到EXTI15。(2)互斥限制:同一時(shí)刻,同一EXTIn只能選擇一個(gè)端口的同號(hào)引腳參與映射(例如EXTI0只能選PA0或PB0等之一)。(3)配置位置:映射選擇在AFIO->EXTICR[0..3]中設(shè)置,每個(gè)寄存器控制4條EXTI線的端口選擇。4.2STM32F103外部中斷/事件控制器EXTI(4)實(shí)踐建議:優(yōu)先選用噪聲小、帶上拉/下拉方便的引腳;規(guī)劃避免多個(gè)外設(shè)爭(zhēng)搶同一EXTIn資源。另外,如果將STM32F103的I/O引腳映射為EXTI的外部中斷/事件輸入線,必須將該引腳設(shè)置為輸入模式。4.2STM32F103外部中斷/事件控制器EXTI圖4-4STM32F103外部中斷/事件輸入線映像4.2STM32F103外部中斷/事件控制器EXTI2.APB外設(shè)接口圖4-3上部的APB外設(shè)模塊接口是STM32F103微控制器每個(gè)功能模塊都有的部分,CPU通過(guò)這樣的接口訪問(wèn)各個(gè)功能模塊。尤其需要注意的是,如果使用STM32F103引腳的外部中斷/事件映射功能,必須打開(kāi)APB2總線上該引腳對(duì)應(yīng)端口的時(shí)鐘以及AFIO功能時(shí)鐘。3.邊沿檢測(cè)器EXTI中的邊沿檢測(cè)器共有19個(gè),用來(lái)連接19個(gè)外部中斷/事件輸入線,是EXTI的主體部分。每個(gè)邊沿檢測(cè)器由邊沿檢測(cè)電路、控制寄存器、門(mén)電路和脈沖發(fā)生器等部分組成。4.2STM32F103外部中斷/事件控制器EXTI1.外部中斷/事件請(qǐng)求的產(chǎn)生和傳輸從圖4-3可以看出,外部中斷/事件請(qǐng)求的產(chǎn)生和傳輸過(guò)程如下:(1)外部信號(hào)由編號(hào)1的芯片引腳進(jìn)入STM32F103,作為EXTI輸入源,按配置參與中斷或事件流程。(2)邊沿檢測(cè)由上升沿與下降沿觸發(fā)寄存器控制,可選上升、下降或雙邊沿觸發(fā)中斷/事件。(3)信號(hào)經(jīng)編號(hào)3或門(mén),與軟件中斷/事件寄存器并聯(lián);軟件置位可直接產(chǎn)生有效請(qǐng)求,路徑一致。(4)事件路徑:信號(hào)入編號(hào)4與門(mén),由事件屏蔽寄存器控制;為1放行至脈沖發(fā)生器,輸出單脈沖。(5)中斷路徑:信號(hào)置位掛起寄存器,再入編號(hào)6與門(mén);中斷屏蔽寄存器為1時(shí)送NVIC產(chǎn)生中斷,否則屏蔽。4.2.2STM32F103的EXTI工作原理4.2STM32F103外部中斷/事件控制器EXTI2.事件與中斷由上面講述的外部中斷/事件請(qǐng)求信號(hào)的產(chǎn)生和傳輸過(guò)程可知,從外部激勵(lì)信號(hào)看,中斷和事件的請(qǐng)求信號(hào)沒(méi)有區(qū)別,只是在STM32F103微控制器內(nèi)部將它們分開(kāi)。(1)一路信號(hào)(中斷)會(huì)被送至NVIC向CPU產(chǎn)生中斷請(qǐng)求,至于CPU如何響應(yīng),由用戶編寫(xiě)或系統(tǒng)默認(rèn)的對(duì)應(yīng)的中斷服務(wù)程序決定。(2)另一路信號(hào)(事件)會(huì)向其他功能模塊(如定時(shí)器、USART、DMA等)發(fā)送脈沖觸發(fā)信號(hào),至于其他功能模塊會(huì)如何響應(yīng)這個(gè)脈沖觸發(fā)信號(hào),則由對(duì)應(yīng)的模塊自己決定。4.2STM32F103外部中斷/事件控制器EXTISTM32F103微控制器的外部中斷/事件控制器EXTI,具有以下主要特性:(1)每個(gè)外部中斷/事件輸入線都可以獨(dú)立地配置它的觸發(fā)事件(上升沿、下降沿或雙邊沿),并能夠單獨(dú)地被屏蔽。(2)每個(gè)外部中斷都有專用的標(biāo)志位(請(qǐng)求掛起寄存器),保持著它的中斷請(qǐng)求。(3)可以將多達(dá)112個(gè)通用I/O引腳映射到16個(gè)外部中斷/事件輸入線上。(4)可以檢測(cè)脈沖寬度低于APB2時(shí)鐘寬度的外部信號(hào)。4.2.3EXTI主要特性本章目錄4.1STM32F103中斷系統(tǒng)4.2STM32F103外部中斷/事件控制器EXTI4.5STM32F103的外部中斷應(yīng)用實(shí)例4.4STM32F103外部中斷設(shè)計(jì)流程4.3外部中斷的HAL驅(qū)動(dòng)函數(shù)4.3外部中斷的HAL驅(qū)動(dòng)函數(shù)STM32中斷系統(tǒng)是通過(guò)一個(gè)嵌套向量中斷控制器(NVIC)進(jìn)行中斷控制的,使用中斷要先對(duì)NVIC進(jìn)行配置。STM32的HAL庫(kù)中提供了NVIC相關(guān)操作函數(shù)。STM32F1中斷管理相關(guān)驅(qū)動(dòng)程序的頭文件是stm32f1xx_hal_cortex.h,其常用函數(shù)如表4-2所示。4.3.1中斷設(shè)置相關(guān)HAL驅(qū)動(dòng)函數(shù)4.3外部中斷的HAL驅(qū)動(dòng)函數(shù)4-2中斷管理常用函數(shù)4.3外部中斷的HAL驅(qū)動(dòng)函數(shù)表4-2中前面的3個(gè)函數(shù)用于STM32CubeMX自動(dòng)生成的代碼,其他函數(shù)用于用戶代碼。幾個(gè)常用的函數(shù)詳細(xì)介紹如下。1.函數(shù)HAL_NVIC_SetPriorityGrouping()函數(shù)HAL_NVIC_SetPriorityGrouping()用于設(shè)置優(yōu)先級(jí)分組策略,其函數(shù)原型定義如下:

voidHAL_NVIC_SetPriorityGrouping(uint32_tPriorityGroup);其中,參數(shù)PriorityGroup是優(yōu)先級(jí)分組策略,可使用文件stm32f1xx_hal_cortex.h中定義的幾個(gè)宏定義常量,如下所示,它們表示不同的分組策略。#defineNVIC_PRIORITYGROUP_00x00000007U//0位用于搶占優(yōu)先級(jí),4位用于次優(yōu)先級(jí)#defineNVIC_PRIORITYGROUP_10x00000006U//1位用于搶占優(yōu)先級(jí),3位用于次優(yōu)先級(jí)#defineNVIC_PRIORITYGROUP_20x00000005U//2位用于搶占優(yōu)先級(jí),2位用于次優(yōu)先級(jí)#defineNVIC_PRIORITYGROUP_30x00000004U//3位用于搶占優(yōu)先級(jí),1位用于次優(yōu)先級(jí)#defineNVIC_PRIORITYGROUP_40x00000003U//4位用于搶占優(yōu)先級(jí),0位用于次優(yōu)先級(jí)4.3外部中斷的HAL驅(qū)動(dòng)函數(shù)2.函數(shù)HAL_NVIC_SetPriority()函數(shù)HAL_NVIC_SetPriority()用于設(shè)置某個(gè)中斷的搶占優(yōu)先級(jí)和次優(yōu)先級(jí),其函數(shù)原型定義如下:voidHAL_NVIC_SetPrlorlty(IRQn_TypeIRQn,uint32_tPreemptprlority,uint32_tsubpriority);其中,參數(shù)IRQn是中斷的中斷號(hào),為枚舉類型IRQn_Type。枚舉類型IROn_Type的定義在文件stm32f103xe.h中,它定義了表4-1中所有中斷的中斷號(hào)枚舉值。在中斷操作的相關(guān)函數(shù)中,都用IRQn_Type類型的中斷號(hào)表示中斷,這個(gè)枚舉類型的部分定義如下:typedefenum{/******Cortex-M3ProcessorExceptionsNumbers*******************************/NonMaskableInt_IRQn=-14,//NonMaskableInterruptMemoryManagement_IRQn=-12,//Cortex-M4MemoryManagementInterrupt4.3外部中斷的HAL驅(qū)動(dòng)函數(shù)BusFault_IRQn=-11,//Cortex-M4BusFaultInterruptUsageFault_IRQn=-10,//Cortex-M4UsageFaultInterruptSVCa11_IRQn=-5,//Cortex-M4SVCallInterruptDebugMonitor_IRQn=-4,//Cortex-M4DebugMonitorInterruptPendSV_IRQn=-2,//Cortex-M4PendSVInterruptSysTick_IRQn=-1,//Cortex-M4SystemTickInterrupt/******STM32specificInterruptNumbers******************************/WWDG_IRQn=0,//WindowWatchDogInterruptPVD_IRQn=1,//PVDthroughEXTILinedetectionInterruptEXTI0_IRQn=6,//EXTILineoInterruptEXTI1_IRQn=7,//EXTILinelInterruptEXTI2_IRQn=8,//EXTILine2InterruptRNG_IRQn=80,//RNGglobalInterruptFPU_IRQn=81.//FPUglobalinterrupt}IRQn_Type:4.3外部中斷的HAL驅(qū)動(dòng)函數(shù)由這個(gè)枚舉類型的定義代碼可以看到,其中斷號(hào)枚舉值就是在中斷名稱后面加了“_IRQn”。例如,中斷號(hào)為0的窗口看門(mén)狗中斷WWDG,其中斷號(hào)枚舉值就是WWDG_IRQn。函數(shù)中的另外兩個(gè)參數(shù),PreemptPriority是搶占優(yōu)先級(jí)數(shù)值,SubPriority是次優(yōu)先級(jí)數(shù)值。這兩個(gè)優(yōu)先級(jí)的數(shù)值范圍需要在設(shè)置的優(yōu)先級(jí)分組策略的可設(shè)置范圍之內(nèi)。例如,假設(shè)使用了分組策略2,對(duì)于中斷號(hào)為6的外部中斷EXTI0,設(shè)置其搶占優(yōu)先級(jí)為1,次優(yōu)先級(jí)為0,則執(zhí)行的代碼如下:HAL_NVIC_SetPriority(EXTIO_IRQn,1,0);3.函數(shù)HAL_NVIC_EnableIRQ()函數(shù)HAL_NVIC_EnableIRQ()的功能是在NVIC控制器中開(kāi)啟某個(gè)中斷,只有在NVIC中開(kāi)啟某個(gè)中斷后,NVIC才會(huì)對(duì)這個(gè)中斷請(qǐng)求做出響應(yīng),執(zhí)行相應(yīng)的ISR。其原型定義如下:voidHAL_NVIC_EnableIRQ(IRQn_TypeIRQn):其中,枚舉類型IRQn_Type的參數(shù)IRQn是中斷號(hào)的枚舉值。4.3外部中斷的HAL驅(qū)動(dòng)函數(shù)外部中斷相關(guān)函數(shù)的定義在文件stm32f1xx_hal_gpio.h中,函數(shù)列表如表4-3所示。4.3.2外部中斷相關(guān)HAL函數(shù)表4-3外部中斷相關(guān)函數(shù)4.3外部中斷的HAL驅(qū)動(dòng)函數(shù)1.讀取和清除中斷標(biāo)志在HAL庫(kù)中,以“_HAL”為前綴的都是宏函數(shù)。例如,函數(shù)_HAL_GPIO_EXTI_GET_IT()的定義如下:#define_HAL_GPIO_EXTI_GET_FLAG(_EXTI_LINE_)(EXTI->PR&(_EXTI_LINE_))它的功能就是檢查外部中斷掛起寄存器(EXTI_PR)中某個(gè)中斷線的掛起標(biāo)志位是否置位。參數(shù)函數(shù)_HAL_GPIO_EXTI_CLEAR_IT()用于清除某個(gè)中斷線的中斷掛起標(biāo)志位,其定義如下:

#define_HAL_GPIO_EXTI_CLEAR_IT(_EXTI_LINE_)(EXTI->PR=(_EXTI_LINE_))2.在某個(gè)外部中斷線上產(chǎn)生軟中斷函數(shù)_HAL_GPIO_EXTI_GENERATE_SWIT()的功能是在某個(gè)中斷線上產(chǎn)生軟中斷,其定義如下:#define_HAL_GPIO_EXTI_GENERATE_SWIT(_EXTI_LINE_)(EXTI->SWIER|=(_EXTI_LINE_))4.3外部中斷的HAL驅(qū)動(dòng)函數(shù)3.外部中斷ISR以及中斷處理回調(diào)函數(shù)對(duì)于0到15線的外部中斷,EXTI0至EXTI4有獨(dú)立的ISR,EXTI[9:5]共用一個(gè)ISR,EXTI[15:10]共用一個(gè)ISR。在啟用某個(gè)中斷后,在STM32CubeMX自動(dòng)生成的中斷處理程序文件stm32f1xx_it.c中會(huì)生成ISR的代碼框架。這些外部中斷ISR的代碼都是一樣的,下面是幾個(gè)外部中斷的ISR代碼框架,只保留了其中一個(gè)ISR的完整代碼,其他的刪除了代碼沙箱注釋。voidEXTI0_IRQHandler(void)//EXTI0的ISR{/*USERCODEBEGINEXTI0_IRQn0*//*USERCODEENDEXTI0_IRQn0*/HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);/*USERCODEBEGINEXTI0_IRQn1*/4.3外部中斷的HAL驅(qū)動(dòng)函數(shù)/*USERCODEENDEXTI0_IRQn1*/}voidEXTI9_5_IRQHandler(void)//EXTI[9:5]的ISR{HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);}voidEXTI15_10_IRQHandler(void)//EXTI[15:10]的ISR{HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_11);}4.3外部中斷的HAL驅(qū)動(dòng)函數(shù)可以看到,這些ISR都調(diào)用了函數(shù)HAL_GPIO_EXTI_IRQHandler(),并以中斷線作為函數(shù)參數(shù)。所以,函數(shù)HAL_GPIO_EXTI_IRQHandler()是外部中斷處理通用函數(shù),這個(gè)函數(shù)的代碼如下:voidHAL_GPIO_EXTI_IRQHandler(uint16_tGPIO_Pin){/*EXTIlineinterruptdetected*/If(_HAL_GPIO_EXTI_GET_IT(GPIO_Pin)!=RESET)//檢測(cè)中斷掛起標(biāo)志{__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);//清除中斷掛起標(biāo)志HAL_GPIO_EXTI_Callback(GPIO_Pin);//執(zhí)行回調(diào)函數(shù)}}本章目錄4.1STM32F103中斷系統(tǒng)4.2STM32F103外部中斷/事件控制器EXTI4.5STM32F103的外部中斷應(yīng)用實(shí)例4.4STM32F103外部中斷設(shè)計(jì)流程4.3外部中斷的HAL驅(qū)動(dòng)函數(shù)4.4STM32F103外部中斷設(shè)計(jì)流程STM32F1中斷設(shè)計(jì)包括三部分,即NVIC設(shè)置、中斷端口配置、中斷處理。使用庫(kù)函數(shù)配置外部中斷的步驟。(1)使能GPIO口時(shí)鐘,初始化GPIO口為輸入。首先,要使用GPIO口作為中斷輸入,所以要使能相應(yīng)的GPIO口時(shí)鐘。(2)設(shè)置GPIO口模式,觸發(fā)條件,開(kāi)啟SYSCFG時(shí)鐘,設(shè)置GPIO口與中斷線的映射關(guān)系。該步驟如果使用標(biāo)準(zhǔn)庫(kù),那么需要多個(gè)函數(shù)分步實(shí)現(xiàn)。而當(dāng)使用HAL庫(kù)的時(shí)候,則都是在函數(shù)HAL_GPIO_Init中一次性完成的。例如要設(shè)置PA0連接中斷線0,并且為上升沿觸發(fā),代碼為:GPIO_InitTypeDefGPIO_Initure;GPIO_Initure.Pin=GPIO_PIN_0;//PA0GPIO_Initure.Mode=GPIO_MODE_IT_RISING;//外部中斷,上升沿觸發(fā)GPIO_Initure.Pull=GPIO_PULLDOWN;//默認(rèn)下拉HAL_GPIO_Init(GPIOA,&GPIO_Initure);4.4STM32F103外部中斷設(shè)計(jì)流程(3)配置中斷優(yōu)先級(jí)(NVIC),并使能中斷。設(shè)置好中斷線和GPIO映射關(guān)系,然后又設(shè)置好了中斷的觸發(fā)模式等初始化參數(shù)。既然是外部中斷,涉及到中斷當(dāng)然還要設(shè)置NVIC中斷優(yōu)先級(jí)。設(shè)置中斷線0的中斷優(yōu)先級(jí)并使能外部中斷0的方法為:HAL_NVIC_SetPriority(EXTI0_IRQn,2,0); //搶占優(yōu)先級(jí)為2,子優(yōu)先級(jí)為0HAL_NVIC_EnableIRQ(EXTI0_IRQn); //使能中斷線24.4STM32F103外部中斷設(shè)計(jì)流程(4)編寫(xiě)中斷服務(wù)函數(shù)。配置完中斷優(yōu)先級(jí)之后,接著要做的就是編寫(xiě)中斷服務(wù)函數(shù)。中斷服務(wù)函數(shù)的名字是在HAL庫(kù)中事先有定義的。這里需要說(shuō)明一下,STM32F1的IO口外部中斷函數(shù)只有7個(gè),分別為:voidEXTI0_IRQHandler();voidEXTI1_IRQHandler();voidEXTI2_IRQHandler();voidEXTI3_IRQHandler();voidEXTI4_IRQHandler();voidEXTI9_5_IRQHandler();voidEXTI15_10_IRQHandler();4.4STM32F103外部中斷設(shè)計(jì)流程(5)編寫(xiě)中斷處理回調(diào)函數(shù)HAL_GPIO_EXTI_Callback。在使用HAL庫(kù)的時(shí)候,也可以跟使用標(biāo)準(zhǔn)庫(kù)一樣,在中斷服務(wù)函數(shù)中編寫(xiě)控制邏輯。但是HAL庫(kù)為了用戶使用方便,它提供了一個(gè)中斷通用入口函數(shù)HAL_GPIO_EXTI_IRQHandler,在該函數(shù)內(nèi)部直接調(diào)用回調(diào)函數(shù)HAL_GPIO_EXTI_Callback。可以看看HAL_GPIO_EXTI_IRQHandler函數(shù)定義:voidHAL_GPIO_EXTI_IRQHandler(uint16_tGPIO_Pin){if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin)!=0x00u){__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);__HAL_GPIO_EXTI_Callback(GPIO_Pin);}}4.4STM32F103外部中斷設(shè)計(jì)流程下面再總結(jié)一下配置GPIO口外部中斷的一般步驟:(1)使能GPIO口時(shí)鐘。(2)調(diào)用函數(shù)HAL_GPIO_Init設(shè)置GPIO口模式,觸發(fā)條件,使能SYSCFG時(shí)鐘以及設(shè)置GPIO口與中斷線的映射關(guān)系。(3)配置中斷優(yōu)先級(jí)(NVIC),并使能中斷。(4)在中斷服務(wù)函數(shù)中調(diào)用外部中斷共用入口函數(shù)HAL_GPIO_EXTI_IRQHandler。(5)編寫(xiě)外部中斷回調(diào)函數(shù)HAL_GPIO_EXTI_Callback。通過(guò)以上幾個(gè)步驟的設(shè)置,就可以正常使用外部中斷了。本章目錄4.1STM32F103中斷系統(tǒng)4.2STM32F103外部中斷/事件控制器EXTI4.5STM32F103的外部中斷應(yīng)用實(shí)例4.4STM32F103外部中斷設(shè)計(jì)流程4.3外部中斷的HAL驅(qū)動(dòng)函數(shù)4.5STM32F103的外部中斷應(yīng)用實(shí)例本實(shí)例是一個(gè)基于STM32微控制器的簡(jiǎn)單例程,通過(guò)按下KEY0(PC13)或KEY_UP(PA0)按鍵來(lái)控制LED0(PA8)的狀態(tài)翻轉(zhuǎn)。首先,在STM32CubeMX中配置GPIO:將PA8設(shè)置為推挽輸出模式以控制LED0,將PC13和PA0配置為輸入模式并啟用內(nèi)部上拉電阻以檢測(cè)按鍵狀態(tài)。生成代碼后,在main.c中實(shí)現(xiàn)按鍵控制和LED翻轉(zhuǎn)的邏輯。4.5STM32F103的外部中斷應(yīng)用實(shí)例外部中斷設(shè)計(jì)實(shí)例的硬件設(shè)計(jì)同按鍵的硬件設(shè)計(jì),同圖3-13所示。本實(shí)例使用STM32F103C8T6最小系統(tǒng)板上的兩個(gè)按鍵,分別為KEY0按鍵和KEY_UP按鍵。當(dāng)按鍵被按下時(shí),PC13或PA0引腳的電平將從低電平狀態(tài)變?yōu)楦唠娖綘顟B(tài),產(chǎn)生一個(gè)上升沿信號(hào)。因此,可以將該上升沿信號(hào)用作中斷的觸發(fā)源。4.5.1STM32F103的外部中斷應(yīng)用實(shí)例硬件設(shè)計(jì)4.5STM32F103的外部中斷應(yīng)用實(shí)例EXTI(外部中斷/事件控制器)用于管理來(lái)自GPIO等I/O引腳的信號(hào)引起的中斷或事件。使用EXTI進(jìn)行配置的流程如下:(1)配置EXTI線:設(shè)置EXTI線的模式、觸發(fā)條件以及使能狀態(tài)等配置項(xiàng)。(2)使能EXTI線中斷:?jiǎn)⒂肊XTI線的中斷,并配置其相關(guān)的中斷優(yōu)先級(jí)。為實(shí)現(xiàn)這兩個(gè)步驟,可以使用HAL庫(kù)中的驅(qū)動(dòng)函數(shù)進(jìn)行配置。1.exti.h頭文件exti.h頭文件用于定義STM32F103微控制器的外部中斷(EXTI)驅(qū)動(dòng)代碼,主要功能包括以下幾個(gè)方面:(1)引腳和中斷編號(hào)的定義:文件中定義了與按鍵相關(guān)的GPIO引腳及其對(duì)應(yīng)的中斷編號(hào)。例如,KEY0按鍵連接到GPIOC的第13引腳,WKUP按鍵連接到GPIOA的第0引腳。通過(guò)這些定義,程序可以方便地引用和管理這些引腳。4.5.2STM32F103的外部中斷應(yīng)用實(shí)例軟件設(shè)計(jì)4.5STM32F103的外部中斷應(yīng)用實(shí)例(2)時(shí)鐘使能宏:為每個(gè)引腳提供了時(shí)鐘使能的宏定義,如KEY0_INT_GPIO_CLK_ENABLE()和WKUP_INT_GPIO_CLK_ENABLE()。這些宏通過(guò)調(diào)用__HAL_RCC_GPIOx_CLK_ENABLE()函數(shù)來(lái)使能相應(yīng)GPIO端口的時(shí)鐘,確保外部中斷功能正常工作。(3)中斷處理函數(shù)的定義:文件中還定義了與外部中斷相關(guān)的中斷請(qǐng)求號(hào)和中斷處理函數(shù)。例如,KEY0的中斷請(qǐng)求號(hào)為EXTI15_10_IRQn,其處理函數(shù)為EXTI15_10_IRQHandler。這些定義使得在中斷發(fā)生時(shí),能夠正確調(diào)用相應(yīng)的中斷服務(wù)程序。文件還聲明了exti_init()函數(shù),用于外部中斷的初始化,確保中斷系統(tǒng)的正常運(yùn)行。整體而言,exti.h提供了外部中斷配置和管理的基礎(chǔ)框架。4.5STM32F103的外部中斷應(yīng)用實(shí)例2.exti.c文件exti.c文件實(shí)現(xiàn)了STM32F103微控制器的外部中斷(EXTI)驅(qū)動(dòng)代碼,主要功能包括以下幾個(gè)方面:(1)中斷服務(wù)程序:文件中定義了兩個(gè)中斷服務(wù)程序,分別為KEY0_INT_IRQHandler和WKUP_INT_IRQHandler。這兩個(gè)函數(shù)在相應(yīng)按鍵被按下時(shí)被調(diào)用,首先通過(guò)HAL_GPIO_EXTI_IRQHandler()清除中斷標(biāo)志位,然后再次調(diào)用__HAL_GPIO_EXTI_CLEAR_IT()以避免因按鍵抖動(dòng)而導(dǎo)致的誤觸發(fā)。(2)中斷回調(diào)處理:HAL_GPIO_EXTI_Callback()函數(shù)用于處理中斷事件。在此函數(shù)中,首先進(jìn)行消抖處理(延時(shí)20毫秒),然后根據(jù)觸發(fā)的GPIO引腳號(hào)判斷是哪個(gè)按鍵被按下。如果是KEY0或WKUP按鍵被按下,則調(diào)用LED0_TOGGLE()函數(shù)翻轉(zhuǎn)LED0的狀態(tài)。4.5STM32F103的外部中斷應(yīng)用實(shí)例(3)外部中斷初始化:exti_init()函數(shù)負(fù)責(zé)配置外部中斷的相關(guān)設(shè)置。它使能了KEY0和WKUP的GPIO時(shí)鐘,配置了按鍵的觸發(fā)模式(KEY0為下降沿,WKUP為上升沿),并設(shè)置了中斷優(yōu)先級(jí)和使能中斷請(qǐng)求。這些配置確保了外部中斷能夠正常工作并響應(yīng)按鍵事件。4.5STM32F103的外部中斷應(yīng)用實(shí)例3.main.c文件/*********************************************************************@filemain.c*@brief外部中斷實(shí)例*********************************************************************/#include"./SYSTEM/sys/sys.h"#include"./SYSTEM/usart/usart.h"#include"./SYSTEM/delay/delay.h"#include"./BSP/LED/led.h"#include"./BSP/KEY/key.h"#include"./BSP/EXTI/exti

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論