宿遷建站網(wǎng)網(wǎng)頁優(yōu)化
1.中斷概覽
在開展紅外傳感器遮擋計次的實驗之前,有必要系統(tǒng)性的了解“中斷”的基本知識.
中斷是指:在主程序運行過程中,出現(xiàn)了特定的中斷觸發(fā)條件(中斷源),使得CPU暫停當前正在運行的程序,轉(zhuǎn)而去處理中斷程序,處理完成后又返回原來被暫停的位置繼續(xù)運行。初看這里會感覺有些奇怪,我正在干一件事情,你是憑什么讓我停下來去干另一件事,然后干完之后再返回來去完成我本來在干的事情呢?這里就涉及到一個概念,叫做“優(yōu)先級”。
優(yōu)先級:當有多個中斷源同時申請中斷的時候,CPU會根據(jù)中斷源的輕重緩急進行裁決,優(yōu)先響應更加緊急的中斷源。假設(shè)場景在幼兒園,老師是CPU,本來正在上課,有個小朋友喊“老師我尿褲襠了”,這件事的優(yōu)先級高于上課,于是老師中斷了上課優(yōu)先去處理尿褲襠的小朋友。但如果遇到了優(yōu)先級更高的事情怎么辦?例如,這個小朋友尿褲襠了,但是另一個小朋友拉褲襠了,而且拉的是稀的,已經(jīng)流到地上了。
中斷嵌套:前面這個惡心的例子中,小朋友尿褲子是一個中斷事件,讓老師停止了上課,但拉褲襠是一個中斷優(yōu)先級更高的事件,老師不得不先處理拉褲襠的小朋友。這種在執(zhí)行中斷過程中,又來了一個優(yōu)先級更高的中斷的過程,叫做中斷嵌套。
2.STM32的中斷?
STM32中包含了68個可屏蔽中斷通道,?包含EXTI、TIM、ADC、USART、SPI、I2C、RTC等多個外設(shè)。這些中斷都通過NVIC統(tǒng)一管理,先看看內(nèi)部邏輯結(jié)構(gòu),為什么要用到NVIC?
從上圖可以看出,STM32涉及中斷的外設(shè)都是先鏈接到NVIC,最后在NVIC中經(jīng)過優(yōu)先級排序,再決定傳哪個中斷信號給CPU。這是一種減少CPU運算量的設(shè)計方法,試想,如果一個學校里面,連進出門禁、學生請假等等一系列的所有事情都需要校長親自去管,那這個校長就不用做其他事情了。在這里CPU也是同樣的,讓他專注于運算,NVIC做他的秘書。?
使用NVIC統(tǒng)一管理中斷,每個中斷通道都擁有16個可編程的優(yōu)先等級,可對優(yōu)先級進行分組,進一步設(shè)置搶占優(yōu)先級和響應優(yōu)先級。
2.1搶占優(yōu)先級和響應優(yōu)先級
在上面的圖里可以看到,NVIC的優(yōu)先級一共有0-15個等級,這里需要注意的是很多教程和書里會有這么一句話“NVIC的中斷優(yōu)先級由優(yōu)先級寄存器的4位(0~15)決定”,試一試2進制的4位最小和最大可以表示什么十進制數(shù)字,0000--0,1111--15。這樣就可以理解了,總共有0-15共計16個優(yōu)先級排序,在stm32的底層是用4位2進制數(shù)來表達這些優(yōu)先級,暫且這么理解。
這4位二進制數(shù)可以進行切分,分為高n位的搶占優(yōu)先級和低4-n位的響應優(yōu)先級搶占優(yōu)先級高的可以中斷嵌套,響應優(yōu)先級高的可以優(yōu)先排隊,搶占優(yōu)先級和響應優(yōu)先級均相同的按中斷號排隊。
上面這個表其實很好理解,反正總共只有4位二進制數(shù)可以用來表達優(yōu)先級,還要在這4位里面分個組,一部分用來表達搶占優(yōu)先級(小朋友拉褲襠,這事很上頭是最優(yōu)先的),一部分用來表達響應優(yōu)先級(小朋友尿褲襠,忍一忍沒準自己干了,不是太上頭)。
假設(shè)我要用這4位二進制中的2位去表達搶占優(yōu)先級,那就是000-111,即0-7總共可以容納八個小朋友拉褲襠,用4位二進制中的其余2位去表達響應優(yōu)先級,那也是000-111,即0-7,總共可以容納八個小朋友尿褲襠??傊?#xff0c;老師一回就只能處理16個小朋友的“驚喜”至于是拉褲襠還是尿褲襠,你們自己選。?這樣的分組總共有5中,就是表格第一列的分組0~分組4.
2.2EXTI
全稱是Extern Interrupt外部中斷,這是專門用于監(jiān)測外部發(fā)起中斷的模塊。?EXTI可以監(jiān)測指定GPIO口的電平信號,當其指定的GPIO口產(chǎn)生電平變化時,EXTI將立即向NVIC發(fā)出中斷申請,經(jīng)過NVIC裁決后即可中斷CPU主程序,使CPU執(zhí)行EXTI對應的中斷程序。
支持的觸發(fā)方式有:上升沿/下降沿/雙邊沿/軟件觸發(fā)。
支持的GPIO口:所有GPIO口,但相同的Pin不能同時觸發(fā)中斷通道數(shù):16個GPIO_Pin,外加PVD輸出、RTC鬧鐘、USB喚醒、以太網(wǎng)喚醒
觸發(fā)響應方式:中斷響應/事件響應
上面碩了EXTI主要是監(jiān)測引腳輸入的外部中斷信號,但是STM32引腳那么多,到底選擇哪個去監(jiān)測是需要先配置的,這里就需要用到AFIO,整體的EXTI結(jié)構(gòu)如下圖:
AFIO的功能是引腳的復用和重定義,在中斷部分,AFIO的主要作用是中斷引腳的選擇,別的先不管。 EXTI的內(nèi)部邏輯框圖如下:
這個邏輯比較簡單,用與門和或門來選擇信號,配合中間的寄存器來選擇中斷信號的發(fā)送。具體內(nèi)容可以先不深究,知道這東西在哪兒,要用回來翻看就是了。?