程序見上一次串口配置
中斷的概述 4.1.1 什么是中斷 程序在正常運(yùn)行過程中發(fā)生了內(nèi)部或外部事件時(shí),打斷了正在執(zhí)行的程序,轉(zhuǎn)到外部或內(nèi)部事件中去執(zhí)行中斷對(duì)應(yīng)的代。 4.1.2 中斷的意義 高效的去執(zhí)行程序,不會(huì)一直占用MCU的資源。 4.1.3 中斷入口 中斷服務(wù)函數(shù):芯片中固定了一段地址空間用來存儲(chǔ)程序代碼。這一段程序代碼是中斷執(zhí)行的程序代碼 中斷的入口:中斷服務(wù)函數(shù)名。 4.1.4 中斷的優(yōu)先級(jí) 中斷優(yōu)先級(jí):指的是給中斷編號(hào),用來區(qū)分那件事件先執(zhí)行,那件事情后執(zhí)行。編號(hào)越小優(yōu)先級(jí)越高 4.1.5 中斷的嵌套 中斷嵌套:在執(zhí)行中斷服務(wù)函數(shù)代碼時(shí),又發(fā)生中斷事件打斷了正在執(zhí)行的程序。 4.1.6 補(bǔ)充 main函數(shù)與中斷服務(wù)函數(shù)的關(guān)系? main函數(shù)、與中斷服務(wù)函數(shù)屬于同一級(jí)別,不存在的一個(gè)說法是main函數(shù)調(diào)用中斷服務(wù)函數(shù)。所以中斷服務(wù)函數(shù)不需要什么函數(shù)聲明啊,調(diào)用函數(shù)等,只需要重寫實(shí)現(xiàn)中斷服務(wù)函數(shù)就好。 中斷的執(zhí)行流程? 發(fā)生中斷事件,找到中斷入口,搶占MCU資源執(zhí)行中斷服務(wù)函數(shù)中的代碼(此時(shí)main函數(shù)失去MCU的使用權(quán)),如圖1所示。 
圖1 中斷執(zhí)行流程 斷點(diǎn):正常執(zhí)行的程序,發(fā)生中斷事件時(shí),被打斷的位置。MCU去執(zhí)行中斷服務(wù)函數(shù)中的代碼前,存儲(chǔ)的該斷點(diǎn)的現(xiàn)場信息,我們把這一過程稱為:壓棧(入棧)。在執(zhí)行完中斷服務(wù)函數(shù)后,回到斷點(diǎn),從棧中讀出之前存入的現(xiàn)場信息,繼續(xù)執(zhí)行,我們稱這一過程為彈棧(出棧)。 中斷嵌套的執(zhí)行流程? 
圖2嵌套中斷流程 中斷嵌套如圖2,(簡單理解:中斷中又發(fā)生了中斷)。 4.2 異常與中斷 4.2.1 異常的理解 異常:簡單理解,屬于內(nèi)核的中斷(系統(tǒng)內(nèi)部)稱為異常,如圖3所示。 中斷:不屬于內(nèi)核的中斷,稱為外部中斷,簡稱中斷,如圖4所示。 如無特殊說明,可以不分辨“中斷”與“異!边@兩個(gè)術(shù)語,可以互換使用。 

