HELLO五 一 2812中斷系統概述

2021-08-25 21:52:58 字數 3553 閱讀 1665

---by eys417

什麼是中斷?

中斷(interrupt)是硬體和軟體驅動事件,它使得cpu暫停當前的主程式,並轉而去執行乙個中斷服務程式。

2812的中斷系統

2812的cpu能夠支援乙個不可遮蔽中斷nmi和16個可遮蔽的中斷int1-int14、rtosint和dlogint,2812的cpu為了能夠及時有效的處理好各個外設的中斷請求,設計了乙個專門處理外設中斷的擴充套件模組(the peripheral interrupt expansion block),叫做外設中斷控制器pie,它能夠對各種中斷請求源(例如來自於外設或者其他外部引腳的請求)做出判斷以及相應的決策。pie 可以支援96個不同的中斷,這些中斷分成了12個組,每個組有8個中斷,而且每個組都被反饋到cpu核心的12 條中斷線中的某一條上(int1-int12)。pie 目前只使用了96 個終端中的45 個,其他的等待將來的功能擴充套件。

2812的pie內部的中斷分布圖

pie內部的中斷8列12行,總共有96個中斷,黃色部分表示已經使用的中斷,例如:檢視事件管理器eva中定時器t1的週期中斷t1pint-------t1pint在行號為int2,列號為intx.4的位置,也就是說t1ipnt對應於int2,是int2中的第四個中斷。

2812的3級中斷機制

2812的中斷是3級中斷機制,分別是外設級,pie級以及cpu級,對於某乙個具體的外設中斷請求,任意一級的不許可,cpu最終都不會執行該外設中斷。下面我們將以2812的外設eva中定時器t1的週期中斷t1pint為例。

(1).外設級

假如在程式的執行過程中,某乙個外設產生了乙個中斷事件,那麼在這個外設的某個暫存器中與該中斷事件相關的中斷標誌位(if=interrupt flag)被置為1。此時,如果該中斷相應的中斷使能(ie=interrupt flag)已經被置位為1,外設就會向pie控制器發出乙個中斷請求。相反的,如果雖然中斷事件產生了,相應的中斷標誌位也被置1了,但是該中斷沒有被使能(相應的使能位為0),那麼外設就不會向pie發出中斷請求,但是值得一提的是,相應的中斷標誌位會一直保持置位狀態,直到用程式清楚它為止。當然,在中斷標誌位保持在1的時候,一旦該中斷被使能了,那麼外設立馬會向pie發出中斷申請。 我們用具體的t1pint來進行進一步的說明。當定時器t1的計數器暫存器t1cnt計數到和t1週期暫存器t1pint的值匹配時(相等時),就產生了乙個t1pint事件,即t1的週期中斷。這時候,事件管理器eva的中斷標誌暫存器a(evaifra)中的第7位t1pint flag被置為1,這時候如果eva的中斷遮蔽暫存器a(evaimra)中的第7位t1pint的使能位是1,則eva就會向pie發出中斷請求,當然,如果該位的值是0,也就是該中斷未被使能(被遮蔽),則eva不會向pie發出中斷請求,而且evaifra中t1pint flag位將一直保持為1,除非通過程式將其清除。需要注意的是,不管在什麼情況下,外設暫存器中的中斷標誌位都必須手工清除。

中斷外設級總結

外設中斷的遮蔽,需要將與該中斷相關的外設寄存中的中斷使能位置0;

外設中斷標誌位的清除,需要將與該中斷相關的外設寄存中的中斷標誌位置1;

清除t1pint標誌位: evaregs.evaifra.bit.t1pint = 1;

中斷遮蔽位使能 : evaregs.evaimra.bit.t1pint = 1;

(2).pie級

