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.

TMS320F280039C: 急急急!!!280039C:TIMER0与TIMER1中断嵌套问题

Part Number: TMS320F280039C


https://software-dl.ti.com/C2000/docs/c28x_interrupt_nesting/html/index.html

参考上述链接中的中断嵌套实例完成下述代码;

目标:TIMER0的15k中断稳定触发,不能有超过1us的延时

问题:由于中断不能被打断,因此使用中断嵌套,在timer1中完成下述代码,以使得timer0可以打断timer1中断优先执行。。。但在我多次测试中发现,我代码运行了40多分钟,出现timer0中断依旧延时问题,延时时间等于timer1中断所执行的时间,,那意味着这个中断嵌套并未完全解决问题,还存在错误情况。。。请问我该怎么做

备注:我的项目仅使能timer0与timer1中断,timer2仅用于计数使用,未使能中断,,其余外设也未使能中断,仅存在EPWM触发ADC SOC,ADC EOC触发DMA搬运数据而已

interrupt void  Timer1_ISR(void)
{
uint16 tempPIEIER1;
tempPIEIER1 = PieCtrlRegs.PIEIER1.all;
IER |= M_INT1;  
IER &= M_INT1;
PieCtrlRegs.PIEIER1.bit.INTx7 &= 0x1;
PieCtrlRegs.PIEACK.all = 0xFFFF; 
asm("       NOP");   
 EINT;
 
 // ISR code
 
 DINT;
 PieCtrlRegs.PIEIER1.all = tempPIEIER1;
}

  • 不好意思,还有CAN与sci_RX中断。

  • 您好

    在您的项目中,您希望TIMER0的中断能够高优先级地打断TIMER1的中断,以确保TIMER0的15kHz中断响应延时不超过1μs。然而,您发现即使使用了中断嵌套,TIMER0的中断仍然会受到TIMER1中断执行时间的影响,导致延时。这种情况可能是由于中断优先级设置、中断嵌套处理不当或中断服务程序(ISR)执行时间过长等原因造成的。

    以下是一些建议,帮助您解决这个问题:

    1. 确认中断优先级

      • 确保TIMER0的中断优先级高于TIMER1的中断优先级。在TMS320F280039C的Delfino F280x系列DSP中,您可以通过设置中断控制器(INTC)的中断优先级寄存器来配置中断优先级。
      • 检查并确认没有其他中断(如EPWM、ADC等)的优先级高于或等同于TIMER0,这可能会干扰TIMER0的中断响应。
    2. 优化中断服务程序(ISR)

      • 确保TIMER1的ISR执行时间尽可能短,以减少它对TIMER0中断响应的延迟。优化ISR中的代码,去除不必要的操作,尽量使用高效的数据处理算法。
      • 如果TIMER1的ISR需要执行较长时间的任务,考虑将任务分解为多个较小的部分,并在ISR之间使用任务调度或状态机来管理。
    3. 使用中断嵌套和中断屏蔽

      • 在进入TIMER1的ISR时,立即屏蔽TIMER0的中断是不合适的,因为您希望TIMER0能够打断TIMER1。相反,您应该确保在TIMER1的ISR执行过程中,TIMER0的中断能够被正确识别和响应。
      • 检查您的中断屏蔽和使能逻辑,确保在TIMER1的ISR中不会无意中屏蔽了TIMER0的中断。
    4. 检查硬件和时钟配置

      • 确保DSP的时钟配置正确,以满足TIMER0和TIMER1的中断频率和响应时间要求。
      • 检查是否有任何硬件问题或时钟域冲突可能导致中断响应延迟。
    5. 使用实时分析工具

      • 使用DSP开发工具中的实时分析工具(如Code Composer Studio中的实时调试功能)来监测中断的响应时间和执行情况。
      • 通过设置断点、观察点和性能计数器来定位可能的中断响应延迟来源。
    6. 考虑使用硬件定时器特性

      • 检查TMS320F280039C的定时器模块是否有任何特定的硬件特性或模式可以帮助您实现更精确的中断响应,例如预分频器、定时器链或中断优先级管理。

    关于细节配置内容您分享的文件有详细说明,请结合TRM以及上述说明针对于您的实际项目情况做针对性的配置。

  • 1. 中断优先级使用默认,并未手动配置过,根据手册TIMER0为INT1.7,TIMER1为INT13,可以确定TIMER0优先级高于TIMER1;

    2. TIMER1中断执行时间为5us,较短。

    3. 关于这一条,我该怎么修改我的代码,确保在TIMER1的ISR执行过程中,TIMER0的中断能够被正确识别和响应。

    4. 时钟已确认过,无问题。

    备注:15k中断周期为66.7us,有问题的脉冲周期为72us,那么下一个脉冲就为62us,,总两个脉冲的周期为66.7*2us

  • 您好

    请您参考一下流程。

    步骤 1:设置全局优先级:

    • 修改 IER 寄存器以允许具有更高用户优先级的 CPU 中断得到服务。

    • 注意:此时IER已经保存在堆栈中。

    步骤 2:设置群组优先级:(可选)

    • 修改适当的 PIEIERx 寄存器以允许具有更高用户设置优先级的组中断得到服务。

    • 请勿从除此 ISR 所服务的组以外的其他组中清除 PIEIER 寄存器位。这样做可能会导致发生错误中断。

    步骤 3:启用中断:

    • 完成此操作有三个步骤:

      1. 清除 PIEACK 位

      2. 等待至少一个周期

      3. 清除 INTM 位。使用汇编语句 asm(” CLRC INTM”); 或 TI 示例使用 #define EINT asm(” CLRC INTM”)

    步骤4

    运行 ISR 的主要部分

    步骤5

    设置 INTM 以禁用中断。使用 asm(” SETC INTM”); 或 TI 示例使用 #define DINT asm(” SETC INTM”)

    第 6 步

    恢复 PIEIERx(可选,取决于步骤 2)

    步骤 7:从 ISR 返回

    • 这将自动恢复 INTM 和 IER。

    或者

    在中断服务程序中,可以通过软件更改全局和组优先级,以允许处理其他中断。步骤与之前所述相同。唯一的区别是 IER 和 PIEIERx 的掩码值已在 DSP28_SWPrioritizedIsrLevels.h 文件中管理。

    步骤 1:设置全局优先级
    • 修改 IER 以允许来自与当前 ISR 相同的 PIE 组的 CPU 中断。

    • 修改 IER 以允许具有更高用户定义优先级的 CPU 中断得到服务。

    步骤 2:设置群组优先级
    • 将当前 PIEIERx 值保存到临时寄存器。

    • 然后设置 PIEIER 寄存器以允许服务 PIE 组内具有更高优先级的中断。

    步骤 3:启用中断
    • 这需要 3 个步骤:

      1. 通过向 PIEACK 寄存器写入全 1 来启用所有 PIE 中断组

      2. 等待至少一个周期

      3. 通过清除 INTM 来启用全局中断

    步骤 4:执行 ISR。

    在步骤 1-3 中启用的中断(具有较高软件优先级的中断)将被允许中断当前 ISR,从而首先得到服务。

    步骤5

    禁用中断

    第 6 步

    恢复PIEIERx寄存器

    步骤7

    出口