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.

[参考译文] MCU-PLUS-SDK-AM263X:R5F 中没有中断矢量的 EDMA 中断

Guru**** 2585275 points
Other Parts Discussed in Thread: AM2634, MCU-PLUS-SDK-AM263X, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1159280/mcu-plus-sdk-am263x-edma-interrupts-without-interrupt-vector-in-r5f

器件型号:MCU-PLUS-SDK-AM263X
Thread 中讨论的其他部件:AM2634SysConfig

您好!

我想激活 Sitara AM2634上 EDMA 的"传输完成中断"以触发 PRU-CPU、而不是任何 R5F CPU。

为此、我使用了 SDK "MCU-PLUS-SDK-AM263X"中提供的"EDMA (中间)中断传输"示例。 我已确定这些代码用于触发中断:

EDMA_ccPaRAMEntry_init(&edmaParam);
// code removed for clarity
    edmaParam.opt          |=
        (EDMA_OPT_TCINTEN_MASK | EDMA_OPT_ITCINTEN_MASK |
         ((((uint32_t)tcc) << EDMA_OPT_TCC_SHIFT) & EDMA_OPT_TCC_MASK)); // enable interrupt in the PaRAM
         
 /* Register interrupt */
intrObj.tccNum = tcc;
intrObj.cbFxn  = &EDMA_regionIsrFxn;
intrObj.appData = (void *) &gEdmaTestDoneSem;
status = EDMA_registerIntr(gEdmaHandle[0], &intrObj);
DebugP_assert(status == SystemP_SUCCESS);

使用该代码、我能够以正确的 XBAR 配置触发 PRU 中断控制器中的事件32至48! 遗憾的是,每次触发中断时,函数 EDMA_regionIsrFxn()都会在运行示例的 R5F 处理器上执行。

因此,我尝试调查函数 EDMA_registerIntr()的作用,并避免在 R5F 中启用中断,我尝试了以下代码:

// get base objects of eDMA
baseAddr = EDMA_getBaseAddr(gEdmaHandle[0]);
regionId = EDMA_getRegionId(gEdmaHandle[0]);
tcc = EDMA_RESOURCE_ALLOC_ANY;

EDMA_ccPaRAMEntry_init(&edmaParam);
// code removed for clarity
    edmaParam.opt          |=
        (EDMA_OPT_TCINTEN_MASK | EDMA_OPT_ITCINTEN_MASK |
         ((((uint32_t)tcc) << EDMA_OPT_TCC_SHIFT) & EDMA_OPT_TCC_MASK)); // enable interrupt in the PaRAM
         
 /* enable interrupt */
EDMA_enableEvtIntrRegion(baseAddr, regionId, tcc);

遗憾的是、仅启用事件中断区域不会触发 SoC 级别的中断。 在不   在 R5F CPU 上执行 IRQ 例程的情况下、我是否错过了一些东西来激活"EDMA (中间)中断传输"?

感谢你的帮助。

