電子業(yè)網(wǎng)站建設(shè)seo競價
目錄
一、中斷的基本概念
二、NVIC
1.NVIC的概念
2、NVIC的組成
3、NVIC的應(yīng)用
4.NVIC的結(jié)構(gòu)
三、外部中斷EXTI
1.外部中斷的概念
2.EXTI基本結(jié)構(gòu)
四、EXTI外部中斷的配置流程
1.開啟APB2中的GPIO口/AFIO時鐘
2.GPIO配置成輸入模式
3.AFIO選擇中斷引腳
4.EXTI初始化
5.NVIC配置
6.中斷服務(wù)函數(shù)
一、中斷的基本概念
? ? ? ? 在STM32中,中斷系統(tǒng)是一種非常強(qiáng)大的功能,他允許CPU在執(zhí)行代碼的時候,暫停當(dāng)前任務(wù),然后轉(zhuǎn)而執(zhí)行特定的中斷服務(wù)函數(shù)(ISR),處理完成后,再返回主函數(shù)中繼續(xù)執(zhí)行原來的代碼。這種機(jī)制使得STM32能夠高效的相應(yīng)外部事件和內(nèi)部狀態(tài)變化,無需不斷的輪詢檢測,從而大大提高了CPU的利用率。
? ? ? ? 中斷是一種異步事件的處理機(jī)制,他打破了當(dāng)前程序的執(zhí)行流程。當(dāng)中斷發(fā)生時,當(dāng)前任務(wù)會被中斷,保存上下文(如寄存器的值,堆棧的指針等),然后跳轉(zhuǎn)到中斷向量表中找到對應(yīng)的中斷服務(wù)函數(shù)(ISR),去處理中斷事件,處理完畢后,CPU會恢復(fù)原來的上下文,繼續(xù)執(zhí)行以前的任務(wù)。
? ? ? ? STM32中內(nèi)置了靈活且功能強(qiáng)大的中斷寄存器(NVIC,Nested Vectored Interrupt Controller),他負(fù)責(zé)管理和分配中斷(IQR)請求的優(yōu)先級,處理程序的執(zhí)行順序,以及中斷處理過程的調(diào)度。每一個中斷源都有一個特定的中斷號(IQRn),并通過中斷向量表和相對應(yīng)的ISR關(guān)聯(lián)起來。
? ? ? ? STM32中包含了68個可屏蔽中斷通道,包含EXTI、TIM、ADC、USART、SPI、I2C、RTC等多個外設(shè) 使用NVIC統(tǒng)一管理中斷,每個中斷通道都擁有16個可編程的優(yōu)先等級,可對優(yōu)先級進(jìn)行分組,進(jìn)一步設(shè)置搶占優(yōu)先級和響應(yīng)優(yōu)先級
下圖是中斷向量表
????????中斷向量表是計算機(jī)系統(tǒng)中一個重要的組成部分,它用于存放中斷向量,即中斷類型號與對應(yīng)的中斷服務(wù)程序入口地址之間的映射關(guān)系。由于硬件原因CPU只能從某些特定的地址處訪問中斷函數(shù),即只能從中斷向量表中的地址去訪問。我們寫的中斷服務(wù)函數(shù),其名稱和入口地址通常會在鏈接時被放置在中斷向量表的相應(yīng)位置。這樣,當(dāng)中斷發(fā)生時,CPU就能根據(jù)中斷向量表找到并跳轉(zhuǎn)到我們編寫的中斷服務(wù)函數(shù)執(zhí)行。
二、NVIC
1.NVIC的概念
????????NVIC(Nested Vectored Interrupt Controller)是STM32微控制器中的中斷控制器,它負(fù)責(zé)管理和處理微控制器的中斷。(即相當(dāng)于CPU的中斷助手,幫助CPU來管理中斷)NVIC提供了靈活、高效、可擴(kuò)展的中斷處理機(jī)制,支持多級優(yōu)先級、多向中斷、嵌套向量中斷等特性。其主要功能包括:
- 中斷向量表:存儲所有中斷的服務(wù)程序地址,當(dāng)中斷發(fā)生時,CPU會根據(jù)中斷向量表跳轉(zhuǎn)到對應(yīng)的中斷服務(wù)程序執(zhí)行。
- 中斷優(yōu)先級管理:允許為不同中斷分配不同的優(yōu)先級,以控制中斷的響應(yīng)順序。NVIC的中斷優(yōu)先級由優(yōu)先級寄存器的4位(0~15)決定,這4位可以進(jìn)行切分,分為高n位的搶占優(yōu)先級和低4-n位的響應(yīng)優(yōu)先級。搶占優(yōu)先級高的中斷可以打斷低優(yōu)先級的中斷,實現(xiàn)中斷嵌套。響應(yīng)優(yōu)先級高的中斷在相同搶占優(yōu)先級下可以優(yōu)先排隊。
- 中斷使能和禁用:可以啟用或禁用特定的中斷,以便根據(jù)系統(tǒng)需求靈活控制中斷的響應(yīng)。
- 中斷觸發(fā)方式:支持多種中斷觸發(fā)方式,如上升沿、下降沿等,以滿足不同中斷源的需求。
2、NVIC的組成
NVIC由以下幾個部分組成:
- 中斷優(yōu)先級和控制器:負(fù)責(zé)中斷的掛起、解掛和優(yōu)先級管理。
- 向量表:存儲每個中斷源對應(yīng)的中斷處理程序的入口地址。
- 系統(tǒng)控制寄存器:提供了對NVIC中斷控制器的配置和控制。
- 特殊功能寄存器:NVIC中斷控制器對外暴露的寄存器,用于實現(xiàn)對中斷處理的控制,包括中斷使能、中斷標(biāo)志、中斷狀態(tài)等。
3、NVIC的應(yīng)用
NVIC在STM32中的應(yīng)用非常廣泛,主要包括以下幾個方面:
- 中斷優(yōu)先級設(shè)置:用戶可以根據(jù)不同的需求對中斷優(yōu)先級進(jìn)行設(shè)置,以實現(xiàn)對中斷的響應(yīng)和處理。這有助于確保系統(tǒng)在有多個中斷發(fā)生時能夠高效地處理優(yōu)先級較高的中斷事件。
- 中斷嵌套處理:NVIC支持中斷嵌套處理,即高優(yōu)先級的中斷可以打斷低優(yōu)先級的中斷。這有助于系統(tǒng)在處理緊急中斷事件時能夠迅速響應(yīng)并處理。
- 低功耗模式下的中斷管理:當(dāng)CPU處于低功耗模式時,NVIC提供了掛起和解掛中斷的機(jī)制,可以根據(jù)不同需求設(shè)置相應(yīng)的中斷使能和關(guān)閉。這有助于降低系統(tǒng)的功耗并延長電池壽命。
- 中斷標(biāo)志復(fù)位:NVIC提供了中斷標(biāo)志復(fù)位功能,可以清除某個中斷事件的標(biāo)志位。這在中斷處理過后需要清除標(biāo)志位的情況下尤為重要,以確保系統(tǒng)能夠正確識別和處理后續(xù)的中斷事件。
4.NVIC的結(jié)構(gòu)
????????每一個中斷都要被NVIC管理起來,所以一旦就中斷產(chǎn)生,都要經(jīng)過NVIC來確認(rèn)優(yōu)先級,才能被NVIC遞交給CPU。
三、外部中斷EXTI
1.外部中斷的概念
????????對于互聯(lián)型產(chǎn)品,外部中斷/事件控制器由20個產(chǎn)生事件/中斷請求的邊沿檢測器組成,對于其它產(chǎn)品,則有19個能產(chǎn)生事件/中斷請求的邊沿檢測器。每個輸入線可以獨(dú)立地配置輸入類型(脈沖
或掛起)和對應(yīng)的觸發(fā)事件(上升沿或下降沿或者雙邊沿都觸發(fā))。每個輸入線都可以獨(dú)立地被屏
蔽。掛起寄存器保持著狀態(tài)線的中斷請求。
????????EXTI可以監(jiān)測指定GPIO口的電平信號,當(dāng)其指定的GPIO口產(chǎn)生電平變化時,EXTI將立即向NVIC發(fā)出中斷申請,經(jīng)過NVIC裁決后即可中斷CPU主程序,使CPU執(zhí)行EXTI對應(yīng)的中斷程序 支持的觸發(fā)方式:上升沿/下降沿/雙邊沿/軟件觸發(fā) 支持的GPIO口:所有GPIO口,但相同的Pin不能同時觸發(fā)中斷 通道數(shù):16個GPIO_Pin,外加PVD輸出、RTC鬧鐘、USB喚醒、以太網(wǎng)喚醒 觸發(fā)響應(yīng)方式:中斷響應(yīng)/事件響應(yīng)
2.EXTI基本結(jié)構(gòu)
? ? ? ? 從下圖中可以看到,在初始化中,首先會通過APIO進(jìn)行引腳選擇,然后由AFIO將選擇的引腳傳遞給EXTI進(jìn)行邊沿檢測和控制。這時EXTI就開始檢測被選擇的引腳了,當(dāng)中斷來臨的時候,EXTI就看看是哪一路中斷發(fā)生了,然后通過對應(yīng)的EXTI信道傳遞給NVIC。NVIC再來對中斷進(jìn)行管理:如果同時有多個中斷來臨,則判斷優(yōu)先級遞交給CPU;如果來了優(yōu)先級更高的中斷,則進(jìn)行中斷嵌套等等。
下面的圖片是AFIO的示意圖。
????????AFIO就是一個選擇器,當(dāng)我們軟件選擇了某個引腳作為EXTI的時候,則AFIO會把這個引腳對應(yīng)的線路連接到EXTIX上,從而實現(xiàn)后面的過程。但是從下面的圖中可以看到,當(dāng)Pin腳號相同的時候,只能有一個Pin腳被選中(即不能有同樣的Pin腳作為EXTI)
四、EXTI外部中斷的配置流程
配置STM32的中斷系統(tǒng)通常需要經(jīng)過以下幾個步驟:
-
啟用外設(shè)時鐘:要啟用與中斷相關(guān)的外設(shè)(如GPIO、定時器等),首先需要為這些外設(shè)啟用時鐘。
-
配置外設(shè)為中斷模式:根據(jù)中斷源的類型,配置相應(yīng)的外設(shè)為中斷模式。例如,對于外部中斷,需要配置對應(yīng)的GPIO引腳為中斷輸入模式,并設(shè)置觸發(fā)方式(如上升沿觸發(fā)、下降沿觸發(fā)或雙邊沿觸發(fā))。
-
配置NVIC:通過NVIC設(shè)置中斷的優(yōu)先級,并啟用對應(yīng)的中斷。STM32的NVIC支持中斷優(yōu)先級的配置,可以通過相關(guān)函數(shù)設(shè)置中斷的搶占優(yōu)先級和子優(yōu)先級。優(yōu)先級較高的中斷可以中斷正在執(zhí)行的低優(yōu)先級中斷處理程序。
-
編寫ISR:為每個中斷源編寫相應(yīng)的ISR(中斷服務(wù)程序)。ISR是實際處理中斷事件的函數(shù),需要按照固定的函數(shù)原型編寫。在ISR中,應(yīng)首先檢查中斷發(fā)生標(biāo)志,然后執(zhí)行相應(yīng)的中斷處理邏輯,最后清除中斷標(biāo)志以準(zhǔn)備下一次中斷。
-
使能中斷:確保在主函數(shù)中啟用了外部中斷并進(jìn)入主循環(huán)。在主循環(huán)中,可以執(zhí)行其他任務(wù),等待中斷的發(fā)生。
1.開啟APB2中的GPIO口/AFIO時鐘
????????按道理來說是需要開啟NVIC和EXTI的時鐘的,但是這兩個時鐘是由內(nèi)部提供,無需我們手動開啟,默認(rèn)一直都是打開的狀態(tài),而且標(biāo)準(zhǔn)庫中也沒有相關(guān)的庫函數(shù)
2.GPIO配置成輸入模式
? ? ? ? 因為要檢測外部中斷,GPIO配置成輸入模式是必然的
3.AFIO選擇中斷引腳
? ? ? ? 在這個函數(shù)中選擇要對哪一個GPIO的哪一個Pin腳選中
4.EXTI初始化
初始化的結(jié)構(gòu)體
結(jié)構(gòu)體中的內(nèi)容填充
5.NVIC配置
NVIC中斷分組
注意:在STM32的系統(tǒng)代碼中,NVIC中斷分組通常只設(shè)置一次,并且一旦設(shè)置后就不再更改。這是因為隨意改變分組會導(dǎo)致中斷管理混亂,程序可能出現(xiàn)意想不到的執(zhí)行結(jié)果。因此,在系統(tǒng)初始化時,會根據(jù)需要選擇一個合適的分組配置,并在整個系統(tǒng)運(yùn)行過程中保持不變。
中斷優(yōu)先級的設(shè)置
????????
用來初始化的結(jié)構(gòu)體
NVIC_IRQChannel(中斷請求信道)的定義
如此一來,EXTI外部中斷的所有初始化配置就已經(jīng)完成了,我們還需要一個中斷服務(wù)函數(shù)
6.中斷服務(wù)函數(shù)
? ? ? ? 中斷服務(wù)函數(shù)與其他的函數(shù)不同,他被定義在啟動文件Start_up_stm32f10x_md.s中,我們找的時候一定不要找到EXTI文件中了,否則是怎么樣都找不到的。
? ? ? ? 在51單片機(jī)中,我們使用interrupt X的形式來定義中斷服務(wù)函數(shù)的,在STM32中,中斷服務(wù)函數(shù)的名字被限制死了,必須是中斷向量表其中的名字。
中斷向量表
????????在中斷處理函數(shù)中,值得注意的一點(diǎn)是,為了節(jié)約資源,EXTI的10-15和5-9號中斷函數(shù)都用的是一個相同的函數(shù)名,這使得我們在中斷服務(wù)函數(shù)中必須要檢測是哪個信道產(chǎn)生的中斷,再來決定下一步的執(zhí)行邏輯。此外,還需要我們手動清除中斷標(biāo)志位。
檢測是哪一個中斷信道產(chǎn)生的中斷(檢測中斷掛起標(biāo)志位)
清除中斷掛起標(biāo)志位
完整的中斷服務(wù)函數(shù)就如下面這樣