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.

[参考译文] TMS320F280039:启用嵌套中断并更改组优先级

Guru**** 2393725 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1440693/tms320f280039-enable-nested-interrupt-and-change-group-priority

器件型号:TMS320F280039

工具与软件:

尊敬的 TI:

在我的应用程序中、我使用 Timer0中断和 CLB1中断、我的应用程序要求 CLB1中断的优先级高于 Timer0中断、并且在 Timer0 ISR 期间提供 CAN 中断。 我以 interrupt_ex3_sw_Prioritization 的示例为例、并经过 https://software-dl.ti.com/C2000/docs/c28x_interrupt_nesting/html/index.html 、但到目前为止它不起作用。 您能否建议如何配置以使 CLB1中断被嵌套并具有更高的优先级到 Timer0中断?

非常感谢。

我的无法正常工作的代码如下所示:

// Timer0 ISR - Lowwer priority
interrupt void INT_myCPUTIMER0_ISR(void)
{
    //
    // Save IER register on stack
    //
    volatile uint16_t tempPIEIER = HWREGH(PIECTRL_BASE + PIE_O_IER1);

    //
    // Set the global and group priority to allow CPU interrupts
    // with higher priority
    //

    IER |= M_INT5;
//    IER |= M_INT1;
    IER &= MINT5;
//    IER &= MINT1;

//    HWREGH(PIECTRL_BASE + PIE_O_IER1) &= MG1_7;
//    HWREGH(PIECTRL_BASE + PIE_O_IER1) &= MG5_5;
//    HWREGH(PIECTRL_BASE + PIE_O_IER5) &= MG5_5;

    //
    // Enable Interrupts
    //
    Interrupt_clearACKGroup(0xFFFFU);
    __asm("  NOP");
    EINT;

	// Execute ISR task
	// My code is here

    //
    // Disable interrupts and restore registers saved:
    //
    DINT;
    HWREGH(PIECTRL_BASE + PIE_O_IER1) = tempPIEIER;
}

__interrupt void INT_CLB1_ISR(void)
{
    //
    // Set the global priority to allow CPU interrupts with higher priority
    //
    IER &= MINT5;
    EINT;

    // CLB ISR task
    // My code is here

	CLB_clearInterruptTag(CLB1_BASE);
	Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP5);

    //
    // Disable Interrupts
    //
    DINT;
}

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

    尊敬的 Chanh:

    由于美国的关系、我在下周不能上班 S 节假日、但我返回后会查看您的代码。 很抱歉耽误你的时间。

    此致、

    Delaney

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

    尊敬的 Chanh:

    我对延误深表歉意;明天我将就此向你作出答复。

    此致、

    Delaney

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

    尊敬的 Chanh:

    您提到的两个中断在 ePIE 中具有以下优先级:

    定时器0:1.7

    CLB1:5.5.

    由于您只是切换两个不属于同一组的中断的优先级、所以应该没有必要更改 PIEIER 寄存器。 您可以为此执行以下步骤:

    1. 在 sw_prioritized_isr_levels.h 文件中、将 INT1PL 设置为最低优先级、将 INT5PL 设置为最高优先级、以生成正确的掩码:
    2. 在应该具有较低优先级的中断(计时器0 ISR)内部、使用 sw_interrupt_priority_logic.h 中的屏蔽来设置/清除 IER 寄存器的相应位 :  IER |= M_INT1; IER &= MINT1;
    3. 全局启用中断EINT;()
    4. 通过将所有1写入 PIEACK 寄存器(Interrupt_clearACKGroup(0xFFFFU);)来启用所有 PIE 中断组

    5. 等待一个周期(NOP;)
    6. 执行应用特定的代码
    7. 全局禁用中断DINT;()
    8. 清除当前组的 ACK

    您不需要 CLB1中断内部有任何特殊的嵌套代码、因为它将具有最高优先级并且正常运行。

    此致、

    Delaney

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

    尊敬的 Delaney:

    提供的解决方案正常工作。

    非常感谢您的支持。

    Chanh