新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 數(shù)字信號控制器的中斷系統(tǒng)分析與實現(xiàn)方法

數(shù)字信號控制器的中斷系統(tǒng)分析與實現(xiàn)方法

作者: 時間:2016-01-26 來源:網(wǎng)絡(luò) 收藏

  引言

本文引用地址:http://butianyuan.cn/article/201601/286283.htm

  數(shù)字信號控制器(Digital Signal Controller, DSC)是將內(nèi)核與接口相結(jié)合的微處理器芯片。DSC同時具有數(shù)字信號處理能力和控制接口,并且中斷系統(tǒng)功能非常豐富。中斷是指CPU正在處理某件事情時,突然發(fā)生的某一外部事件(如一個電平的變化,一個脈沖沿的發(fā)生或定時器的計數(shù)溢出等)請求CPU迅速去處理,此時,若條件允許,CPU暫時中斷當前的工作,轉(zhuǎn)去處理所發(fā)生的事件(中斷服務(wù)程序),處理完后,再回到原來中斷的地方,繼續(xù)原來的工作,這樣一個完整的過程稱為中斷[2]。外設(shè)在需要時通過中斷,中止CPU當前的工作,進行信息交換;這樣可以實現(xiàn)CPU和多個外設(shè)同時工作,提高系統(tǒng)的吞吐率和使用效率[3,4]。因此,中斷具有處理突發(fā)事件、提高CPU的效率、可以實現(xiàn)多任務(wù)數(shù)據(jù)事件管理等特點。當多個中斷源發(fā)出中斷請求時,CPU需要選擇接收哪一個中斷源,這就帶來中斷源選擇問題[5]。

  解決這個問題的方法有屏蔽選擇法、優(yōu)先級選擇法和優(yōu)先屏蔽選擇法三種。屏蔽選擇法主要是通過屏蔽手段將某些中斷源請求與CPU隔離;這種屏蔽中斷方法可以屏蔽系統(tǒng)所有中斷,也可以只屏蔽某個模塊中斷。屏蔽系統(tǒng)所有中斷意味著系統(tǒng)所有中斷請求CPU都不接受,屏蔽某個模塊中斷說明只是屏蔽的模塊中斷請求CPU不接受,其它沒屏蔽模塊中斷請求可以進入CPU。傳統(tǒng)51芯片采用這種方法,飛思卡爾的MC9S08AW60也采用該種方法。屏蔽選擇法通過屏蔽手段,有效地解決某些中斷源的干擾問題[6]。優(yōu)先級選擇法通過對中斷源設(shè)置不同的優(yōu)先級,當多個中斷源發(fā)出請求時,優(yōu)先級高的中斷請求率先進入CPU,該中斷處理完成后,次優(yōu)先級的中斷源進入CPU,以此類推[7]。這種方法有效避免了屏蔽選擇法造成的被屏蔽中斷永遠不能被處理的不足。優(yōu)先屏蔽選擇法同時具有其他兩種方法的功能,既可屏蔽所有中斷源,又可屏蔽某些模塊中斷源,也可以對非屏蔽的中斷源進行優(yōu)先級設(shè)置。這種方法既能避免優(yōu)先級選擇法不能解決某些中斷源的干擾問題,又能有效避免屏蔽選擇法造成的被屏蔽中斷永遠不能被處理的缺點[8]。該種方法目前逐步被DSC芯片商采用,如MC56F8257芯片就采用這種方法。從上面分析看出,DSC對中斷處理比51芯片要復雜,但從另外角度看,DSC中斷帶來更大的靈活性。靈活性與穩(wěn)定性一對矛盾,本文以MC56F8257為例,從分析DSC中斷系統(tǒng)及其中斷處理技術(shù)入手,闡述其中斷處理方法,并給出處理步驟,為其應(yīng)用提供指導。

  1 MC56F8257中斷系統(tǒng)

  MC56F8257共有67個中斷源、5個中斷優(yōu)先級。中斷的請求是通過中斷控制器模塊控制的。中斷控制器模塊由中斷源、優(yōu)先級設(shè)置和控制部分組成,其框圖如圖1所示,主要用于配置中斷優(yōu)先級、解析中斷請求,并且將中斷向量交給CPU執(zhí)行。

    

 

  圖1 中斷控制器框圖

  從圖1可以看出,在中斷請求處理過程中,當有多個中斷源發(fā)出請求(INT1…INTn)時,首先優(yōu)先級別譯碼模塊根據(jù)用戶設(shè)置的優(yōu)先級進行譯碼,譯碼后進入相應(yīng)的優(yōu)先級編碼器進行編碼,最后通過控制模塊進行優(yōu)先級的配置??刂颇K根據(jù)56800E核中的狀態(tài)寄存器SR中的屏蔽等設(shè)置位,對編碼后的中斷源進行處理,處理后的結(jié)果反映在控制寄存器INTC_CTRL中的INT、VAB和IPIC位。

  INT是中斷位,該位反映內(nèi)核中斷的狀態(tài)。當該位值為1時,有中斷送入內(nèi)核;否則,無中斷送入內(nèi)核。IPIC是中斷優(yōu)先級位,該位表示送入內(nèi)核的中斷源的優(yōu)先級,也表示當前內(nèi)核所接收的中斷的最高優(yōu)先級。VAB是中斷向量信號,也是對應(yīng)中斷在中斷向量表中的地址的[7:1]位[9]。

  MC56F8257內(nèi)核為16位增強型56800E,該內(nèi)核處理中斷請求有兩種模式:標準和快速中斷處理模式[10]。MC56F8257標準中斷處理模式具體流程如圖2所示,該模式通過JSR指令,轉(zhuǎn)向中斷服務(wù)程序,占用一定數(shù)量的軟件開銷,但所有級別中斷都支持該模式。一般中斷處理的控制流程圖如圖2所示。

    

  

 

  圖2 一般中斷處理的控制流程圖

  快速中斷處理不需要執(zhí)行JSR指令,如圖3所示,而是通過快速中斷向量地址寄存器獲得中斷服務(wù)程序首地址,節(jié)省了軟件資源,但它只能用于中斷優(yōu)先級為2級的中斷。具體采用何種模式,應(yīng)根據(jù)實際應(yīng)用需要進行設(shè)置。

  2 MC56F8257中斷設(shè)置方法

  2.1 中斷的關(guān)閉與開放

  開放MC56F8257中某個模塊中斷,通常需要開放總中斷及模塊中斷來實現(xiàn)。這兩部分缺一不可,并且開放總中斷在前,開放模塊中斷在后。同理,關(guān)閉MC56F8257中某個模塊中斷,需要關(guān)閉總中斷及模塊中斷來實現(xiàn),先關(guān)閉模塊中斷,再關(guān)閉總中斷;如果允許中斷嵌套情況,無需關(guān)閉總中斷。

  老開放MC56F8257總中斷,則清中斷控制寄存器(INTC_CTRL)的INT_DIS位;關(guān)閉總中斷,則置位該位。具體代碼如下:

  #define EnableInterrupt()

  INTC_CTRL&=~INTC_CTRL_INT_DIS_MASK

  #define DisableInterrupt()

  INTC_CTRL|=INTC_CTRL_INT_DIS_MASK

  開放或關(guān)閉模塊中斷,需設(shè)置模塊內(nèi)部的控制寄存器的相應(yīng)位。如開放QSCI模塊的接收中斷0,則需置位QSCI控制寄存器1(QSCIx_CTRL1)中的RFIE位;關(guān)閉該中斷,清RFIE位即可。具體代碼如下:

  #define EnableQSCIReInt(0)

  QSCI_C1(0)|=(QSCI1_CTRL1_RFIE_MASK)

  #define DisableQSCIReInt(0)

  QSCI_C1(0)&=~(QSCI1_CTRL1_RFIE_MASK)

  2.2 中斷優(yōu)先級的設(shè)置

  DSP56800E內(nèi)核支持5級中斷:LP、0、1、2和3,其優(yōu)先級別依次升高[11]。最低優(yōu)先級LP只能由系統(tǒng)SWILP指令產(chǎn)生;0~2優(yōu)先級用戶可以編程設(shè)置,主要用于外設(shè)和外部中斷請求;級別3是最高優(yōu)先級且不可屏蔽。

  具體設(shè)置某個中斷源的中斷優(yōu)先級,可通過設(shè)置中斷優(yōu)先級寄存器(INTC_IPR0~INTC_IPR7)中的相應(yīng)位來實現(xiàn)[9]。如設(shè)置QSCI中斷優(yōu)先級,通過設(shè)置中斷優(yōu)先級寄存器(INTC_IPR2)中的QSCI0_RCV位實現(xiàn),該位具體含義見表1。

  表1 QSCI的中斷優(yōu)先級設(shè)置

    

 

  從表1中可以看出,QSCI中斷可配置三個不同級別,即優(yōu)先級0、1和2。如果用戶不配置QSCI中斷的優(yōu)先級,則系統(tǒng)復位時,自動分配其優(yōu)先級為0;但是復位后,緊接著初始化QSCI模塊,其優(yōu)先級由0變?yōu)?。

  2.3 設(shè)置中斷屏蔽

  通過設(shè)置DSP56800E內(nèi)核中的狀態(tài)寄存器SR的I0、I1位,實現(xiàn)屏蔽不同級別優(yōu)先級中斷,具體設(shè)置如表2所列。

  表2 中斷屏蔽位的設(shè)置

    

 

  2.4 中斷向量表的定義

  MC56F8257有67個中斷源,其向量號從0~66[9]。每個中斷源的中斷服務(wù)程序首地址放入中斷向量表中,當有中斷請求時,CPU通過中斷向量號在中斷向量表中找到其中斷服務(wù)程序的首地址,根據(jù)這個首地址找到中斷服務(wù)程序,進行中斷處理。

  中斷向量表在FLASH中的位置由向量基地址寄存器(VBA)決定。向量基地址寄存器VBA[12:0]為21位中斷向量表首地址的高13位,低8位自動補0。具體到某個模塊中斷服務(wù)程序首地址在中斷向量表中的位置,由向量基地址寄存器(VBA)及控制寄存器(INTC_CTRL)的VAB位決定;向量基地址寄存器VBA[12:0]為其在中斷向量表地址[20:0]的高13位[20:8],控制寄存器(INTC_CTRL)的VAB位為其地址的[7:1],低位補0。

  系統(tǒng)復位后,VBA的復位值為0x0000,系統(tǒng)進入復位中斷(向量號為0),相應(yīng)的起始地址在0x00 0000處,這個過程系統(tǒng)自動完成。如果開放某個模塊中斷,則需要將該模塊中斷服務(wù)程序的首地址加載到中斷向量表中的相應(yīng)位置。具體過程如下:首先建立中斷向量表,沒有開放的模塊中斷,在表中對應(yīng)位置放入空函數(shù)的首地址(通過JSR isrDummy實現(xiàn)),開放的模塊中斷,在表中對應(yīng)位置放入中斷服務(wù)程序的首地址,通常中斷服務(wù)程序由函數(shù)實現(xiàn),在這里通過放入具體函數(shù)首地址實現(xiàn)。如開放QSCI0的接收中斷(向量號為32),則其中斷服務(wù)函數(shù)為isrSCI0_Recv,即可通過在向量表中加入JSR isrSCI0_Recv代碼實現(xiàn)。具體如下:

  volatile asm void _vect(void);

  #pragma define_section interrupt_vectors

  "interrupt_vectors.text"RX

  #pragma section interrupt_vectors begin

  volatile asm void _vect(void) {

  JSRinit_MC56F824x_5x_ISR_HW_RESET

  /* Interrupt no. 0 (Used) - ivINT_Reset*/

  JSRisrDummy

  /* Interrupt no. 1 (Used) - ivINT_COPReset*/

  JSRisrDummy

  /* Interrupt no. 2 (Unused) - ivINT_Illegal_Instruction*/

  

  JSRisrSCI0_Recv

  /* Interrupt no. 32 (Used) - ivINT_QSCI0_RxFull*/

  

  JSRisrDummy

  /* Interrupt no. 65 (Unused) - ivINT_GPIO_A*/

  JSRisrDummy

  /* Interrupt no. 66 (Unused) - ivINT_LP*/

  }

  #pragma section interrupt_vectors end

  其中,isrDummy的函數(shù)形式如下:

  void isrDummy(void){

  }

  3 MC56F8257中斷設(shè)置過程

  MC56F8257中斷設(shè)置主要包括關(guān)閉總中斷、設(shè)置中斷屏蔽和開放總中斷三個過程。中斷的設(shè)置過程在主函數(shù)和中斷服務(wù)程序中都要得到體現(xiàn),但二者在設(shè)置過程中有所差異。

  主函數(shù)中的中斷設(shè)置除了包括上述三個過程外,還包括開放模塊中斷及設(shè)置中斷優(yōu)先級,具體流程如下:一是關(guān)閉總中斷,目的是實現(xiàn)后續(xù)各個模塊中斷設(shè)置過程中不被外界干擾。二是開放模塊中斷,如果需要某個模塊中斷,可以使能該模塊中斷。三是設(shè)置各模塊中斷優(yōu)先級,主要應(yīng)用于多個中斷請求的情況。在這種情況下,根據(jù)應(yīng)用環(huán)境決定各個模塊中斷優(yōu)先順序,設(shè)置中斷優(yōu)先級,如果不設(shè)置優(yōu)先級,則系統(tǒng)會自動產(chǎn)生默認的優(yōu)先級。四是設(shè)置中斷屏蔽,通過屏蔽一定級別的中斷,使系統(tǒng)避免受其干擾。五是開放總中斷,在上述設(shè)置步驟完成后,通過開放總中斷,使其設(shè)置有效。

  中斷服務(wù)程序中的中斷設(shè)置包括關(guān)閉總中斷、設(shè)置中斷屏蔽和開放總中斷三個過程。關(guān)閉總中斷和開放總中斷過程同主函數(shù),設(shè)置中斷屏蔽過程與主函數(shù)類似,但需要注意的是,主函數(shù)與中斷服務(wù)程序中的中斷屏蔽設(shè)置應(yīng)保證所需的中斷不被屏蔽。

  4 測試及其分析

  4.1 測試條件與環(huán)境

  現(xiàn)以MC56F8257中的QSCI模塊中斷及CAN模塊中斷為例,說明上述中斷設(shè)置方法及實施過程,并對其過程進行分析。選用QSCI模塊的QSCI0傳輸數(shù)據(jù),波特率設(shè)為9 600 bps。CAN模塊接收數(shù)據(jù),CAN通信頻率為800 kHz。程序編譯調(diào)試環(huán)境為CodeWarrior 10.4,測試環(huán)境為串口調(diào)試工具SSCOM V2.0。

  4.2 測試結(jié)果與分析

  從不帶中斷優(yōu)先級、帶中斷優(yōu)先級和優(yōu)先級嵌套三個方面,測試分析MC56F8257中斷設(shè)置及實施過程。

  (1) 不帶中斷優(yōu)先級

  開放QSCI0接收中斷,不設(shè)置其中斷優(yōu)先級,采用系統(tǒng)默認優(yōu)先級2,不屏蔽該級別中斷,其主函數(shù)和中斷服務(wù)程序中的中斷代碼略——編者注。

  運行程序,從串口調(diào)試工具SSCOM V2.0發(fā)送字符“a”給MC56F8257,MC56F8257的QSCI0中斷接收,并將接收的數(shù)據(jù)發(fā)送給PC機,最終接收到字符“a”。

  如果屏蔽QSCI0接收中斷的默認優(yōu)先級為2,其主函數(shù)和QSCI接收中斷服務(wù)程序中的中斷代碼有所不同,相關(guān)代碼略——編者注。

  測試條件同上,其結(jié)果為接收不到字符“a”。

  (2) 帶中斷優(yōu)先級

  開放QSCI0接收中斷,設(shè)置其中斷優(yōu)先級,不屏蔽該級別中斷,其主函數(shù)和中斷服務(wù)程序中的中斷代碼略——編者注。

  測試結(jié)果同樣也能接收到字符“a”。

  如果屏蔽QSCI0接收中斷的優(yōu)先級0,其主函數(shù)和QSCI接收中斷服務(wù)程序中的中斷代碼有所不同,具體相關(guān)代碼略——編者注。

  其測試結(jié)果同樣是接收不到字符“a”。

  (3) 優(yōu)先級嵌套

  同時開放QSCI0接收中斷和CAN模塊接收中斷,并且前者優(yōu)先級高于后者,其主函數(shù)和中斷服務(wù)程序中的中斷代碼略——編者注。

  運行程序,當僅有CAN接收中斷請求時,CAN接收中斷服務(wù)程序接收字符串“CANMessage”,并通過QSCI0將該字符發(fā)送給串口調(diào)試工具。如果在這個過程中,又有QSCI0接收中斷請求,則CPU暫停CAN接收中斷服務(wù)程序的執(zhí)行,轉(zhuǎn)向QSCI0接收中斷服務(wù)程序處理,從串口調(diào)試工具窗口接收字符“a”,并發(fā)送給串口調(diào)試工具窗口。將QSCI0接收中斷服務(wù)程序執(zhí)行完成后,返回CAN接收中斷服務(wù)程序繼續(xù)執(zhí)行。

  如果開放QSCI0接收中斷和CAN模塊接收中斷,并且前者優(yōu)先級低于后者,其主函數(shù)和中斷服務(wù)程序中的中斷代碼略——編者注。

  運行程序,當僅有CAN接收中斷請求時,CAN接收中斷服務(wù)程序接收字符串“CANMessage”,并通過QSCI0將該字符發(fā)送給串口調(diào)試工具。如果在這個過程中,又有QSCI0接收中斷請求,則CPU不會響應(yīng)其請求,繼續(xù)執(zhí)行CAN接收中斷服務(wù)程序,繼續(xù)發(fā)送字符串“CANMessage” 給串口調(diào)試工具。

  結(jié)語

  本文以MC56F8257為例,分析DSC中斷系統(tǒng),該系統(tǒng)具有處理多達67個中斷源的能力,并能夠給這些中斷源賦予不同的優(yōu)先級,實現(xiàn)中斷嵌套,并提供標準和快速中斷處理兩種模式,這些特點可使該系統(tǒng)被廣泛應(yīng)用。

  上述特點也帶來中斷設(shè)置的靈活性,但是如果設(shè)置不當,會出現(xiàn)錯誤。本文在分析中斷系統(tǒng)的同時給出其中斷設(shè)置方法及過程,并詳細分析中斷優(yōu)先級設(shè)置過程及注意事項。

  最后,以MC56F8257中的QSCI模塊中斷及CAN模塊中斷為例,從不帶中斷優(yōu)先級、帶中斷優(yōu)先級和優(yōu)先級嵌套三個方面,分析中斷設(shè)置過程及響應(yīng)結(jié)果,結(jié)果進一步驗證了MC56F8257中斷處理具有屏蔽及優(yōu)先級可配置等特點。

 

 

 

 

 



關(guān)鍵詞: DSP MCU

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