数字信号控制器的中断系统分析与实现方法
套情况,无需关闭总中断。
老开放MC56F8257总中断,则清中断控制寄存器(INTC_CTRL)的INT_DIS位;关闭总中断,则置位该位。具体代码如下:
#define EnableInterrupt()
INTC_CTRL&=~INTC_CTRL_INT_DIS_MASK
#define DisableInterrupt()
INTC_CTRL|=INTC_CTRL_INT_DIS_MASK
开放或关闭模块中断,需设置模块内部的控制寄存器的相应位。如开放QSCI模块的接收中断0,则需置位QSCI控制寄存器1(QSCIx_CTRL1)中的RFIE位;关闭该中断,清RFIE位即可。具体代码如下:
#define EnableQSCIReInt(0)
QSCI_C1(0)|=(QSCI1_CTRL1_RFIE_MASK)
#define DisableQSCIReInt(0)
QSCI_C1(0)&=~(QSCI1_CTRL1_RFIE_MASK)
2.2 中断优先级的设置
DSP56800E内核支持5级中断:LP、0、1、2和3,其优先级别依次升高[11]。最低优先级LP只能由系统SWILP指令产生;0~2优先级用户可以编程设置,主要用于外设和外部中断请求;级别3是最高优先级且不可屏蔽。
具体设置某个中断源的中断优先级,可通过设置中断优先级寄存器(INTC_IPR0~INTC_IPR7)中的相应位来实现[9]。如设置QSCI中断优先级,通过设置中断优先级寄存器(INTC_IPR2)中的QSCI0_RCV位实现,该位具体含义见表1。
表1 QSCI的中断优先级设置
从表1中可以看出,QSCI中断可配置三个不同级别,即优先级0、1和2。如果用户不配置QSCI中断的优先级,则系统复位时,自动分配其优先级为0;但是复位后,紧接着初始化QSCI模块,其优先级由0变为2。
2.3 设置中断屏蔽
通过设置DSP56800E内核中的状态寄存器SR的I0、I1位,实现屏蔽不同级别优先级中断,具体设置如表2所列。
表2 中断屏蔽位的设置
2.4 中断向量表的定义
MC56F8257有67个中断源,其向量号从0~66[9]。每个中断源的中断服务程序首地址放入中断向量表中,当有中断请求时,CPU通过中断向量号在中断向量表中找到其中断服务程序的首地址,根据这个首地址找到中断服务程序,进行中断处理。
中断向量表在FLASH中的位置由向量基地址寄存器(VBA)决定。向量基地址寄存器VBA[12:0]为21位中断向量表首地址的高13位,低8位自动补0。具体到某个模块中断服务程序首地址在中断向量表中的位置,由向量基地址寄存器(VBA)及控制寄存器(INTC_CTRL)的VAB位决定;向量基地址寄存器VBA[12:0]为其在中断向量表地址[20:0]的高13位[20:8],控制寄存器(INTC_CTRL)的VAB位为其地址的[7:1],低位补0。
系统复位后,VBA的复位值为0x0000,系统进入复位中断(向量号为0),相应的起始地址在0x00 0000处,这个过程系统自动完成。如果开放某个模块中断,则需要将该模块中断服务程序的首地址加载到中断向量表中的相应位置。具体过程如下:首先建立中断向量表,没有开放的模块中断,在表中对应位置放入空函数的首地址(通过JSR isrDummy实现),开放的模块中断,在表中对应位置放入中断服务程序的首地址,通常中断服务程序由函数实现,在这里通过放入具体函数首地址实现。如开放QSCI0的接收中断(向量号为32),则其中断服务函数为isrSCI0_Recv,即可通过在向量表中加入JSR isrSCI0_Recv代码实现。具体如下:
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的函数形式如下:
void isrDummy(void){
}
3 MC56F8257中断设置过程
MC56F8257中断设置主要包括关闭总中断、设置中断屏蔽和开放总中断三个过程。中断的设置过程在主函数和中断服务程序中都要得到体现,但二者在设置过程中有所差异。
主函数中的
- 在采用FPGA设计DSP系统中仿真的重要性 (06-21)
- 基于 DSP Builder的FIR滤波器的设计与实现(06-21)
- 达芬奇数字媒体片上系统的架构和Linux启动过程(06-02)
- FPGA的DSP性能揭秘(06-16)
- 用CPLD实现DSP与PLX9054之间的连接(07-23)
- DSP+FPGA结构在雷达模拟系统中的应用(01-02)