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.

[参考译文] MSPM0G3507:启用后立即触发中断

Guru**** 2460850 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1483449/mspm0g3507-interrupt-fires-instantly-when-enabled

器件型号:MSPM0G3507

工具与软件:

嗨、

我正在尝试将代码中的某些控制逻辑与 TIMA1的 CCD1事件同步。

那么、我将运行一个函数、在该函数中启用此中断:

static inline void load_test(uint32_t load_value)
{
    GPIOB->DOUTTGL31_0 = DL_GPIO_PIN_3;

    // insert control logic here.

    // Clear any previous IRQ, then enable.
    TIMA1->CPU_INT.IIDX;
    TIMA1->CPU_INT.IMASK = DL_TIMER_EVENT_CC1_DN_EVENT;
    
    GPIOB->DOUTTGL31_0 = DL_GPIO_PIN_3;
}

然后、在 ISR 中、我再次禁用中断:  

void TIMA1_IRQHandler()
{
    GPIOB->DOUTTGL31_0 = DL_GPIO_PIN_17;

    // Disable this IRQ
    TIMA1->CPU_INT.IIDX;
    TIMA1->CPU_INT.IMASK = 0;

    // Insert some control logic here.

    GPIOB->DOUTTGL31_0 = DL_GPIO_PIN_17;
}

在主代码中启用 NVIC:

NVIC_EnableIRQ (TIMA1_INT_IRQn);
问题在于、我可以看到、此中断会在启用后立即触发、而不会等待下一个 CCD1事件。
我不太明白为什么-我想它可能是挂起的中断、但我想它们可以通过读取 IIDX 寄存器来清除。
我尝试了相同的代码、但启用/禁用了 NVIC、但结果相同。
我缺少什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    >TIMA1->CPU_INT.IIDX;
    >TIMA1->CPU_INT.IMASK = DL_TIMER_EVENT_CC1_DN_EVENT;

    读取 IIDX 只会在中断(当前)已启用时清除中断;根据您的其他 片段、我怀疑它通常不会。 我建议改用:

    >TIMA1->CPU_INT.ICLR  = DL_TIMER_EVENT_CC1_DN_EVENT;  
    >TIMA1->CPU_INT.IMASK = DL_TIMER_EVENT_CC1_DN_EVENT;