中断概述
通过硬件或软件驱动的信号,使CPU将当前的程序挂起,执行另一个称为中断服务子程序称为中断。28335内部有16根中断线,其中有两个不可屏蔽中断(RESET、NMI)与16个可屏蔽中断(INT1-14、RTOSINT、DLOGINT),这里主要说明INT1-14。
在28335中,CPU定时器1、2一般预留给实时操作系统使用,中断线单独分配给INT13、INT14。其余12个可屏蔽中断直接连接在外设中断扩展模块PIE上,供外部中断和处理器内部单元使用。这就有一个问题,28335内部有很多个外设模块,这些外设都有自己的中断而且有很多个,那么剩余12个中断怎么够用。为了解决这个问题所有引入PIE模块。PIE通过12根线与28335核的12个中断线相连。而PIE的另外一侧有12*8=96根线分别连接到外设,如AD、SPI、EXINT等等。
说明:PIE和CPU的中断标志寄存器由硬件来清零;但外部中断的标志位要通过软件来清零。
1.外设级中断
如果有外设产生中断事件,则寄存器中相应的中断标志位被置一,如果相应的中断使能为(IE)被置位,那么外设就像PIE发出一个中断请求。如果外设使能位没有被置位,那么中断标志(IF)位将保持为1直到软件清除。
2.PIE中断
对于复用的中断源,PIE模块有相应的标志寄存器[PIEIFR(x,y) x=1-12,y=1-8]和中断使能寄存器PIEIER(x,y) ;对于每一个PIE中断组来说还有一个中断应答寄存器PIEACKx。当有中断请求进入PIE模块的时候,如果相应的PIE中断标志位PIEIFR(x.y)和中断使能寄存器PIEIER(x,y)置1;这是PIE控制器就会检查PIEACKx标志位看CPU是否已经准备好接收这个PIE中断组的中断。
说明:如果PIEACKZx被清零,PIE会把这个中断请求送到CPU级的INTx。如果PIEACKx位置1,那么PIE就会等待直到这个标志位清零然后发送中断请求给CPU级的INTx。中断过程中需要向PIEACKx寄存器 写1清零。
3.CPU级中断
一旦中断请求到达CPU级,CPU级INTx的中断标志位置1,如果CPU中断使能寄存器、调试中断允许寄存器(DBGIER:软件仿真模式时起作用)和全局中断屏蔽位(INTM)使能的话,CPU才会执行这个中断申请。
下面详细介绍中断请求的具体步骤
图1 中断请求的流程(重点)
步骤1:PIE组中的任何外设或外部中断都可以产生一个中断。如果在该外设模块被使能,则这个中断请求就被送到PIE模块。
步骤2:PIE识别PIE组x内的y中断(INT(x.y))发出的请求,相应的中断标志位被锁定(PIEIFR(x.y)=1)。
步骤3:为将中断请求从PIE发送到CPU,需要满足两个条件:
l 相应的中断使能位被使能(PIEIER(x.y)=1);
l 中断组中的应答寄存器的为被清零(PIEACKx=0)。
步骤4:如步骤3中的条件均满足要求,则中断请求被送到CPU级,并且对应得应答再次置1(PIEACKx=1),此时,中断请求进入CPU的通道被切断,这种状态一直保持直到用户清除此位。
步骤5:CPU中断标志位被置1(CPUIFRx=1),表明有一个CPU级中断等待被执行。
步骤6:如果CPU级中断被使能(CPU IERx=1、DBGIER BIT x=1),且全局中断屏蔽被清0(INTM=0),则CPU将去执行INTx服务子程序。
步骤7:CPU执行来自PIE级的中断后,自动完成现场保护,清除IER位,INTM位置1,并且清除EALLOW,然后准备执行中断服务子程序。
步骤8:CPU从PIE中调用相应的向量。
步骤9:对于复用中断,PIE模块用PIEIERx和PIEIFRx寄存器中的当前值去确定中断向量的地址。中断向量确定后,PIEIFRx.y被清零,CPU跳转到由从PIE取回的中断向量确定的服务程序入口地址执行。
表1 PIE中断向量表
| INTx.8 | INTx.7 | INTx.6 | INTx.5 | INTx.4 | INTx.3 | INTx.2 | INTx.1 |
INT1.y | WAKEINT | TINT0 | ADCINT | XINT2 | XINT1 |
| SEQ2IN | SEQ1INT |
INT2.y |
|
| EPWM6_TZINT | EPWM5_TZINT | EPWM4_TZINT | EPWM3_TZINT | EPWM2_TZINT | EPWM1_TZINT |
INT3.y |
|
| EPWM6_ INT | EPWM5_INT | EPWM4_INT | EPWM3_INT | EPWM2_INT | EPWM1_INT |
INT4.y |
|
| ECAP6_ INT | ECAP5_INT | ECAP4_INT | ECAP3_INT | ECAP2_INT | ECAP1_INT |
INT5.y |
|
|
|
|
|
| EQEP2_INT | EQEP1_INT |
INT6.y |
|
| MXINTA | MRINTA | MXINTB | MRINTB | SPITXINTA | SPIRXINTA |
INT7.y |
|
| DINTCH6 | DINTCH5 | DINTCH4 | DINTCH3 | DINTCH2 | DINTCH1 |
INT8.y |
|
| SCITXINTC | SCIRXINTC |
|
| I2CINT2A | I2CINT1A |
INT9.y | ECAN1INTB | ECAN0INTB | ECAN1INTA | ECAN0INTA | SCITXINTB | SCIRXINTB | SCITXINTA | SCIRXINTA |
INT10.y |
|
|
|
|
|
|
|
|
INT11.y |
|
|
|
|
|
|
|
|
INT12.y | LUF | LVF |
| XINT7 | XINT6 | XINT5 | XINT4 | XINT3 |
说明:空格是保留的。
三.正确使用PIE中断步骤:
步骤1:禁止全局中断(INTM=1)。
步骤2:清除PIEIER(x.y)位,禁止特定外设的中断,可以禁止一个或同一组的多个中断。
步骤3:等待5个周期,这个延时是保证向CPU发出任何中断都可以在CPU IFR寄存器中断标志。
步骤4:清除外设中断组中的CPU IFRx位,这是在CPUIFR寄存器的安全操作。
步骤5:清除外设中断中的PIEACKx位。
步骤6:使能全局中断(INTM=0)
联系客服