TI中文支持网
TI专业的中文技术问题搜集分享网站

28335中断配置优先级

至TI的老司机!

请问28335的中断优先级可以软件配置吗?

我在网上看到的帖子说在DSP281x_SWPrioritizedIsrLevels.h文件里可以改变外设的中断优先级,但我试了,貌似不成功!!!

mangui zhang:

不可设置   可以嵌套

至TI的老司机!

请问28335的中断优先级可以软件配置吗?

我在网上看到的帖子说在DSP281x_SWPrioritizedIsrLevels.h文件里可以改变外设的中断优先级,但我试了,貌似不成功!!!

z fang:

回复 mangui zhang:

我在工程中开了两个中断,一个timer0,另一个ePWM1的ePWM1_INT零点中断;

系统默认的中断优先级是timer0为5(周期1mS), ePWM1_INT的优先级为7(周期200uS),ePWM1_INT的中断会被timer0 的中断打乱;

我希望实现的是ePWM1_INT的中断处理过程不被timer0的中断打断,ePWM1_INT进中断的时间严格控制为200uS。(如果可以改变他们的优先级就很容易实现) 

中断嵌套应该不能实现目的吧?

谢谢!

至TI的老司机!

请问28335的中断优先级可以软件配置吗?

我在网上看到的帖子说在DSP281x_SWPrioritizedIsrLevels.h文件里可以改变外设的中断优先级,但我试了,貌似不成功!!!

10#:

回复 z fang:

默认情况下C28x的中断是不嵌套的,所以理论上不可能出现EPWM1的中断被Timer0打断的情况。

但是按照你的描述,有可能会出现这两个中断刚好同时触发,那么此时更高优先级的中断会响应,因此就可能出现EPWM1的中断需要等Timer0的中断执行完成以后才可能被响应,比如,假设它们完全同时计时,在EPWM1的第5个中断发生时,Timer0的中断也发生,就会出现这种情况。

如果是这种情况,那么建议让EPWM1先计数,然后才让Timer0计数,就会使它们的中断触发点错开,从而每次EPWM1的中断都能响应。

另一种办法是使用一个更低优先级的EPWM或者Timer来实现,比如没有使用到的EPWM5,或者Timer1和2,都能保证EPWM1被及时响应。

至TI的老司机!

请问28335的中断优先级可以软件配置吗?

我在网上看到的帖子说在DSP281x_SWPrioritizedIsrLevels.h文件里可以改变外设的中断优先级,但我试了,貌似不成功!!!

z fang:

回复 10#:

确实像您说的,下图中上面部分为ePWM1的零点中断响应,下边部分为timer0的中断响应,ePWM的中断响应很明显被延后了!

既然不能改,我就不去折腾了!!

至TI的老司机!

请问28335的中断优先级可以软件配置吗?

我在网上看到的帖子说在DSP281x_SWPrioritizedIsrLevels.h文件里可以改变外设的中断优先级,但我试了,貌似不成功!!!

Igor An:

回复 z fang:

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;”, 在出中断时再赋回去。

至TI的老司机!

请问28335的中断优先级可以软件配置吗?

我在网上看到的帖子说在DSP281x_SWPrioritizedIsrLevels.h文件里可以改变外设的中断优先级,但我试了,貌似不成功!!!

10#:

回复 z fang:

建议仍然是使用不同的EPWM或者Timer,中断优先级比EPWM1的。

@Igor,嵌套只能是高优先级的中断打断低优先级的,而现在他的问题是同时发生时,Timer0中断比EPWM1中断先响应了。

至TI的老司机!

请问28335的中断优先级可以软件配置吗?

我在网上看到的帖子说在DSP281x_SWPrioritizedIsrLevels.h文件里可以改变外设的中断优先级,但我试了,貌似不成功!!!

Igor An:

回复 10#:

恩,是的。

如果有可能,最好考虑是否能让两个中断发生的时刻错开,避免同时产生中断事件,实在避不开再考虑优先级排序及嵌套处理。

至TI的老司机!

请问28335的中断优先级可以软件配置吗?

我在网上看到的帖子说在DSP281x_SWPrioritizedIsrLevels.h文件里可以改变外设的中断优先级,但我试了,貌似不成功!!!

z fang:

回复 10#:

我重新改用了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;

}

至TI的老司机!

请问28335的中断优先级可以软件配置吗?

我在网上看到的帖子说在DSP281x_SWPrioritizedIsrLevels.h文件里可以改变外设的中断优先级,但我试了,貌似不成功!!!

z fang:

回复 10#:

哦!!

搞定,搞定……

谢谢!!

赞(0)
未经允许不得转载:TI中文支持网 » 28335中断配置优先级
分享到: 更多 (0)