大家好,歡迎來到我們的 DSP28335 深度解析系列。在之前的實戰中,我們通過?while(1)?循環和延時函數實現了各種控制,這種方式被稱為輪詢。但輪詢就像一個焦急的門衛,需要不停地去檢查每個門口是否有人,既浪費精力又效率低下。今天,我們將學習一種更高效、更優雅的機制——中斷 (Interrupt),為我們的系統裝上“門鈴”,讓它從被動等待變為主動響應。
掌握中斷系統,是從入門到精通的必經之路,是釋放 DSP 真正潛能的關鍵。
一、中斷是什么?—— 從“輪詢”到“事件驅動”
[圖1: 中斷示意圖]
中斷,顧名思義,就是打斷當前正在執行的任務。在 CPU 執行程序時,如果發生了某個需要立即處理的緊急或隨機事件(例如按鍵按下、定時器到時、數據接收完成),這個事件就會像一個“請求”,向 CPU 申請關注。CPU 在允許的情況下,會暫時掛起當前正在執行的程序,轉而去執行一段專門為處理該事件而寫的代碼——即中斷服務程序 (ISR, Interrupt Service Routine)。當事件處理完畢后,CPU 會自動返回到之前被打斷的地方,繼續執行原來的程序。
這一過程,就如同你在專心看書(主程序),突然電話鈴響(中斷請求),你于是放下書,拿起聽筒接電話(執行ISR),講完電話后,你再拿起書從剛才讀到的地方繼續看下去。
二、F28335 中斷的宏觀架構
TI 的 C2000 系列 DSP,尤其是 F28335,擁有一個非常強大且靈活的中斷系統。
[圖2: F28335 中斷源與內核關系圖]
16 條核心中斷線:?F28335 的 C28x 內核有?16 個中斷入口。這包括 2 個不可屏蔽中斷(RESET?和?NMI?- Non-Maskable Interrupt,通常用于電源掉電等最高緊急事件),以及 14 個可屏蔽中斷(INT1 ~ INT14)。
眾多的中斷源:?而 DSP 的外設遠不止 14 個,ADC、ePWM、SPI、SCI、CAN、定時器等幾十個模塊都可能產生中斷請求。
PIE 的誕生:?如何用 14 條中斷線,管理幾十個中斷源?答案就是復用。PIE (Peripheral Interrupt Expansion) 模塊應運而生,它像一個巨大的中斷“集線器”或“管理器”,負責將眾多的外設中斷請求,分門別類地匯總到 CPU 的 12 條主中斷線(INT1 ~ INT12)上。
三、三級中斷機制:從申請到批準的層層關卡
F28335 的中斷響應過程像一個嚴格的“三級審批”流程。一個外設的中斷請求,必須依次通過外設級、PIE 級和?CPU 級三道“門禁”,才能最終得到 CPU 的響應。
[圖3 & 圖4: 外部中斷信號通路圖]
第一級:外設級中斷使能
關卡描述:?這是中斷請求的源頭。每個能夠產生中斷的外設模塊(如 ADC、ePWM),其內部都有自己的中斷使能位。
放行條件:?必須將對應外設的中斷使能位置 1,它才被“允許”發出中斷請求。如果這里是關閉的,那它連“喊一聲”的機會都沒有。
第二級:PIE 級中斷使能
關卡描述:?這是中斷請求的分組管理中心。PIE 模塊將 96 個中斷源分成了 12 個大組(PIE Group 1 ~ 12),每個大組包含 8 個中斷。
[圖6: PIE 96路中斷分組邏輯圖]
放行條件:?中斷請求到達 PIE 后,需要通過兩個“開關”:
PIEIFRx.y (中斷標志位):?當中斷請求到達,對應的標志位會自動置 1,表示“有人敲門了”。
PIEIERx.y (中斷使能位):?必須將這個使能位置 1,表示“允許這扇門打開”。這個?x?代表組號 (1-12),y?代表組內中斷號 (1-8)。
核心工作:?只有當 PIEIFR 和 PIEIER 中對應的位都為 1 時,該中斷請求才能通過 PIE 這一級,并被提交給 CPU 對應的主中斷線(例如,第3組的所有中斷請求,最終都會匯集到 CPU 的 INT3 中斷線上)。
[圖7: PIE 中斷向量表]
第三級:CPU 級中斷使能
關卡描述:?這是中斷請求的“總開關”和“最后一道防線”,直接與 CPU 內核相連。
[圖5: PIE 與 CPU 中斷邏輯細節圖]
放行條件:?PIE 提交的中斷請求到達 CPU 后,同樣需要通過兩個“開關”:
IFR (中斷標志寄存器):?當 INTx (x=1~14) 上有中斷請求時,IFR 對應的位會置 1。
IER (中斷使能寄存器):?這是 14 個主中斷線的使能開關。必須用?IER |= M_INTx?的方式,打開對應中斷線的“閥門”。
INTM (全局中斷使能位):?這是全局的總開關。只有當 INTM 為 0 時,CPU 才響應中斷。我們可以用匯編指令?EINT?(Enable INTerrupt) 來清零它,或用?DINT?(Disable INTerrupt) 來置位它。
總結:一個中斷要想最終被 CPU 響應,必須同時滿足:①外設中斷使能打開 ②PIE 組中斷使能打開 ③CPU 主中斷線使能打開 ④CPU 全局中斷使能打開。
四、中斷響應:找到正確的服務程序 (中斷向量表)
當中斷請求歷經千辛萬苦終于獲得批準后,CPU 需要知道應該去哪里執行對應的中斷服務程序(ISR)。存放這些 ISR 入口地址的表,就叫做中斷向量表 (Interrupt Vector Table)。
中斷向量:?每個 ISR 的入口地址就是一個中斷向量。它是一個 22 位的地址。
中斷向量表:?F28335 中,這個向量表可以被映射到不同的物理存儲區域,這由三個關鍵的控制位來決定。
ENPIE (在 PIECTRL 寄存器中):?PIE 模塊的總開關。當它為 1 時,PIE 功能開啟。復位后為 0。
VMAP (在 ST1 狀態寄存器中):?控制向量是映射到內存低地址區還是高地址區(BOOT ROM)。復位后為 1。
M0M1MAP (在 ST1 狀態寄存器中):?用于區分 M0 和 M1 RAM。復位后為 1。
實際應用中的選擇:
[圖8: PIE 使能時的向量映射表]
[圖9: PIE 禁用時的向量映射表]通過查閱這兩張表格,我們可以得出在實際應用中最常用的配置:
我們將?ENPIE?置 1,同時保持?VMAP=1?和?M0M1MAP=1。
在這種配置下,中斷向量表被穩穩地映射到了 F28335 的?PIE RAM 區 (0x000D00 - 0x000DFF)。這樣做的好處是,我們可以非常方便地在程序中,將我們自己編寫的 ISR 函數的地址,注冊到這個 RAM 區域的向量表中,從而將中斷源和我們的服務程序動態地“鏈接”起來。
總結
DSP28335 的中斷系統初看復雜,但其設計邏輯清晰、層次分明:
架構上,通過 PIE 模塊實現了對海量中斷源的分級管理。
響應上,通過“外設-PIE-CPU”的三級審批流程,確保了中斷響應的嚴謹性和可控性。
尋址上,通過靈活的向量表映射機制,讓用戶可以方便地自定義中斷服務程序。
雖然理論略顯枯燥,但徹底理解這一套機制,是你編寫高效、穩定、強大的嵌入式程序的基石。在下一篇章中,我們將進入實戰,親手配置一個定時器中斷,讓你真正感受到中斷帶來的編程魅力。