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.

关于EDMA中IPR寄存器的使用问题



各位6678的专家们好:

      最近在调试EDMA相关的程序时,在查询它的IPR寄存器的时候遇到下面一个问题,还请专家们指教。我在代码中定义了下面的寄存器

    #define CHIP_LEVEL_REG  0x02620000

    #define KICK0   *(unsigned int*)(CHIP_LEVEL_REG + 0x0038)

    #define KICK1   *(unsigned int*)(CHIP_LEVEL_REG + 0x003C)

    #define KICK0_UNLOCK (0x83E70B13)

    #define KICK1_UNLOCK (0x95A4F1E0)

    #define KICK_LOCK    0

    #define E0IPR    *(unsigned int*)(0x02701068)  //用于查询传输是否完成  CC0 Global的IPR

    #define E0ICR    *(unsigned int*)(0x02701070)  //用于清除相应位            CC0 Global的ICR

 

    加入某个EDMA的传输完成码TCC设为2,我在程序轮询该EDMA是否完成时使用的是下面的语句

    while((E0IPR>>1)&0x1 != 1)

   {

     (" nop ");

   }

    但是在单步调试的时候却发现,这段代码并没有起作用,就是说即便此时IPR的值不为2,单步调试时也没有进入nop等待。想请教各位专家,该如何直接对IPR寄存器进行操作从而查询EDMA传输是否完成呢?

    谢谢!!!

     

  • 将IPR寄存器定义为volatile unsigned int *试试看,还有一个建议就是可以用相关的CSL获取EDMA instance寄存器地址,然后可以用CSL进行配置查询。

  • Andy 你好:

          我将寄存器的变量类型修改后还是不起作用,但是后来查询IPR的值我改用了

      do {      

     CSL_edma3GetHwStatus(hModule_Core0,CSL_EDMA3_QUERY_INTRPEND,&regionIntr_Core0);    

    } while (!(regionIntr_Core0.intr & 0x2));

        然后清除相应位则还是用KICK寄存器组,这样可以满足我的需求

       谢谢Andy!