<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 數(shù)字信號(hào)控制器中斷系統(tǒng)及其設(shè)置方法

          數(shù)字信號(hào)控制器中斷系統(tǒng)及其設(shè)置方法

          作者: 時(shí)間:2018-08-23 來源:網(wǎng)絡(luò) 收藏

          1.引言

          本文引用地址:http://www.ex-cimer.com/article/201808/387594.htm

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

          當(dāng)多個(gè)中斷源發(fā)出中斷請(qǐng)求時(shí),CPU需要選擇接收哪一個(gè)中斷源,這就帶來中斷源選擇問題。解決這個(gè)問題的方法有屏蔽選擇法、優(yōu)先級(jí)選擇法和優(yōu)先屏蔽選擇法三種。屏蔽選擇法主要是通過屏蔽手段將某些中斷源請(qǐng)求與CPU隔離;這種屏蔽中斷方法可以屏蔽系統(tǒng)所有中斷,也可以只屏蔽某個(gè)模塊中斷。屏蔽系統(tǒng)所有中斷意味著系統(tǒng)所有中斷請(qǐng)求CPU都不接受,屏蔽某個(gè)模塊中斷說明只是屏蔽的模塊中斷請(qǐng)求CPU不接受,其它沒屏蔽模塊中斷請(qǐng)求可以進(jìn)入CPU。傳統(tǒng)51芯片采用這種方法,飛思卡爾的MC9S08AW60也采用該種方法。屏蔽選擇法通過屏蔽手段,有效地解決某些中斷源的干擾問題。

          優(yōu)先級(jí)選擇法通過對(duì)中斷源設(shè)置不同的優(yōu)先級(jí),當(dāng)多個(gè)中斷源發(fā)出請(qǐng)求時(shí),優(yōu)先級(jí)高的中斷請(qǐng)求率先進(jìn)入CPU,該中斷處理完成后,次優(yōu)先級(jí)的中斷源進(jìn)入CPU,以此類推。這種方法有效避免了屏蔽選擇法造成的被屏蔽中斷永遠(yuǎn)不能被處理的不足。

          優(yōu)先屏蔽選擇法同時(shí)具有上述兩種方法的功能,即可屏蔽所有中斷源,也可屏蔽某些模塊中斷源,也可以對(duì)非屏蔽的中斷源進(jìn)行優(yōu)先級(jí)設(shè)置。這個(gè)有多種,而51芯片優(yōu)先級(jí)只有兩種(高優(yōu)先級(jí)或低優(yōu)先級(jí))。這種方法即能避免優(yōu)先級(jí)選擇法不能解決某些中斷源的干擾問題的缺點(diǎn),又能有效避免了屏蔽選擇法造成的被屏蔽中斷永遠(yuǎn)不能被處理的缺點(diǎn)。該種方法目前逐步被芯片商采用,如MC56F8257芯片就采用這種方法。

          從上面分析看出,DSC對(duì)中斷處理比51芯片要復(fù)雜,但從另外角度看,DSC中斷帶來更大的靈活性。靈活性與穩(wěn)定性一對(duì)矛盾,本文以MC56F8257為例,從分析DSC中斷系統(tǒng)及其中斷處理技術(shù)入手,闡述其中斷處理方法,并給出處理步驟,為其應(yīng)用提供指導(dǎo)。

          2.MC56F8257中斷系統(tǒng)

          MC56F8257共有67個(gè)中斷源,5個(gè)中斷優(yōu)先級(jí)。中斷的請(qǐng)求是通過中斷控制器模塊控制的。中斷控制器模塊由中斷源、優(yōu)先級(jí)設(shè)置和控制部分組成,主要用于配置中斷優(yōu)先級(jí)、解析中斷請(qǐng)求并且將中斷向量交給CPU執(zhí)行。在中斷請(qǐng)求處理過程中,當(dāng)有多個(gè)中斷源發(fā)出請(qǐng)求(INT1…INTn)時(shí),首先優(yōu)先級(jí)別譯碼模塊根據(jù)用戶設(shè)置的優(yōu)先級(jí)進(jìn)行譯碼,譯碼后進(jìn)入相應(yīng)的優(yōu)先級(jí)編碼器進(jìn)行編碼,最后通過控制模塊進(jìn)行優(yōu)先級(jí)的配置??刂颇K根據(jù)DSP56800E核中的狀態(tài)寄存器SR中的屏蔽等設(shè)置位,對(duì)編碼后的中斷源進(jìn)行處理,處理后的結(jié)果反映在控制寄存器INTC_CTRL中的INT、IPIC和VAB位。

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

          MC56F8257內(nèi)核為16位增強(qiáng)型DSP56800E,該內(nèi)核處理中斷請(qǐng)求有兩種模式:標(biāo)準(zhǔn)和快速中斷處理。轉(zhuǎn)向中斷服務(wù)程序,占用一定數(shù)量的軟件開銷,但所有級(jí)別中斷都支持該模式;快速中斷處理不需要執(zhí)行JSR指令而是通過快速中斷向量地址寄存器獲得中斷服務(wù)程序首地址,節(jié)省了軟件資源,但它只能用于中斷優(yōu)先級(jí)為2級(jí)的中斷。具體采用何種模式,應(yīng)根據(jù)實(shí)際應(yīng)用需要進(jìn)行設(shè)置。

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

          開放MC56F8257中某個(gè)模塊中斷,通常需要開放總中斷及模塊中斷來實(shí)現(xiàn)。這兩部分缺一不可,并且開放總中斷在前,開放模塊中斷在后。同理,關(guān)閉MC56F8257中某個(gè)模塊中斷,需要關(guān)閉總中斷及模塊中斷來實(shí)現(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)

          3.2 中斷優(yōu)先級(jí)的設(shè)置

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

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

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

          3.3 設(shè)置中斷屏蔽

          通過設(shè)置DSP56800E內(nèi)核中的狀態(tài)寄存器SR的I0、I1位,實(shí)現(xiàn)屏蔽不同級(jí)別優(yōu)先級(jí)中斷。屏蔽某個(gè)優(yōu)先級(jí)中斷,可通過使能中斷優(yōu)先級(jí)相應(yīng)的優(yōu)先級(jí)中斷來實(shí)現(xiàn)。例如,屏蔽優(yōu)先級(jí)0中斷,可通過使能優(yōu)先級(jí)1,2,3中斷實(shí)現(xiàn),具體代碼如下:

          #define EnInt(1) {asm(bfset #0x0100,SR); asm(bfclr #0x0200,SR);}

          另外,也可以同時(shí)屏蔽2個(gè)以上級(jí)別中斷,如屏蔽優(yōu)先級(jí)0,1,2中斷,通過使能優(yōu)先級(jí)3中斷實(shí)現(xiàn),具體代碼如下:

          #define EnInt(3) {asm(bfset #0x0300,SR);}

          在設(shè)置中斷屏蔽時(shí),應(yīng)注意的是主函數(shù)的屏蔽中斷優(yōu)先級(jí)代碼與中斷服務(wù)程序的相應(yīng)代碼應(yīng)保證所需的中斷不被屏蔽。

          3.4 中斷矢量表的定義

          MC56F8257的67個(gè)中斷源,其矢量號(hào)從0到66 [9]。每個(gè)中斷源的中斷服務(wù)程序首地址放入中斷矢量表中。當(dāng)有中斷請(qǐng)求時(shí),CPU通過中斷矢量號(hào)在中斷矢量表中找到其中斷服務(wù)程序的首地址,根據(jù)這個(gè)首地址找到中斷服務(wù)程序,進(jìn)行中斷處理。

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

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

          {

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

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

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

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

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

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

          }

          #pragma section interrupt_vectors end

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

          void isrDummy(void)

          {

          }

          該函數(shù)首地址用來充當(dāng)未開放模塊中斷的中斷服務(wù)程序的首地址,加載到中斷矢量表中。

          4.MC56F8257中斷設(shè)置過程

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

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

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

          5.測(cè)試及其分析

          5.1 測(cè)試條件與環(huán)境

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

          5.2 測(cè)試結(jié)果與分析

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

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

          開放QSCI0接收中斷,不設(shè)置其中斷優(yōu)先級(jí),采用系統(tǒng)默認(rèn)優(yōu)先級(jí)2,不屏蔽該級(jí)別中斷。代碼DisableInterrupt()在主函數(shù)和中斷服務(wù)程序中都有,但作用不一樣。在主函數(shù)中的作用是禁止所有中斷,為后續(xù)中斷設(shè)置提供良好環(huán)境;中斷服務(wù)程序中的作用是禁止其他中斷,防止中斷的嵌套。EnableQSCIReInt(0)使能QSCI0接收中斷。EnInt(2)使能2,3級(jí)別的中斷。主函數(shù)和中斷服務(wù)程序中的EnableInterrupt()作用是開放總中斷。

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

          如果屏蔽QSCI0接收中斷的默認(rèn)優(yōu)先級(jí)2,其主函數(shù)和QSCI接收中斷服務(wù)程序中的中斷代碼有所不同。

          代碼EnInt(3)屏蔽了中斷優(yōu)先級(jí)0、1和2,只允許優(yōu)先級(jí)為3的中斷,無法響應(yīng)優(yōu)先級(jí)為2的QSCI0接收中斷。測(cè)試條件同上,其結(jié)果如圖4(b)所示。

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

          開放QSCI0接收中斷,設(shè)置其中斷優(yōu)先級(jí),不屏蔽該級(jí)別中斷。

          代碼Qsci Priority的作用是設(shè)置QSCI0接收中斷優(yōu)先級(jí)為0;EnInt(0)使能0,1,2,3級(jí)別的中斷。測(cè)試條件同上。如果屏蔽QSCI0接收中斷的優(yōu)先級(jí)0,其主函數(shù)和QSCI接收中斷服務(wù)程序中的中斷代碼有所不同。

          代碼EnInt(1) 屏蔽了中斷優(yōu)先級(jí)0,允許優(yōu)先級(jí)為1,2,3的中斷,因此QSCI0接收中斷被屏蔽。

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

          同時(shí)開放QSCI0接收中斷和CAN模塊接收中斷,并且前者優(yōu)先級(jí)高于后者。

          代碼Qsci Priority設(shè)定QSCI0接收中斷的優(yōu)先級(jí)為1,CANPriority 設(shè)定CAN接收中斷的優(yōu)先級(jí)為0,即QSCI0接收中斷的優(yōu)先級(jí)高于CAN接收中斷。

          運(yùn)行程序,當(dāng)僅有CAN接收中斷請(qǐng)求時(shí),CAN接收中斷服務(wù)程序接收字符串“CANMessage”,并通過QSCI0將該字符發(fā)送給串口調(diào)試工具,如圖6(a)所示。如果在這個(gè)過程中,又有QSCI0接收中斷請(qǐng)求,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)先級(jí)低于后者。

          代碼Qsci Priority設(shè)定QSCI0接收中斷的優(yōu)先級(jí)為0,CANPriority設(shè)定CAN接收中斷的優(yōu)先級(jí)為1,即QSCI0接收中斷的優(yōu)先級(jí)低于CAN接收中斷。

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

          6.總結(jié)

          本文以MC56F8257為例,分析DSC中斷系統(tǒng),該系統(tǒng)具有處理多達(dá)67個(gè)中斷源的能力,并能夠給這些中斷源賦予不同的優(yōu)先級(jí),實(shí)現(xiàn)中斷嵌套,并提供標(biāo)準(zhǔn)和快速中斷處理兩種模式,這些特點(diǎn)促進(jìn)其廣泛被應(yīng)用。

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

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



          評(píng)論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();