圖3 系統(tǒng)異常(中斷) 
圖4 外部中斷 由圖可知,編號(hào)0沒有進(jìn)行任何定義,編號(hào)為 1-15 的對(duì)應(yīng)系統(tǒng)異常,大于等于 16 的則全是外部中斷。 4.2.2 優(yōu)先級(jí) 懸起: 先理解一個(gè)概念:“懸起”。如果發(fā)生了一個(gè)中斷但是它不能馬上反應(yīng),稱為懸起。 優(yōu)先級(jí): 優(yōu)先級(jí)的概念:優(yōu)先級(jí)解決的問題是同時(shí)發(fā)生多個(gè)中斷請求時(shí),先響應(yīng)誰,把誰懸起的問題。被懸起的中斷,等待高優(yōu)先級(jí)響應(yīng)完,它們才能有機(jī)會(huì)正常執(zhí)行響應(yīng)中斷請求。 優(yōu)先級(jí)的特點(diǎn): 數(shù)值越小,優(yōu)先級(jí)越高。 高優(yōu)先可搶占低優(yōu)先級(jí)。 搶占優(yōu)先級(jí)與子優(yōu)先級(jí): 為了使搶占機(jī)能變得更可控,CM3 還把256級(jí)優(yōu)先級(jí)按位分成高低兩段,分別稱為搶占優(yōu)先級(jí)和子優(yōu)先級(jí)。 
圖5優(yōu)先級(jí)分組 由圖5可知,有8(0到7)個(gè)分組位置。 從分組位置0可知,搶占優(yōu)先級(jí)最多可以使用7位(高七位—>7、6、5、4、3、2、1)表示,27=128,能表示128個(gè)搶占優(yōu)先級(jí),即:最多支持128層中斷嵌套。進(jìn)而得出子優(yōu)先級(jí)至少有1位,21=2,能表示2個(gè)子優(yōu)先級(jí)。 從分組位置7可知道可以沒有搶占優(yōu)先級(jí),但必須有子優(yōu)先級(jí)。
NVIC 中有一個(gè)寄存器是“應(yīng)用程序中斷及復(fù)位控制寄存器”,如圖6,它里面有一個(gè)位段名為“優(yōu)先級(jí)組”。該位段的值對(duì)每一個(gè)優(yōu)先級(jí)可配置的異常都有影響——把其優(yōu)先級(jí)分為 2 個(gè)位段: MSB 所在的位段(左邊的)對(duì)應(yīng)搶占優(yōu)先級(jí),而 LSB 所在的位段(右邊的) 對(duì)應(yīng)子優(yōu)先級(jí)。 
圖6應(yīng)用程序中斷及復(fù)位控制寄存器AIRCR 舉個(gè)例子,如果只使用 3 個(gè)位來表達(dá)優(yōu)先級(jí)[7:5],并且優(yōu)先級(jí)組的值是5,查表可知,如圖7、8所示,位7與位6表示搶占優(yōu)先級(jí)。 
圖7優(yōu)先級(jí)分組值為5查表結(jié)果 
圖83位表示優(yōu)先級(jí),分組值為5實(shí)際分組 4.2.3搶占優(yōu)先級(jí)與子優(yōu)先級(jí) 《1》高搶占優(yōu)先級(jí)是可以打斷正在進(jìn)行的低搶占優(yōu)先級(jí)中斷的。 《2》搶占優(yōu)先級(jí)相同的中斷,高子優(yōu)先級(jí)不可以打斷低子優(yōu)先級(jí)的中斷。 《3》 搶占優(yōu)先級(jí)相同的中斷,當(dāng)兩個(gè)中斷同時(shí)發(fā)生的情況下,哪個(gè)子優(yōu)先級(jí)高,就先執(zhí)行。 《4》如果兩個(gè)中斷的搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)都是一樣的話,則看哪個(gè)中斷先發(fā)生就先執(zhí)行; 4.2.4 補(bǔ)充 從需求理解中斷: 中斷的發(fā)明是為了提高M(jìn)CU執(zhí)行程序的效率、讓程序變得更加靈活、高效。例如按鍵的掃描,需要MCU不斷的去輪詢,當(dāng)程序的框架復(fù)雜,實(shí)現(xiàn)很多功能,代碼量多時(shí),按鍵往往就沒那么靈敏了?赡苡袝r(shí)按下有效果,有時(shí)按下沒效果。這時(shí)候就需要使用到中斷了,最簡單的做法把按鍵掃描函數(shù),放在按鍵中斷服務(wù)函數(shù)中;當(dāng)按鍵按下,發(fā)生中斷,找到中斷入口(按鍵中斷服務(wù)函數(shù)名),執(zhí)行中斷服務(wù)函數(shù)中的按鍵掃描代碼,這使MCU執(zhí)行程序的效率大大的提高。具體流程如下圖9。 
圖9 按鍵外部中斷流程圖 中斷如果只設(shè)計(jì)一個(gè)出來,那就不需要優(yōu)先級(jí)的概念了,優(yōu)先級(jí)就是為了解決多個(gè)中斷發(fā)送,先響應(yīng)誰,把誰懸起的問題。而在執(zhí)行中斷的過程中,又發(fā)生了中斷,稱為中斷嵌套;要弄清楚誰可以打斷誰,規(guī)律是什么,就需要明白搶占優(yōu)先級(jí)與子優(yōu)先級(jí)的,優(yōu)先級(jí)分組的作用、意義。
4.3 NVIC 4.3.1 NVIC概述 NVIC:嵌套向量中斷控制器,用于管理外部所有中斷 《1》NVIC 共支持 1 至 240 個(gè)外部中斷輸入(通常外部中斷寫作 IRQs) 《2》所有的中斷控制/狀態(tài)寄存器均可按字/半字/字節(jié)的方式訪問 《3》所有 NVIC 的中斷控制/狀態(tài)寄存器都只能在特權(quán)級(jí)下訪問。不過有一個(gè)例外——軟件觸發(fā)中斷寄存器可以在用戶級(jí)下訪問以產(chǎn)生軟件中斷 4.3.2 中斷的使能與除能 CM3中可以有240對(duì)使能位/除能位(SETENA 位/CLRENA 位),每個(gè)中斷擁有一對(duì)。 欲使能一個(gè)中斷,我們需要寫 1 到對(duì)應(yīng) SETENA 的位中;欲除能一個(gè)中斷,你需要寫 1 到對(duì)應(yīng)的 CLRENA 位中。如果往它們中寫 0,則不會(huì)有任何效果。 這240個(gè)對(duì)子分布在8對(duì)32位寄存器中,SETENA0, SETENA1…SETENA7,最后一對(duì)沒有用完,如圖10所示。 
圖10 8對(duì)32位寄存器 4.4 軟件設(shè)計(jì) 4.4.1 USART中斷配置流程 1.使能模塊級(jí)中斷 2.使能NVIC中斷(使能前,可設(shè)置優(yōu)先級(jí)分組、搶占優(yōu)先級(jí)、響應(yīng)優(yōu)先級(jí)) 總體配置框圖如下圖11。 
圖11 USART中斷配置框圖 4.4.2 中斷初始化代碼解讀 打開模塊級(jí)中斷: 找到控制寄存器相應(yīng)中斷位,配置寄存器。 
圖12 USART中斷配置相應(yīng)位 USART1->CR1 |=1<<5;// 讀取數(shù)據(jù)寄存器不為空 USART1->CR1 |=1<<4;// 檢測到空閑線路
打開NVIC中斷: 找到密鑰 
設(shè)置分組 
圖13 打開NVIC中斷流程 SCB->AIRCR = 0x05FA0500;//優(yōu)先級(jí)分組5 找到串口1中斷向量號(hào),設(shè)置優(yōu)先級(jí) 
圖14串口1中斷向量號(hào) 分組為5,7-5=2,說明搶占優(yōu)先級(jí)可以有2(7、6)位配置。USART1的向量號(hào)位37,可寫入下面代碼。如圖 NVIC->IP[37] = 0xf0; //串口1 搶占優(yōu)先級(jí)3 響應(yīng)優(yōu)先級(jí)3 
圖14優(yōu)先級(jí)配置 
圖15串口1中斷使能寄存器 NVIC->ISER[1] = 1<<(37-32);//串口1使能 中斷號(hào)37
4.4.3 串口1中斷服務(wù)函數(shù) 


