A、開始;
B、PIEIFRx.y = 1 ?是,轉到C,否則等待;
C、PIEIERx.y = 1 ?是,轉到D,否則等待;
D、PIEACKx = 0 ?是,轉到E,否則等待;
E、中斷請求發送到CPU;
F、IFRx位置1;
G、IERx = 1 ?是,轉到H,否則等待;
H、INTM = 0 ?是,轉到I,否則等待;
I、CPU回應,進入中斷服務子程式前,DSP硬體自動將IFRx清0,然后將CPU內一些關鍵暫存器如:ST0、ST1及IER等的內容壓到堆疊保存起來,隨后硬體自動將IERx清0,INTM置1,以避免中斷嵌套,在中斷服務子程式執行完回傳后,這些保存的內容會自動從堆疊中彈出,將原暫存器的內容恢復,因此ISR中不需要再進行INTM清0和IER置1操作,但必須注意的是:在ISR中執行完中斷回應任務之后,回傳前,必須將外設暫存器中的中斷標志軟體清0,這樣外設中斷才能再次產生;
J、從PIE處取中斷矢量,PIEIFRx.y被清除,CPU轉到ISR執行,這里從PIE中斷向量表中可以取到中斷服務子程式的地址,它是一個32位的矢量,中斷矢量被取出后,PIE模塊中的中斷標志PIEIFRx.y被自動清0,但該中斷x對應的PIE應答位PIEACKx在中斷服務子程式ISR中必須軟體清0(寫1清0),這樣才能接受下一個外圍中斷,
K、中斷回傳,

func :中斷服務函式入口;XINT3

CPU回應中斷,就是CPU要去執行相應的中斷服務程式,其回應程序是CPU將現在執行程式的指令地址壓入堆疊,跳轉到中斷服務程式入口地址,中斷服務程式的入口地址就是中斷向量,這個中斷向量用2個16位暫存器存放,入口地址是22位的,地址的低16位保存在該向量的低16位,地址的高16位則保存在它的高6位,更高的10位保留,


上圖為外設復用中斷向CPU申請中斷的流程,
步驟一:任何一個PIE中斷組的外設或外部中斷產生中斷,如果外設模塊內的中斷被使能,中斷請求將被送到PIE模塊,
步驟二:PIE模塊將識別出別的PIE中斷組x內的y中斷(INTx.y)申請,然后相應的PIE中斷標志位被鎖存:PIEIFRx.y=1,
步驟三:PIE的中斷如要送到CPU需滿足下面兩個條件:
1.相應的使能位必須被設定(PIEIERx.y=1),
2.相應的PIEACKx位必須被清除,
步驟四:如果滿足步驟三中的兩個條件,中斷請求將被送到CPU并且相應的回應暫存器位被置1(PIEACKx=1),PIEACKx位將保持不變,除非為了使本組中的其他中斷向CPU發出申請而清除該位,
步驟五:CPU中斷標志位被置位(CPUIFRx=1),表明產生一個CPU級的掛起中斷,
步驟六:如果CPU中斷被使能(CPUIERx=1,或DBGIERx=1),并且全域中斷使能(INTM=0),CPU將處理中斷INTx,
步驟七:CPU識別到中斷并且自動保存相關的中斷資訊,清除使能暫存器(IER)位,設定INTM,清除EALLOW,CPU完成這些任務準備執行中斷服務程式,
步驟八:CPU從PIE中獲取回應的中斷向量,
步驟九:對于復用中斷,PIE模塊用PIEIERx和PIEIFRx暫存器中的值確定回應中斷的向量地址,有以下兩種情況:
1.在步驟四中若有更高優先級的中斷產生,并使能了PIEIERx暫存器,且PIEIFRx的相應位處于掛起狀態,則首先回應優先級更高的中斷,
2.如果在本組內沒有掛起的中斷被使能,PIE將回應組內優先級最高的中斷,調轉地址使用INTx.1,這種操作相當于處理器的TRAP或INT指令,
CPU進入中斷服務程式后,將清除PIEIFRx.y位,需要說明的是,PIEIERx暫存器用來確定中斷向量,在清除PIEIERx暫存器時必須注意,
附上百度文庫一篇文章鏈接,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/224488.html
標籤:其他
下一篇:HO引擎近況20200510
