資源描述:
《stm32中斷(NVIC與EXTI)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、一、本章大綱一、嵌套向量中斷控制器—NVICCM3內(nèi)核搭載了一個(gè)異常響應(yīng)系統(tǒng),通過(guò)NVIC(嵌套向量中斷控制器)來(lái)管理和配置。NVIC是一個(gè)總的控制器,相當(dāng)于51的IE,不論是來(lái)自CM3內(nèi)部的異常還是來(lái)自外設(shè)的中斷,都進(jìn)入該控制器進(jìn)行處理和邏輯控制。并且NVIC還通過(guò)優(yōu)先級(jí)系統(tǒng),來(lái)控制中斷的嵌套。1.中斷優(yōu)先級(jí)①優(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ù),從而高于所有其他異常。原則上,NV
2、IC支持3個(gè)固定的高優(yōu)先級(jí)和多達(dá)256級(jí)的可設(shè)置優(yōu)先級(jí),用一個(gè)字節(jié)的8個(gè)比特位來(lái)表示。STM32F107采用最高有效位對(duì)齊,在設(shè)計(jì)時(shí)裁掉表達(dá)優(yōu)先級(jí)的4個(gè)低端有效位,所以只支持16級(jí)優(yōu)先級(jí)。2.搶占優(yōu)先級(jí)與從優(yōu)先級(jí)NVIC中有一個(gè)寄存器是“應(yīng)用程序中斷及復(fù)位控制寄存器”,它里面有一個(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è)位來(lái)表達(dá)優(yōu)先級(jí)([7:4]),如果搶占優(yōu)先級(jí)組從比特5處分,則得到4級(jí)搶占優(yōu)先級(jí),且在每個(gè)搶占
3、優(yōu)先級(jí)的內(nèi)部有4個(gè)從優(yōu)先級(jí)(00011011)。3.中斷輸入與懸起當(dāng)中斷輸入腳被置為有效后,該中斷就被“懸起”。所謂“懸起”,也就是等待、就緒的意思。即使后來(lái)中斷源撤消了中斷請(qǐng)求,已經(jīng)被標(biāo)記成懸起的中斷也被記錄下來(lái)。當(dāng)某中斷的服務(wù)程序開始執(zhí)行時(shí),就稱此中斷進(jìn)入了“活躍”狀態(tài),并且其懸起位會(huì)被硬件自動(dòng)清除。在一個(gè)中斷活躍后,直到其服務(wù)例程執(zhí)行完畢,并且返回后,才能對(duì)該中斷的新請(qǐng)求予以響應(yīng)。當(dāng)NVIC響應(yīng)一個(gè)中斷時(shí),會(huì)自動(dòng)完成以下三項(xiàng)工作,以便安全、準(zhǔn)確地跳轉(zhuǎn)到相應(yīng)的中斷服務(wù)程序:入棧:把8個(gè)寄存器的值壓入棧。當(dāng)響應(yīng)中斷時(shí),如果當(dāng)前的代碼正在使用PSP,則壓入PSP
4、(進(jìn)程堆棧),否則就壓入MSP(主堆棧)。一旦進(jìn)入了服務(wù)例程,就一直使用主堆棧。在自動(dòng)入棧的過(guò)程中,將寄存器寫入堆棧的順序與時(shí)間順序無(wú)關(guān),CM3會(huì)保證正確的寄存器被保存到正確的位置。取向量:當(dāng)數(shù)據(jù)總線(系統(tǒng)總線)進(jìn)行入棧操作時(shí),指令總線(I-Code總線)正在從向量表中找出正確的中斷向量與對(duì)應(yīng)的服務(wù)程序入口地址。更新寄存器。注意:①如果在某個(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)
5、以若干的脈沖的方式呈現(xiàn),則被視為只有一次中斷請(qǐng)求⑤如果在服務(wù)例程執(zhí)行時(shí),中斷請(qǐng)求釋放了,但是在服務(wù)例程返回前又重新被置為有效,則NVIC會(huì)記住此動(dòng)作,重新懸起該中斷。1.中斷返回當(dāng)中斷完成,返回主程序時(shí),NVIC自動(dòng)完成以下兩步:①出棧:先前壓入棧中的寄存器在這里恢復(fù)。內(nèi)部的出棧順序與入棧時(shí)的相對(duì)應(yīng),堆棧指針的值也改回先前的值。②更新NVIC寄存器:伴隨著中斷的返回,它的活動(dòng)位也被硬件清除。對(duì)于外部中斷,倘若中斷輸入再次被置為有效,則懸起位也將再次置位,新一次的中斷響應(yīng)序列也會(huì)再次開始。1.CM3異常和中斷系統(tǒng)--SYSTICK定時(shí)器SysTick定時(shí)器被捆綁在
6、NVIC中,用于產(chǎn)生SysTick異常(異常號(hào)15)。它又叫滴答中斷,它的作用是規(guī)定不同任務(wù)執(zhí)行時(shí)間,防止一個(gè)任務(wù)一直霸占系統(tǒng)。此外,還有操作系統(tǒng)提供的各種定時(shí)功能,都與滴答中斷有關(guān)。在STM32F107中,系統(tǒng)嘀嗒校準(zhǔn)值固定為9000,當(dāng)系統(tǒng)嘀嗒時(shí)鐘設(shè)定為9MHz(HCLK/8的最大值)時(shí)產(chǎn)生1ms時(shí)間基準(zhǔn)。對(duì)于SysTick,庫(kù)函數(shù)文件misc.c中也有一個(gè)函數(shù)可以對(duì)其時(shí)鐘源進(jìn)行配置,該函數(shù)的原型為:SysTick_CLKSourceConfig()/*source(源頭);config(配置)voidSysTick_CLKSourceConfig(uint
7、32_tSysTick_CLKSource);SysTick_CLKSource描述SysTick_CLKSource_HCLK_Div8SysTick時(shí)鐘源為?AHB時(shí)鐘除以8SysTick_CLKSource_HCLKSysTick時(shí)鐘源為?AHB時(shí)鐘2.中斷向量當(dāng)發(fā)生了異?;蛑袛?,并且要響應(yīng)它時(shí),CM3需要定位其服務(wù)程序的入口地址。通過(guò)入口地址找到相應(yīng)的中斷服務(wù)程序。這些入口地址存儲(chǔ)在“(異常)向量表”中。缺省情況下,CM3認(rèn)為(異常)向量表位于零地址處,且各向量占用4字節(jié)。STM32F107的異常響應(yīng)系統(tǒng)是CM3的裁剪和細(xì)化。在STM32F107中,這種
8、映射關(guān)系具體體現(xiàn)在啟動(dòng)代