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.

UART_1_RX采用edma的ping-pong模式接收数据,使用标准库里面的中断处理函数没有办法清除IPR,里面有配置代码



uart1_tx使用edma来发送数据,可以进中断,也可以清除IPR,但是同样的中断处理函数,只是UART1_RX的paRAM与串口发送的不一致,但是都是按照手册上PING-PONG的配置写的,在中断处理函数中就没有办法清除,自己的中断处理函数也挂接了,而且通过仿真器查看,收到的数据是错的,比如用hex方式发送20个a,收到的是20个07,用32位的hex显示的,下面是配置代码和中断处理函数代码,由于没有办法拷贝出代码,只能一句一句打上来:

EDMA3CCPaRAMEntry paramSet;

paramSet.srcAddr = (uint32)SOC_UART_1_REG;

paramSet.destAddr = (uint32)g_secret_addr_0;

paramSet,aCnt = 1;

paramSet,bCnt = 10;

paramSet,cCnt = 1;

paramSet,srcBIdx = 0;

paramSet,destBIdx = 1;

paramSet,srcCIdx = 0;

paramSet,destCIdx = 0;

/* RX_PAR_ID = 64 */
paramSet.linkAddr = (uint16)((RX_PAR_ID)*32);

paramSet.bCntReload = 10;

paramSet.opt |= ((EDMA3_CHA_UART1_RX << EDMA3CC_OPT_TCC_SHIFT) & EDMA3CC_OPT_TCC);

paramSet.opt |= (1 << EDMA3CC_OPT_TCINTEN_SHIFT);

EDMA3SetPaRAM(SOC_EDMA30CC_0_REGS, EDMA3_CHA_UART1_RX, &paramSet);

/* 配置PONG */

paramSet.destAddr = (uint32)g_secret_addr_1;

paramSet.linkAddr = (uint16)((RX_PAR_ID+1)*32);

EDMA3SetPaRAM(SOC_EDMA30CC_0_REGS, RX_PAR_ID, &paramSet);

/* 配置PING */

paramSet.destAddr = (uint32)g_secret_addr_0;

paramSet.linkAddr = (uint16)((RX_PAR_ID)*32);

EDMA3SetPaRAM(SOC_EDMA30CC_0_REGS, (RX_PAR_ID+1), &paramSet);

/* 中断处理函数 */
static void edma3ComplHandler(uint32 baseAdd, uint32 regionNum)
{
 volatitle uint32 pendingIrqs;
 volatitle uint32 isIPR = 0;
 uint32 index1;
 uint32 Cnt = 0;
 index1 = 1;
#ifdef _TMS320C6X
 IntEventClear(SYS_INT_EDMA3_0_CC0_INT1);
#else
 IntSystemStatusClear(SYS_INT_CCINT0);
#endif
 isIPR = HWREG(baseAdd + EDMA3CC_S_IPR(regionNum));
 if(isIPR)
 {
  while((Cnt < EDMA3CC_COMPL_HANDLER_RETRY_COUNT) &&(index1 != 0))
  {
   index1 = 0;
   pendingIrqs = HWREG(baseAdd + EDMA3CC_S_IPR(regionNum));
   while(pendingIrqs)
   {
    if((pendingIrqs & 1) == TURE)
    {
     HWREG(baseAdd + EDMA3CC_S_ICR(regionNum)) = (1 << index1);
     
     cb_Fxn[index1](index1, EDMA_XFER_COMPLETE);
    }
    ++index1;
    pendingIrqs >>= 1;
   }
   Cnt++;
  }
 }

}