28335中断系统
1.中断系统
在这里我们要十分清楚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; // This is needed to write to EALLOW protected registers PieVectTable.XINT2 = &ISRExint; //告诉中断入口地址 EDIS; // This is needed to disable write to EALLOW protected registers PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block使能PIE PieCtrlRegs.PIEIER1.bit.INTx5= 1; //使能第一组中的中断5 IER |= M_INT1; // Enable CPU 第一组中断 EINT; // Enable Global interrupt INTM ERTM; // Enable Global realtime interrupt DBGM
也就是说,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时钟和系统时钟一样且支持GPIO GpioCtrlRegs.GPBQSEL2.bit.GPIO55= 0; GpioCtrlRegs.GPBQSEL2.bit.GPIO56= 0; GpioCtrlRegs.GPBQSEL2.bit.GPIO57= 0; GpioIntRegs.GPIOXINT3SEL.bit.GPIOSEL = 54;//中断3选择GPIO GpioIntRegs.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配置。
2.如何开启某个中断?
- 设置中断向量。例如:PieVectTable.ADCINT = &adc_isr;等
- 打开PIE控制器。PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
- 使能PIE中对应外设的中断(相应group的相应pin)。例如:PieCtrlRegs.PIEIER1.bit.INTx8 = 1; PieCtrlRegs.PIEIER1.bit.INTx6 = 1;等
- 使能CPU的相应中断(INT1~INT12)IER |= M_INT1;
- 使能CPU响应中断EINT、ERTM;;
参考网址:http://www.61ic.com/Article/C2000/Delfino/201112/40118.html
3.中断标志有几级?作用是什么?
中断标志主要有三级CPU(有16个标志位)、PIE(有12组每组有12个标志位)和外设(有的外设没有)。
标志位在中断发生后锁存中断状态,即表示中断发生。在CPU响应中断后,会自动清除cpu级别的标志位IFR bit,同时将INTM bit 置位,以防止其它中断的发生;
CPU在从PIE中取中断向量时PIE会自动清除PIE级别的标志位PIEIFRx.y。所以在进入中断处理程序后除了外设所有中断位都已经清除。而中断处理程序中需要清除PIEACKx和外设的中断标志位(如果有的话)。
在CPU响应一个中断后,在进入ISR的时候,默认会关断全局中断,即在执行中断服务程序时,不会有其他中断来打断CPU,包括本次的中断事件。另外,如果外设的中断标志位不清除,不会循环进入这个中断服务函数,这个外设中断被阻断了。所以只有清除外设的中断服务程序,才能响应下一次的外设中断。PIEACK同理,如果没有PIEACK,这组所有中断都被阻断。
参考网址:http://www.deyisupport.com/question_answer/f/56/t/13047.aspx
http://www.61ic.com/Article/C2000/Delfino/201204/41777.html