圖16串口1中斷寄存器配置與代碼 一、接收中斷分析: - 讀取數(shù)據(jù)寄存器,接收中斷標(biāo)志位自動(dòng)清零。
- 對(duì)接收中斷標(biāo)志位,寫入0,將該位進(jìn)行清零操作。
rc_w0的理解: 
圖17 rc_w0的理解: 所以,當(dāng)發(fā)生接收中斷,你在讀數(shù)據(jù)寄存器時(shí),接收中斷標(biāo)志位,已經(jīng)自動(dòng)清零了,無需手動(dòng)清零。 
圖18接收代碼的深入理解: 二、空閑中斷分析: 空閑中斷,第一次空閑,發(fā)生中斷,空閑標(biāo)志位置1,讀入 USART_SR 寄存器,然后讀入 USART_DR 寄存器,可對(duì)空閑標(biāo)志位清零。 注意:當(dāng)有新的空閑時(shí)(相對(duì)于前一次),才會(huì)發(fā)生第二次空閑中斷,所以空閑中斷與接收中斷密不可分、相互聯(lián)系。接收就不會(huì)空閑,空閑就說明沒有數(shù)據(jù)發(fā)送過來,所以接收中斷常常與空閑中斷配合使用。
4.4.4 小結(jié) 中斷時(shí)STM32的靈魂,是一個(gè)難點(diǎn)、好用、靈活的東西,用好它能使能的程序變化很靈活、高效,用不好也可是你代碼性能變壞,本章只是簡單的介紹了STM32的中斷。NVIC是個(gè)內(nèi)核的秘書,管理著全部的外部中斷,外部的模塊若想打開中斷,除了打開自己模塊的中斷開關(guān),還有打NVIC對(duì)應(yīng)的中斷開關(guān)。
以上的Word格式文檔51黑下載地址:
4.NVIC.docx
(2.04 MB, 下載次數(shù): 9)
2020-6-21 19:44 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|