至TI的老司机!
请问28335的中断优先级可以软件配置吗?
我在网上看到的帖子说在DSP281x_SWPrioritizedIsrLevels.h文件里可以改变外设的中断优先级,但我试了,貌似不成功!!!
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
默认情况下C28x的中断是不嵌套的,所以理论上不可能出现EPWM1的中断被Timer0打断的情况。
但是按照你的描述,有可能会出现这两个中断刚好同时触发,那么此时更高优先级的中断会响应,因此就可能出现EPWM1的中断需要等Timer0的中断执行完成以后才可能被响应,比如,假设它们完全同时计时,在EPWM1的第5个中断发生时,Timer0的中断也发生,就会出现这种情况。
如果是这种情况,那么建议让EPWM1先计数,然后才让Timer0计数,就会使它们的中断触发点错开,从而每次EPWM1的中断都能响应。
另一种办法是使用一个更低优先级的EPWM或者Timer来实现,比如没有使用到的EPWM5,或者Timer1和2,都能保证EPWM1被及时响应。
C2000的中断是可以通过软件实现嵌套,如下面例子:
interrupt mainISR(void)
{
volatile Uint16 TempPIEIER = PieCtrlRegs.PIEIER1.all;
IER |= M_INT1;
IER &= M_INT1;
PieCtrlRegs.PIEIER1.all &= 0x01; // Only allow ADCINT1 to interrupt
PieCtrlRegs.PIEACK.all = 0xFFFF;
EINT;
// User code begin
//……
//User code end
DINT;
AdcRegs.ADCINTFLGCLR.all = 0x2; //Clear interrupt flag;
PieCtrlRegs.PIEIER1.all = TempPIEIER;
}
在进中断服务函数后,立即把想要允许的中断源所在组的IER,PIEIER清除,即在中断函数内,专门赋值一个被允许的中断源配置。在这之前,用变量存储进中断之前的中断配置,即如例子中的第一句“volatile Uint16 TempPIEIER = PieCtrlRegs.PIEIER1.all;”, 在出中断时再赋回去。
我重新改用了timer1的中断,它的优先级比ePWM1_INT低,但做出来的效果是这样的:
图中A的波形是timer1产生的中断里拉高GPIO,延时了大概100uS再拉低(周期为1000uS);
图中B的波形是ePWM1_INT中断里将另一个GPIO脚拉高,延时150uS再拉低,从B的波形可以看出,1、2个脉冲产生的时间是没问题的,但第3个脉冲本该在箭头所指的时间就产生,但这一时刻timer1的中断处理还没结束,第三个脉冲等到了timer1的中断处理结束后才进入的;
问题是,为什么优先级更高的ePWM1_INT没有打断低优先级的timer1,而是等到它处理结束了才进中断?这是怎么回事呢?
后面附上两个中断的代码:
interrupt void EPWM1_INT_ISR(void) // EPWM-1
{
static unsigned int ePWMIntCunt = 0;
EPwm1Regs.ETCLR.bit.INT = 1;
IER |= M_INT3;
GpioDataRegs.GPADAT.bit.GPIO12 = 1;
ePWMIntCunt +=1;
DELAY_US(150);
GpioDataRegs.GPADAT.bit.GPIO12 = 0;
// To receive more interrupts from this PIE group, acknowledge this interrupt
PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}
interrupt void INT13_ISR(void) // INT13 or CPU-Timer1
{
int i = 1000;
// Insert ISR Code here
CpuTimer1.InterruptCount +=1;
GpioDataRegs.GPADAT.bit.GPIO13 = 1;
// DELAY_US(50);
while(i>0){
i--;
}
GpioDataRegs.GPADAT.bit.GPIO13 = 0;
}