在学习uart dma的时候,想让它一直收发,可是如果不把UDMASetupTransfer放在while(1)里面,就会一直回显停不下来,为什么每次运行都要UDMASetupTransfer才能正常呢? 可以只配置一次,来实现一直收发么?
主函数
while(1){
bRxDone = false;
//
// Setup DMA transfer for UART A0
//
UDMASetupTransfer(UDMA_CH8_UARTA0_RX,
UDMA_MODE_BASIC,
8,
UDMA_SIZE_8,
UDMA_ARB_2,
(void *)(UARTA0_BASE+UART_O_DR),
UDMA_SRC_INC_NONE,
(void *)ucTextBuff,
UDMA_DST_INC_8);
//
// Enable Rx DMA request from UART
//
MAP_UARTDMAEnable(UARTA0_BASE,UART_DMA_RX);
//
// Wait for RX to complete
//
while(!bRxDone)
{
}
//
// Setup DMA transfer for UART A0
//
UDMASetupTransfer(UDMA_CH9_UARTA0_TX,
UDMA_MODE_BASIC,
8,
UDMA_SIZE_8,
UDMA_ARB_2,
(void *)ucTextBuff,
UDMA_SRC_INC_8,
(void *)(UARTA0_BASE+UART_O_DR),
UDMA_DST_INC_NONE);
//
// Enable TX DMA request
//
MAP_UARTDMAEnable(UARTA0_BASE,UART_DMA_TX);
}
中断函数:
static void UARTIntHandler()
{
//
// Check if RX
//
if(!bRxDone)
{
//
// Disable UART RX DMA
//
MAP_UARTDMADisable(UARTA0_BASE,UART_DMA_RX);
//
// Siganl RX done
//
bRxDone = true;
}
else
{
//
// Disable UART TX DMA
//
MAP_UARTDMADisable(UARTA0_BASE,UART_DMA_TX);
}
//
// Clear the UART Interrupt
//
MAP_UARTIntClear(UARTA0_BASE,UART_INT_DMATX|UART_INT_DMARX);
}
还有一个问题就是中断函数里面的else为什么没有触发过? 不是在数据传输完毕之后触发么?
感谢解答!