TMS320F28002x——中斷詳解
中斷概念
中斷是指MCU處理程序運行中出現的“緊急事件”的整個過程,程序運行過程中,系統外部、系統內部或者現行程序本身若出現緊急事件,MCU立即終止現行程序的運行,自動轉入相應的處理程序——中斷服務程序,待處理完成后,再返回原來的程序運行,整個過程為程序中斷。
中斷可分為可屏蔽中斷和不可屏蔽中斷:可由程序控制其屏蔽的中斷稱為可屏蔽中斷,屏蔽時,MCU將不接受中斷(不進入中斷服務程序);不能由程序控制其屏蔽的,MCU一定要立即處理的中斷為不可屏蔽中斷。
外設中斷
中斷架構
C28x內核CPU擁有14個外設中斷線。其中兩個(INT13和INT14)分別直接連接到CPU timer1 和timer2。剩余12個外設中斷線通過ePIE模塊(enhanced Peripheral Interrupt Expansion module)與CPU連接。每一根連接到CPU的外設中斷線最多能接16個外設中斷。
中斷路徑分3個階段——外設、ePIE以及CPU。每個階段都有其中斷使能和標志寄存器。如下圖所示:

外設階段
一些外設允許多個不同的事件觸發相同的中斷信號。如:通信外設可能使用相同的中斷來指示數據已經被接收或存在傳輸錯誤。中斷生成的原因可以通過讀取外設的狀態寄存器進行確定,通常在生成另一個中斷之前,需要手動清除狀態寄存器。
PIE階段
PIE為每個外設中斷信號提供單獨的標志和使能寄存器位,會根據相關的CPU中斷進行分組。每個PIE組有一個16位使能寄存器(PIEIERx)、一個16bit標志寄存器(PIEFIRx)和一個1bit確認寄存器(PIACK)。
當CPU接收到中斷時,CPU從PIE獲取ISR的地址。PIE返回中斷向量表中標志位已經置位并且編號最低的通道,這樣當多個中斷標志置位時,能夠保證更高優先級的中斷能被相應。
CPU階段
與PIE一樣,CPU為每個中斷提供標志和使能寄存器位,使能寄存器(IER)和標志寄存器(IFR)。這兩個寄存器都是內部CPU寄存器。在ST1寄存器中的INTM位,是一個全局的中斷掩碼,可以使用CPU的SETC和CLRC指令來進行置位和清除。在C代碼中,一般使用DINT和EINT來實現。
中斷輸入順序
下圖展示了外設中斷如何傳輸到CPU的過程:

當外設生成一個中斷信號時(假設是PIE group x,channel y),它會觸發以下事件序列:
①PIEIFRx.y位置1;
②如果PIEIERx.y位為1,中斷傳遞到下一步
③如果PIEACK.x位為0,中斷傳遞到下一步并且PIEACK.x置1
④IFR.x位置1
⑤如果IER.x位為1,中斷傳遞到下一步
⑥如果INTM位0,CPU接收中斷。
⑦在Data-read Data bus上的指令或者后續流程的指令都會被完整執行
⑧CPU在棧中保存中斷跳轉現場
⑨IFR.x和IER.x被清零,INTM被置位,EALLOW被清零
⑩CPU從PIE獲取ISR中斷向量,PIEIFRx.y被清零
?CPU執行ISR分支
最小的中斷延遲時間是14個SYSCLK周期,等待ISR的置位和棧內存會增加延遲的時間。
初始化和使用中斷
芯片剛上電時,默認不會使能任何的中斷。PIEIER寄存器和IER寄存器都是默認值,INTM置位1。應用代碼負責配置和使能所有外設的中斷。
使能中斷
使能外設中斷,需要有以下幾個步驟:
①禁能全局中斷(DINT或SETC INTM)
②設置PIECTRL寄存器的ENPIE位,使能PIE
③將中斷的ISR向量寫入PIE向量表中
④設置合適的PIIERx位
⑤設置CPU的IER位
⑥使能外設對應的中斷
⑦使能全局中斷(EINT或CLRC INTM)
中斷處理
中斷處理函數與普通功能函數一樣,但必須要有以下幾步:
①有必要的話保存和恢復某些CPU寄存器的狀態
②清除中斷group中的PIEACK位
③使用IRET指令返回
步驟①與③如果函數使用了__interrupt關鍵字,會被編譯器自動添加處理。PIEADCK位需要在代碼中手動清除,一般在中斷處理函數完成后執行。
PIE channel映射
下表為PIE group和channel在每個中斷的映射表:

異常與不可屏蔽中斷
初始化和使用NMI
傳入的NMI會在NMIFLG寄存器中設置一個標志位,并啟動NMI看門狗計數器。計數器的時鐘由SYSCLK提供,如果計數器計數值到達NMIWDPRD寄存器的值后,計數器會觸發一個NMI看門狗復位信號(NMIWDRS)。為了避免這個信號產生,NMI處理函數必須使用NMIFLGCLR寄存器清除NMIFLG標志位。
NMI源
Missing Clock Detection
時鐘丟失檢測管理OSCCLK是否異常。如果OSCCLK的時鐘源停止,PLL會被旁路,OSCCLK被連接到INTOSC1,并且NMI傳遞到CPU。
RAM ECC錯誤
RAM讀取時單bit校驗錯誤和雙bit ECC數據錯誤或者單bit ECC地址錯誤都會觸發NMI。
FLASH ECC錯誤
FLASH讀取時雙bit ECC錯誤或單bit ECC地址錯誤都會觸發NMI。
CPU HWBIST錯誤
芯片自帶的模塊檢測到CPU存在故障,觸發NMI。
Software-Forced 錯誤
在NMIFLGFRC寄存器中置位SWERR可以通過軟件強制觸發NMI。
浙公網安備 33010602011771號