2010-05-2123:03:48|分类:默认分类|字号订阅1.要使用外部中断要从两方面进行准备:首先,在硬件上必须将中断信号引到DSP的外部中断引脚上。比如:FPGA的一个output发出中断请求信号那么就将这个管脚与DSP的XINT1相连,XINT1可以通过一个4.7k的电阻上拉到3.3v,也可以不拉。其次是在软件上的配置:1.初始外部中断寄存器voidXint1_init(void){EALLOW;XIntruptRegs.XINT1CR.bit.ENABLE=1;//使能外部中断XIntruptRegs.XINT1CR.bit.POLARITY=1;//中断产生在上升沿,若为0中断产生在下降沿DISE;}由于这是一个函数,所以也要有函数声明,函数调用,函数定义。2使能cpuINT1中断PieCtrlRegs.PIEIER1.bit.INTx4=1;//EnableallXINT1interruptIER|=0x100;//EnableCPUINTIER|=0x0001;//enablePIEIER1,andINT13.编写中断服务程序,interruptvoidXint1_ISR(void){.......PieCtrlRegs.PIEACK.all|=0x0001;}4将中断服务程序入口地址赋给中断向量表PieVectTable.XINT1=&Xint1_ISR;总结起来使用外部中断的步骤如下:1声明外部中断服务程序和外部中断初始化函数voidXint1_init(void);interruptvoidXint1_ISR(void);2将中断服务程序入口地址赋给中断向量表PieVectTable.XINT1=&Xint1_ISR;3使能cpuINT1中断IER|=0x0001;//enablePIEIER1,andINT1PieCtrlRegs.PIEIER1.bit.INTx4=1;//EnableallXINT1interrupt4.在主函数体外定义专断初始化函数和中断服务程序不好意思这几天加班、单位聚餐,一直没时间回复。xint13如何设置已经解决了,但是由于自己电脑没有源代码,就不贴了。只是把思路说出来。1、首先在中断初始化的时候,给xint13分配自己的中断服务子程序,将XNMICR寄存器赋值为0x2,并时能IER的第13位,也就是中断13;2、由于xint13不属于PIE级,所以PIE就不须配置(你想设置也没有相应的寄存器,呵呵);3、在中断服务子程序中,无需像PIE级中断那样,响应同组中断。同时,在xint13中断处理完后,dsp会自动清除IFR相应的中断标志位,不须人为的清标志位。按照这个配置,就可以了。再次谢谢大家TMS320F28335的外部中断总结:在这里我们要十分清楚DSP的中断系统。C28XX一共有16个中断源,其中有2个不可屏蔽的中断RESET和NMI、定时器1和定时器2分别使用中断13和14。这样还有12个中断都直接连接到外设中断扩展模块PIE上。说的简单一点就是PIE通过12根线与28335核的12个中断线相连。而PIE的另外一侧有12*8根线分别连接到外设,如AD、SPI、EXINT等等。这样PIE共管理12*8=96个外部中断。这12组大中断由28335核的中断寄存器IER来控制,即IER确定每个中断到底属于哪一组大中断(如IER|=M_INT12;说明我们要用第12组的中断,但是第12组里面的什么中断CPU并不知道需要再由PIEIER确定)。接下来再由PIE模块中的寄存器PIEIER中的低8确定该中断是这一组的第几个中断,这些配置都要告诉CPU(我们不难想象到PIEIER共有12总即从PIEIER1-PIEIER12)。另外,PIE模块还有中断标志寄存器PIEIFR,同样它的低8位是来自外部中断的8个标志位,同样CPU的IFR寄存器是中断组的标志寄存器。由此看来,CPU的所有中断寄存器控制12组的中断,PIE的所有中断寄存器控制每组内8个的中断。除此之外,我们用到哪一个外部中断,相应的还有外部中断的寄存器,需要注意的就是外部中断的标志要自己通过软件来清零。而PIE和CPU的中断标志寄存器由硬件来清零。EALLOW;//ThisisneededtowritetoEALLOWprotectedregistersPieVectTable.XINT2=&ISRExint;//告诉中断入口地址EDIS;//ThisisneededtodisablewritetoEALLOWprotectedregistersPieCtrlRegs.PIECTRL.bit.ENPIE=1;//EnablethePIEblock使能PIEPieCtrlRegs.PIEIER1.bit.INTx5=1;//使能第一组中的中断5IER|=M_INT1;//EnableCPU第一组中断EINT;//EnableGlobalinterruptINTMERTM;//EnableGlobalrealtimeinterruptDBGM也就是说,12组中的每个中断都要完成上面的相同配置,剩下的才是去配置自己的中断。如我们提到的EXINT,即外面来个低电平我们就进入中断,完成我们的程序。在这里要介绍一下,DSP的GPIO口都可以配置为外部中断口,其配置方法如下:GpioCtrlRegs.GPBMUX2.bit.GPIO54=0;//选择他们是GPIO口GpioCtrlRegs.GPBMUX2.bit.GPIO55=0;GpioCtrlRegs.GPBMUX2.bit.GPIO56=0;GpioCtrlRegs.GPBMUX2.bit.GPIO57=0;GpioCtrlRegs.GPBDIR.bit.GPIO54=0;//选择他们都是输入口GpioCtrlRegs.GPBDIR.bit.GPIO55=0;GpioCtrlRegs.GPBDIR.bit.GPIO56=0;GpioCtrlRegs.GPBDIR.bit.GPIO57=0;GpioCtrlRegs.GPBQSEL2.bit.GPIO54=0;//GPIO时钟和系统时钟一样且支持GPIOGpioCtrlRegs.GPBQSEL2.bit.GPIO55=0;GpioCtrlRegs.GPBQSEL2.bit.GPIO56=0;GpioCtrlRegs.GPBQSEL2.bit.GPIO57=0;GpioIntRegs.GPIOXINT3SEL.bit.GPIOSEL=54;//中断3选择GPIOGpioIntRegs.GPIOXINT4SEL.bit.GPIOSEL=55;GpioIntRegs.GPIOXINT5SEL.bit.GPIOSEL=56;GpioIntRegs.GPIOXINT6SEL.bit.GPIOSEL=57;XIntruptRegs.XINT3CR.bit.POLARITY=0;//触发模式为下降沿触发XIntruptRegs.XINT4CR.bit.POLARITY=0;XIntruptRegs.XINT5CR.bit.POLARITY=0;XIntruptRegs.XINT6CR.bit.POLARITY=0;XIntruptRegs.XINT3CR.bit.ENABLE=1;//使能中断XIntruptRegs.XINT4CR.bit.ENABLE=1;XIntruptRegs.XINT5CR.bit.ENABLE=1;XIntruptRegs.XINT6CR.bit.ENABLE=1;注意一点就是外部中断1和2只能对GPIO0—GPIO31配置;外部中断3和4、5、6、7只对GPIO32—GPIO63配置。