當外設產生中斷事件,相關中斷標誌位置位,中斷使能位使能之後,外設就會把中斷請求提交給我們的pie模組。pie模組將96個外設和外部引腳的中斷進行了分組,每8個中斷為1組,一共是12組,分別是pie1-pie12。每個組的中斷被多路匯集進入1個cpu中斷,例如pdpinda,pdpindb,xint1,xint2,adcint,tint0,wakeint這7個中斷都在pie1組內,這些中斷都匯集到cpu中斷的int1。 和外設級類似的,pie控制器中的每個組都會有乙個中斷標誌暫存器pieifrx和和中斷使能暫存器pieierx,當然x=1.....12。每個暫存器的低8位對應於8個外設中斷,高8位保留。例如t1pint對應於pieifr2的第4位和pieier2的第4位。pie除了每組具有剛才的pieierx,pieifrx暫存器之外,還有乙個pieack暫存器,它的低12位分別對應著12個組,即int1-int12,高位保留。假如t1的週期中斷被響應了,則pieack暫存器的第2位(對應於int2)就會被置位,並且一直保持直到手動清除這個標誌位。當cpu在響應t1pnt的時候,pieack的第2位一直是1,這時候如果pie2組內發生其他的外設中斷,則暫時不會被pie響應送給cpu,必須等到pieack的第2位被復位之後,如果該中斷請求還存在,那麼立馬由pie控制塊將中斷請求送至cpu。所以,每個外設中斷被響應之後,一定要對pieack的相關位進行手動服務,否則同組內的其他中斷都不會被響應。

中斷pie級總結:

pie中斷的使能。就得將其相應組的使能暫存器pieierx的相應位進行置位;

pie中斷的遮蔽。這是和使能相反的操作;

pie應答暫存器 pieack相關位的清除,以使得cpu能夠響應同組的其他中斷。

將pie級的中斷和外設級的中斷相比較之後發現,外設中斷的中斷標誌位是需要手工清除的,而pie級的中斷標誌位都是自動置位或者清除的。但是pie多了乙個pieack暫存器,同一時間只能放乙個中斷過去,只有等到這個中斷被響應,給pieack置位,才能讓同組的下乙個中斷過去,被cpu響應清除pie中與t1pint相關的應答位: piectrl.pieack.bit.ack2=1;

使能pie中斷int2.4(t1pint中斷): piectrlregs.pieier2.all=m_int4;//m_int4=0x0008

(3)cpu級

cpu也有標誌暫存器ifr和使能暫存器ier。當某乙個外設中斷請求通過pie傳送到cpu時,cpu級中與intx相關的中斷標誌位就會被置位。例如,t1的週期中斷t1pint的請求到達cpu這邊時,與其相關的int2的標誌位就會被置位。這時候,該標誌位就會被所存在ifr中,這時候,cpu不會馬上去執行相應的中斷,而是等待cpu使能ier暫存器的相關位,並且對cpu暫存器st1中的全域性中斷遮蔽位做適當的使能。如果ier中的相關位被置位了,並且intm的值為0,則中斷就會被cpu響應。在t1pint裡,當ier的第2位即int2被置位,intm為0,則cpu就會響應定時器t1的週期中斷。 cpu接到了終端的請求,就得暫停正在執行的程式,轉而去響應中斷程式,但是此時,它必須得做一些準備工作,以便於執行完中斷程式之後回過頭來還能找到原來的地方和原來的狀態。cpu會將相應的ier和ifr位進行清除,eallow也被清除,intm被置位,就是不能響應其他中斷了,cpu向其他中斷發出了通知,正在忙,沒空來處理你們的請求了,得等到處理完手上的中斷之後才能再來處理你們的請求。然後,cpu會儲存返回位址並自動儲存相關的資訊,例如將正在處理的資料放入堆疊等等,做好這些準備工作之後,cpu會從pie塊中取出對應的中斷向量isr,從而轉去執行中斷子程式。

中斷cpu級總結:

cpu級的操作都是自動的,不管是中斷標誌位(ifr),還是中斷的使能位(ier)。

HELLO六 2812的時鐘系統

by eys417 1.振盪器osc和鎖相環pll 2812基於pll的時鐘模組可以採用兩種模式,一種是pll未被禁止的情況下 旁路或使能 使用外部晶振給2812提供時鐘訊號,使用x1 clkin引腳和x2引腳 另外一種pll被禁止的情況下,旁路片內振盪器,由外部時鐘源提供時鐘訊號,即將外部振盪器的...

HELLO六 2812的時鐘系統

by eys417 1.振盪器osc和鎖相環pll 2812基於pll的時鐘模組可以採用兩種模式,一種是pll未被禁止的情況下 旁路或使能 使用外部晶振給2812提供時鐘訊號,使用x1 clkin引腳和x2引腳 另外一種pll被禁止的情況下,旁路片內振盪器,由外部時鐘源提供時鐘訊號,即將外部振盪器的...

6 中斷系統

外部中斷0實驗 include reg52.h 此檔案中定義了微控制器的一些特殊功能暫存器 typedef unsigned int u16 對資料型別進行宣告定義 typedef unsigned char u8 sbit k3 p3 2 定義按鍵k3 sbit led p2 0 定義p20口是l...