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.

EDMA3无法进入completion code function



关于EDMA3的代码在附件,问题是EDMA3无法进入completion code function。

这个问题会不会与CIC0、CIC1、CIC2有关?

我只设置了CIC1片级中断事件,没有CIC0系统中断事件。

 

  • 您好,

    关于EDMA产生中断,首先需要确认EDMA channel产生了时间,通过IPR寄存器可以确认,相应的IPR如果都没有置位,请对照EDMA3 user guide手册中的编程指南确认EDMA3的配置正确。

    如果IPR已经置位,说明产生了中断事件,此时如果要相应中断服务函数,则需要配置相应的CIC,对于C667x来说,EDMA的global 中断事件是挂接输入到CIC0,所以需要配置CIC0将输入事件与CIC0的输出channel相对应;然后还需配置相应core的INTC,将CIC0输出到INTC的时间与相应的vecID相对应,最后再相应的vecID上挂接中断服务函数。

    下面给出使用CSL函数进行INCT及CIC配置的简单代码,相关的CSL函数请参考cls库,下面需要跟应用修改相关的CIC编号、CIC输入输出、INTC输入、及vecID编号、中断函数等。

    1. CIC0的配置:将EDMA3的中断事件与out channel映射作为INTC的输入,具体参考Chip interrupt controller user guide。

    CSL_CPINTC_RegsOvly   glbCpintcHnd[3];

    CSL_CPINTC_Handle hnd;

        /* open CPINTC0 to map the EDMA completetion ISR event to the host interrupt */
        hnd = CSL_CPINTC_open(0);
        if (hnd == 0)
        {
            printf ("Error: Unable to open CPINTC-1\n");
            return;
        }
        glbCpintcHnd[0] = (CSL_CPINTC_RegsOvly)hnd;
    //需要根据应用修改EDMA产生的时间编号及CPINTC输出channel号

        CSL_CPINTC_mapSystemIntrToChannel (hnd, CSL_INTC0_CPU_3_2_EDMACC_GINT, 8); 

        CSL_CPINTC_enableSysInterrupt (hnd, CSL_INTC0_CPU_3_2_EDMACC_GINT);
        CSL_CPINTC_enableHostInterrupt (hnd, 8);
        CSL_CPINTC_enableAllHostInterrupt(hnd);

    2. INTC的配置:即将INTC输入事件与vecID及ISR挂接。

    /* Intc variable declarartion */
    CSL_IntcObj      glbIntcObj;
    CSL_IntcHandle   glbHIntc;
    CSL_IntcEventHandlerRecord  glbEventHandler[8];
    CSL_IntcGlobalEnableState glbIntcState;

    interrupt void ISR_func();

    void IntcConfig(void)
    {
        CSL_IntcParam    vectId;
        CSL_IntcContext  context;
        //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
        //! GEM0 Intc Configuration              !//
        //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
        /* Setup the global Interrupt */
        context.numEvtEntries = 8;   
        context.eventhandlerRecord = glbEventHandler;
        CSL_intcInit(&context);
        /* Enable NMIs  */
        CSL_intcGlobalNmiEnable();
        /* Enable Global Interrupts  */
        CSL_intcGlobalEnable(&glbIntcState);
       
        /* VectorID for the Global Edma Event  */
        vectId = CSL_INTC_VECTID_4;
       
        /* Opening a handle for the ISR->EDMA Interrupt Event */                                      
        glbHIntc   = CSL_intcOpen(&glbIntcObj,
                                            CSL_GEM_INTC0_OUT_8_PLUS_16_MUL_N,
                                            &vectId,
                                            NULL);
        /* Hook the ISRs */
        CSL_intcHookIsr(vectId,  &ISR_func);
        /* Clear the Interrupt */
        CSL_intcHwControl(glbHIntc, CSL_INTC_CMD_EVTCLEAR,  NULL);
        /* Enable the Event & the interrupt */
        CSL_intcHwControl(glbHIntc, CSL_INTC_CMD_EVTENABLE,  NULL);

        return;
    }

  • 我可不可以这样理解: 首先由中断事件触发输入到CIC0,CIC0再映射到相应的channel进行EDMA的传输; EDMA的传输完成后产生事件,映射到VecID,VecID再挂接completion code function。

    1、那CSL_INTC0_CPU_3_2_EDMACC_GINT就是触发EDMA的中断事件,也即EDMA的synchronization event,也即CIC0的输入事件?

    2、那CSL_INTC0_CPU_3_2_EDMACC_GINT具体是一个事件?Global interrupt的简称?

    3、EDMA3_CC individual completion interrupt是在什么情况下用的?

    4、CIC0输出到INTC的事件与channel有没有特定的关系?

     5、channel可以在一定的范围内任意选择吗?

    6、CSL_GEM_INTC0_OUT_8_PLUS_16_MUL_N就是CIC0输出到INTC的事件?

    7、EDMA唯一的VecID是CSL_INTC_VECTID_4,VecID与completion code function挂接,那不同的EDMA传输要与多个completion code function挂接怎么办?

     

    另外

    // 将触发EDMA的中断事件挂接completion code function

    EdmaEventHook(CSL_EDMA3_CHA_UTXEVT, UartEDMASendUppcCompleted_INT);

     void HandleGPIO4RecUppc_INT( void *arg )

    {

    //使能相应EDMA通道传输,即触发EDMA

    CSL_edma3HwChannelControl( hChannel_uart_send,CSL_EDMA3_CMD_CHANNEL_SET,NULL);

    }

    8、这两个函数还要不要调用?

  • 与CIC0的输入映射的channel不是EDMA channel,是CIC0中的channel,建议你先看看中断控制器手册:http://www.ti.com/general/docs/lit/getliterature.tsp?literatureNumber=sprugw4a&fileType=pdf

    1. CSL_INTC0_CPU_3_2_EDMACC_GINT是EDMA完成中断事件,不是触发EDMA的中断事件,它是路由到CIC0,作为CIC0的输入;

    2. CIC0的输入与输出原则上是可以任意映射的,但是考虑到需要将CIC0的输出与INTC 的输入映射起来,所以需要根据应用选择,不能随意;

    3. CSL_GEM_INTC0_OUT_8_PLUS_16_MUL_N是CIC0输出到INTC的事件,即CIC0的输出事件8作为INTC的输入;

    4. 中断事件可与vecID4~15任意挂接,对于多个channel时需要根据IPR区分对应产生中断的channel号,请阅读EDMA手册中关于中断的处理;

    5. 你说的函数不需要调用,只需要按照我上述给出的方式配置CIC及INTC即可。

    关于CIC的输入与输出,及INTC的输入事件编号及映射关系,请阅读相应的器件手册中的中断一节。