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.

[参考译文] TMS320F280025:嵌套具有优先级的中断

Guru**** 2563960 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1033085/tms320f280025-nesting-interrupts-with-priority-levels

器件型号:TMS320F280025

您好!

根据此链接中提供的信息: https://software-dl.ti.com/C2000/docs/c28x_interrupt_nesting/html/index.html

我无法通过在  ISR 中设置 PIEIER 寄存器来启用 ISR 组之外的中断。 例如、如果我在 ADCA1 ISR 中、由于 EPWM1 PIEIER 位在组3中、因此无法使其具有比 ADCA1更高的优先级。

在文档中、它说我必须遵循 TRM 中的"禁用中断"部分。 您能提供有关这一点的更多信息吗? 我必须先禁用所有中断  

启用其他组中断? 如果我在设置 IER 位后刚刚设置所需中断的 PIEIER 位、该怎么办? 会发生什么情况?

谢谢、

Ahmed

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ahmed、

    您的查询已转发给专家、您将很快收到回复。

    此致、

    Veena

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ahmed、

    [引用 userid="467251" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1033085/tms320f280025-nesting-interrupts-with-priority-levels 文件]在该文档中、说明我必须遵循 TRM 中的"禁用中断"部分。 您能提供有关这一点的更多信息吗? 我必须先禁用 之前的所有中断

    PFB 根据 TRM 关于禁用中断的详细信息。 这样做主要是为了避免任何寄生中断。

    可以使用 PIEIERx 寄存器禁用各个中断、但必须小心以避免竞争
    条件。 如果一个中断信号在 PIEIER 写入完成时已经在传播、它可能会到达
    并触发伪中断条件。 为避免这种情况、请使用以下步骤:
    1.全局禁用中断(DINT 或 SETC INTM)。
    2.清除中断的 PIEIER 位。
    3、等待5个周期、以确保任何传播中断都已到达 CPU IFR 寄存器。
    4.清除中断 PIE 组的 CPU IFR 位。
    清除中断 PIE 组的 PIEACK 位。
    6.全局启用中断(EINT 或 CLRC INTM)。
    可以使用 CPU IER 寄存器禁用中断组。 这不能导致竞态条件、因此不能
    需要特殊程序。

    谢谢
    Vasudha

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Vashuda:

    感谢您的回答。 我了解 TRM 中的过程。 我的问题是、为什么我应该禁用中断。 例如、我位于 PIE 表中具有最高优先级的 ADCA1 ISR 中、但在我的应用中、EPWM1中断具有更高的优先级、但它位于 PIE 表的组3中。 因此、为了将 EPMW1优先于 ADCA1、我在 ADCA1 ISR 中嵌套中断的方式如下:

    IER |= M_INT3;
    IER &= M_INT3;

    //启用 PIE 中断组3  
    PieCtrlRegs.PIEIER3.bit.INTx1 = 1;

    //清除 ACK 以允许组3 INT
    PieCtrlRegs.PIEACK.bit.ACK3=1;

    根据我对 TI 链接中信息的理解、这不应在 ADCA1中完成、我应遵循 TRM 中的"禁用中断"。 我的问题是:上述方法有什么问题? 如果它可能导致伪中断、那么将 EPWM1中断优先于 ADCA1的正确过程是什么?

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ahmed、

    我认为上述应答中显示的代码片段可能仅适用于这2个中断、但中断嵌套链接中解释的逻辑显示了一种执行中断软件优先级划分的通用方法、并且可针对系统中的任何数量的中断进行扩展。

    例如、如果要在您的应用程序中添加更多来自组3的中断、如何使用上面显示的方法在同一组中断之间定义优先级。 使用上述方法、默认硬件优先级将用于在同一组中启用的中断。

    #if (G1_1PL != 0)
    __interrupt void ADCA1_ISR(void)     // ADC
    {
        // Set interrupt priority:
        volatile uint16_t TempPIEIER = PieCtrlRegs.PIEIER1.all;
        IER |= M_INT1;
        IER    &= MINT1;                         // Set "global" priority
        PieCtrlRegs.PIEIER1.all &= MG1_1;   // Set "group"  priority
        PieCtrlRegs.PIEACK.all = 0xFFFF;   // Enable PIE interrupts
        __asm("  NOP");
        EINT;
    
        //
        // Insert ISR Code here
        //
        for(i = 1; i <= 10; i++) {}
    
        //
        // Restore registers saved:
        //
        DINT;
        PieCtrlRegs.PIEIER1.all = TempPIEIER;
    
        //
        //  Add ISR to Trace
        //
        ISRTrace[ISRTraceIndex] = 0x0011;
        ISRTraceIndex++;
    
    }
    #endif

    在 TI 链接中显示的中断嵌套方法中、一般的想法是配置全局优先级、这样 只能使用宏 MINT1启用优先级高于当前中断组的组。 使用宏 M_INT1启用同一组、然后通过宏 MG1_1启用同一组较高优先级中断(启用所有优先级高于1.1中断的相同组中断)。

    请告诉我这是否解决了您的问题。

    谢谢
    Vasudha