在学习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为什么没有触发过? 不是在数据传输完毕之后触发么?
感谢解答!
Terry Han:
建议参考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
苜蓿草:
回复 Terry Han:
这个就是基于uart dma的例程 几乎没有变动,只是加了一个while(1)
TI中文支持网


