学习官方uart dma例程的一点疑问
在学习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为什么没有触发过? 不是在数据传输完毕之后触发么?
感谢解答!
建议参考uart_dma的例程测试,同时关于uDMA的一些简单解释
DMA传输模式
基本模式用于外设和存储器之间DMA传输;自动模式用于存储器和存储器之间软件DMA传输;
乒乓模式用于外设和存储器之间的连续DMA传输,乒乓模式需要主和备用两个通道控制,
系统使用主和备用两个通道控制交替进行DMA传输;
分集模式包括存储和外设分集模式,分集模式将两个及两个以上数据块利用DMA传输到一个数据块或外设
//*****************************************************************************
#define UDMA_MODE_STOP 0x00000000
#define UDMA_MODE_BASIC 0x00000001
#define UDMA_MODE_AUTO 0x00000002
#define UDMA_MODE_PINGPONG 0x00000003
#define UDMA_MODE_MEM_SCATTER_GATHER \
0x00000004
#define UDMA_MODE_PER_SCATTER_GATHER \
0x00000006
#define UDMA_MODE_ALT_SELECT 0x00000001
这个就是基于uart dma的例程 几乎没有变动,只是加了一个while(1)