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.

[参考译文] AM2632:如何清除 ePWM 的挂起中断

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1439225/am2632-how-do-i-clear-pending-interrupts-for-epwm

器件型号:AM2632

工具与软件:

大家好、我已经设置了一个来自 ePWM 的中断、在递增计数时、该中断在计数器等于 CMPC 时触发。  我希望它生成一个中断、然后静默直到再次需要。

我尝试等待、直到需要中断来复位 锁存的 ePWM 中断(EPWMx_INT)状态标志。

但是、存在一个问题。  根据寄存器附录文档(spruj42c)表3-532、  

当时、最多可以挂起一个中断
ETFLG[INT]位仍被设置。 如果某个中断处于挂起状态、则不会处于挂起状态
生成、直到 ETFLG[INT]位被清除。

因此、一旦我清除了中断状态标志、中断就会再次触发 ISR。

我尝试使用 EPWM_disableInterrupt (CONFIG_EPWM3_BASE_ADDR);

但不管用。  是否有办法清除挂起的中断、以便在 ePWM 达到 CMPC 值之前清除状态标志后不会触发?

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

    Daniel、您好

    很抱歉响应延迟。

     ePWM_disableInterrupt()然后清除标志从技术上讲应该起作用。

    我已联系开发人员、了解该 API 的功能、并查看其是否正常工作。 我将尝试重现错误并在明天回复您。

    此致、
    Akshit

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

    您发现了什么?

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

    Daniel、您好

    我尝试通过以下方式修改 SDK 中的 epwm_hr_Duty_cycle 示例来重现此问题。

        while(numIsrCnt > 0)
        {
            /* Temporarily disable interrupts for a specific window */
            if(numIsrCnt == 9900) {
                /* Disable and clear interrupts at start of window */
                EPWM_disableInterrupt(gEpwmBaseAddr);
                EPWM_clearEventTriggerInterruptFlag(gEpwmBaseAddr);
                numIsrCnt--;
                continue;
            }
    
            /* Skip ISR processing during interrupt disabled window (9900-9800) */
            if(numIsrCnt > 9800 && numIsrCnt < 9900) {
                numIsrCnt--;
                continue;
            }
    
            /* Re-enable interrupts at end of window */
            if(numIsrCnt == 9799) {
                EPWM_enableInterrupt(gEpwmBaseAddr);
            }
    
            /* Normal interrupt processing */
            SemaphoreP_pend(&gEpwmSyncSemObject, SystemP_WAIT_FOREVER);
            numIsrCnt--;
        }

    • 一段时间后、我刚刚尝试禁用和启用中断。
    • 当计数器递增时、CMPC 产生中断
    • numIsrCnt 开始从10000开始递减。

    此场景正确执行并且所有任务均已传递。

    您能否分享一些有关您如何实施方案的详细信息、我将尝试重现该问题。

    同时,让我知道这是否有帮助!

    此致、
    Akshit

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

    我要做的是、在 CMPC = 10向上计数时、每100个周期左右触发一个中断。  当中断触发时、我会执行一个操作并禁用中断。  然后在大约100个周期后、我清除触发并启用中断。  

    我看到的是、只要我清除触发并启用中断、ISR 就会立即执行、而无需等待计数器达到 CMPC 向上计数。

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

    Daniel、您好

    你可以尝试一下这个项目,我正在复制一个类似的场景到你的,它似乎工作正常.

    e2e.ti.com/.../epwm_5F00_hr_5F00_duty_5F00_cycle_5F00_am263px_2D00_cc_5F00_r5fss0_2D00_0_5F00_nortos_5F00_ti_2D00_arm_2D00_clang.zip

    此致、
    Akshit