BR、Nicolas

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

    您好、Nicolas、

    我将对此进行研究、并很快与您联系。

    此致、
    弗兰克

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

    您好、Nicolas、

    [引用 SDK"MCU-PLUS-SDK-AM263X"[/quot]中提供的 userid="504668" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1159280/mcu-plus-sdk-am263x-edma-interrupts-without-interrupt-vector-in-r5f ""EDMA (中间)中断传输"示例

    这是您用作起点的示例吗?  

    https://software-dl.ti.com/mcu-plus-sdk/esd/AM263X/08_04_00_17/exports/docs/api_guide_am263x/EXAMPLES_DRIVERS_EDMA_INTERRUPT_TRANSFER.html

    此致、
    弗兰克

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

    您好、Frank、

    感谢您查看我的问题。

    [引用 userid="16636" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1159280/mcu-plus-sdk-am263x-edma-interrupts-without-interrupt-vector-in-r5f/4359116 #4359116"]

    这是您用作起点的示例吗?  

    https://software-dl.ti.com/mcu-plus-sdk/esd/AM263X/08_04_00_17/exports/docs/api_guide_am263x/EXAMPLES_DRIVERS_EDMA_INTERRUPT_TRANSFER.html

    此致、

    [/报价]

    这确实是我的出发点。 该示例运行良好、但有缺点(在我的情况下)、即在 R5F CPU 0-0中触发中断。

    BR、Nicolas

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用具有正确 XBAR 配置的 userid="504668" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1159280/mcu-plus-sdk-am263x-edma-interrupts-without-interrupt-vector-in-r5f![/quot]

    我看到所有 EDMA 中断都通过 ICSS-M XBAR 路由到 ICSS-M INTC:

    • 全局传输完成中断
    • 区域传输完成中断:EDMA_TPCC_INT0 - EDMA_TPCC_INT7
    • 错误中断:EDMA_TPCC_ERRINT、EDMA_TPCC_MPINT、EDMA_TC0_ERRINT、EDMA_TC1_ERRINT

    对于 CSS_MII_RT_REG:MII_RT_EVENT_EN=0、ICSS-M INTC 系统事件32-47上提供中断。

    [引用 userid="504668" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1159280/mcu-plus-sdk-am263x-edma-interrupts-without-interrupt-vector-in-r5f "]但不在 R5F CPU 上执行 IRQ-routine?

    在 SysConfig 中、将 EDMA 的"启用中断"设置为 false、否则将在 R5F 上注册中断、如下所示:

    edma_interrupt_transfer()
        Drivers_open()
            Drivers_edmaOpen()
                EDMA_open()
                    if (prms->intrEnable == TRUE)
                        HW_WR_REG32(config->attrs->intrAggEnableAddr, config->attrs->intrAggEnableMask);
                        
                        HwiP_Params_init(&hwiPrms);
                        hwiPrms.intNum   = config->attrs->compIntrNumber;           // 72, R5FSS0_CORE0_INTR_TPCC0_INTAGGR
                        hwiPrms.callback = &EDMA_transferCompletionMasterIsrFxn;    // SDK EDMA driver internal
                        hwiPrms.args     = object->handle;
                        status = HwiP_construct(&object->hwiObj, &hwiPrms);
    

    EDMA_registerIntr ():

    • 将中断对象放置在由驱动程序维护的(双)链接的中断对象列表中。
      中断对象包含 TCC、回调数据指针和回调函数。
    • 调用 EDMA_enableEvtIntraRegion(),通过写入 IESR/IERSH 启用中断。

    当 EDMA 中断发生时,将调用 EDMA 驱动程序内部回调函数 EDMA_transferpleMasterIsrFxn(),通过浏览链接列表来确定已经完成的 EDMA 通道(由 TCC 确定)。 一旦确定了 TCC,就会调用相应的应用程序注册回调函数(此处为 EDMA_regionIsrFxn())。 这是调用堆栈:

    HwiP_irq_handler()                              // SDK IRQ handler
        HwiP_irq_handler_c()                        // SDK IRQ handler
            EDMA_transferCompletionMasterIsrFxn()   // SDK EDMA driver internal
                EDMA_regionIsrFxn()                 // application-registered callback function
    

    [引用 userid="504668" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1159280/mcu-plus-sdk-am263x-edma-interrupts-without-interrupt-vector-in-r5f "]仅启用事件中断区域不会触发 SoC 级别的中断

    您是如何确定的? 我认为您所做的事情没有任何根本错误。 您是否检查了 EDMA 寄存器 IPR/IPRH 以查看 EDMA 是否正在生成中断? ICSS INTC 寄存器如何?

    注意如果 R5不为 EDMA 提供服务,则 PRU 将需要这样做,有关详细信息,请参见 EDMA_transferCompleMasterIsrFxn()。

    此致、
    弗兰克

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

    您好、Frank、

    感谢您的回答。 我根据您的指示进行了进一步调查、现在这是可行的。 实际上、我的问题是 PRU 没有为 EDMA 的中断提供服务、因此不会产生新的中断。 我没有注意到、因为我启动 PRU 时、同时生成了大量副本。

    通过 EDMA 寄存器确认/复位中断 ICR/ICRH 已解决我的问题。 我(错误的)认为 EDMA "传输完成"中断不需要与 ePWM 类似的确认。

    BR、Nicolas